2024 год стал еще одним удивительным годом для CSS!

2024 год стал еще одним удивительным годом для CSS!
2024 год стал еще одним удивительным годом для CSS!

Переходы между документами и анимация при прокрутке позволяют добавить больше интерактивности в ваши приложения с помощью нескольких строк CSS. Теперь вы можете анимировать height: auto;, стилизовать полосы прокрутки и изменять размер текстовых полей в соответствии с их содержимым.

Многие функции стали базовыми и доступными в этом году благодаря эксклюзивным аккордеонам, всплывающим окнам @property и @starting-style — все они совместимы с основными браузерами.

Благодаря упорному труду разработчиков браузеров, авторов спецификаций и вкладу сообщества CSS в этом году совершил ещё один большой скачок вперёд.

Компоненты

Определение размера поля field-sizing

Без field-sizing для создания поля ввода с размером содержимого вам пришлось бы либо угадывать средний размер текстового поля, либо использовать JavaScript для подсчёта символов и увеличения высоты или ширины элемента по мере ввода текста пользователем. Теперь это можно сделать с помощью одной строки CSS.

textarea, select, input {
  field-sizing: content;
}

В следующей демонстрации показано, как ведут себя входные данные без field-sizing и с field-sizing.

Это будет работать для любого шрифта, любого размера шрифта, любого языка и любого режима письма. То, что раньше требовало больших усилий, теперь будет требовать меньших усилий.

Анимация по высоте: автоматическаяheight: auto

Часто запрашиваемая функция CSS — это возможность анимировать до height: auto. Небольшая вариация этого запроса — переход к свойству ширины вместо высоты или переход к любому из других встроенных размеров, обозначаемых ключевыми словами min-content, max-content, и fit-content.

Начиная с Chrome 129 вы можете использовать свойство interpolate-size или функцию calc-size() для включения плавных переходов и анимации от длины к ключевым словам внутреннего размера и обратно.

Демонстрация CSS interpolate-size

Самый простой способ включить это поведение — сделать так, чтобы вся страница была настроена на него, объявив interpolate-size: allow-keywords в :root.

/* Opt-in the whole page to animating to/from intrinsic sizing keywords */
:root {
    interpolate-size: allow-keywords; /* 

В большинстве случаев использования interpolate-size должно быть достаточно. Если вам нужен больший контроль над чем-то, например, для выполнения вычислений с полученным значением в пикселях или для перехода между двумя ключевыми словами для определения размера, используйте calc-size() вместо этого.

Эксклюзив <details>

Распространённым шаблоном пользовательского интерфейса в интернете является компонент «гармошка». Этот компонент состоит из нескольких раскрывающихся виджетов, которые можно по отдельности развернуть (или свернуть), чтобы показать (или скрыть) их содержимое.

Этот шаблон можно создать в Интернете с помощью нескольких <details> элементов. Обычно они группируются визуально, чтобы показать, что они относятся к одной категории.

Чтобы создать эксклюзивную раскладку, добавьте атрибут name к элементам <details>. При использовании этого атрибута несколько элементов <details>, имеющих одинаковое значение имени, образуют семантическую группу. При открытии одного из элементов <details>, входящих в группу, ранее открытый элемент автоматически закроется.

<details name="learn-css">
  <summary>Welcome to Learn CSS!</summary>
  <p>…</p>
</details>
<details name="learn-css">
  <summary>Box Model</summary>
  <p>…</p>
</details>
<details name="learn-css">
  <summary>Selectors</summary>
  <p>…</p>
</details>
Эксклюзивная демо-версия Аккордеона

Настраиваемый стиль <details>

В Chrome 131 у вас появилось больше возможностей для оформления структуры элементов <details> и <summary>. Теперь вы можете использовать эти элементы при создании раскрывающихся или аккордеонных виджетов.

В частности, изменения, внесённые в Chrome 131, позволяют использовать свойство `display` для этих элементов и добавляют псевдоэлемент ::details-content для оформления расширяющейся и сворачивающейся части.

Например, чтобы создать горизонтальный аккордеон, примените к каждому элементу <details> гибкий макет, который будет располагаться в направлении строки.

details {
  display: flex;
  flex-direction: row;
}
Демонстрация: горизонтальный аккордеон

Помимо использования большего количества типов отображения, содержимое элемента <details> автоматически оборачивается в псевдоэлемент ::details-content . Все дочерние элементы элемента <details> , кроме <summary> , помещаются в этот псевдоэлемент.

Вы можете использовать этот псевдоэлемент для управления частью раскрывающегося элемента, которая расширяется и сворачивается.

Демонстрация: аккордеон Material UI

Позиционирование якоря position-anchor

Привязка — это новый декларативный способ позиционирования элементов относительно друг друга. Он идеально подходит для меню, подсказок, выборок, меток, карточек, диалоговых окон настроек и многого другого. Благодаря встроенному в браузер позиционированию по привязке вы можете создавать многоуровневые пользовательские интерфейсы, не полагаясь на сторонние библиотеки.

Для создания привязки требуются два элемента: привязка и позиционируемый элемент (элементы).

Якорь — это элемент, к которому ориентируются позиционируемые элементы. Превратите элемент в якорь с помощью одной строки CSS:

.anchor {
  anchor-name: --over-easy;
}

Позиционируемые элементы — это элементы, которые позиционируются относительно якорного элемента. Они указывают на якорный элемент, относительно которого они должны быть позиционированы, с помощью position-anchor и второй строки CSS, чтобы указать сторону или область, в которой они должны быть расположены.

.positioned-element {
  position: fixed;
  position-anchor: --over-easy;
  position-area: block-end;
}

В следующем примере милое яйцо является якорем, а текст «Слишком просто» — позиционируемым элементом.

Свойство position-area предлагает множество вариантов! В демонстрации используется логическое значение свойства block-end, но есть также center, button и множество других вариантов. Una создала графический интерфейс, который поможет вам визуализировать варианты:

Взаимодействия

Пользовательские полосы прокрутки ::-webkit-scrollbar

Стилизовать полосы прокрутки уже давно можно с помощью ::-webkit-scrollbar-* псевдоэлементов. Этот подход отлично работает в Chrome и Safari, но так и не был стандартизирован рабочей группой CSS.

В Chrome 121 доступны свойства scrollbar-width и scrollbar-color для настройки ширины и, соответственно, цвета полосы прокрутки.

.scroller {
  scrollbar-color: hotpink blue;
  scrollbar-width: 10%;
}

Эти свойства также поддерживаются Firefox и частично поддерживаются Safari.

Демонстрация пользовательских полос прокрутки. Используйте поля ввода цвета для изменения цветов.

Переходы между видами документов

В 2023 году Chrome стал первым браузером, в котором появились переходы между представлениями одного документа. Это интересное дополнение к веб-платформе, которое позволяет создавать плавные переходы между различными представлениями вашего сайта. В этом году Chrome продолжил развивать веб-платформу, добавив в Chrome 126 переходы между представлениями разных документов.

Переходы между представлениями в разных документах позволяют запускать переход между представлениями в двух отдельных документах. В результате вам больше не нужно перестраивать свой веб-сайт как одностраничное приложение, чтобы использовать переходы между представлениями. Все, что вам нужно, — это переход с одной страницы на другую, основной примитив, который делает веб-сайт «веб-сайтом».

Запись демонстрации «Stack Navigator», в которой используются переходы между документами

Чтобы переход между двумя страницами был возможен, необходимо выполнить два условия: навигация должна быть одноуровневой, и обе страницы должны быть настроены на переход между страницами. Настройка выполняется с помощью следующего правила CSS:

@view-transition {
  navigation: auto;
}

После включения, переходы между представлениями в разных документах используют те же строительные блоки, что и переходы между представлениями в одном документе: добавьте свойство view-transition-name к элементам, которые вы хотите отобразить, и анимация будет работать на основе CSS-анимации.

Помимо поддержки переходов между представлениями в разных документах, Chrome также добавил несколько дополнительных функций для более удобной работы с переходами между представлениями, например view-transition-class.

Анимация, управляемая прокруткой

Анимация, управляемая прокруткой, является распространённым шаблоном UX в интернете. Анимация, управляемая прокруткой, связана с положением прокрутки в контейнере прокрутки. Это означает, что при прокрутке вверх или вниз связанная с ней анимация перемещается вперёд или назад в соответствии с реакцией.

В следующей демонстрации, если ваш браузер поддерживает CSS-анимацию при прокрутке, изображения будут разворачиваться по мере прокрутки. Смотреть ДЕМОНСТРАЦИЮ

События прокрутки привязки

Встроенные события привязки сделали ранее невидимые моменты во время прокрутки видимыми в нужный момент и всегда правильными. Они являются недостающим элементом головоломки, который делает привязку прокрутки полноценным решением.

Два новых события snap: scrollsnapchange и scrollsnapchanging.

scroller.addEventListener('scrollsnapchange', event=> {
    console.log(event.snapTargetBlock);
    console.log(event.snapTargetInline);
  })

Событие scrollsnapchange срабатывает в тот же момент, что и scrollend, когда прокрутка останавливается и пользователь перестаёт взаимодействовать со скроллером.

scrollsnapchangingСобытие готово к запуску и вызывает обратный вызов в тот момент, когда у скроллера появляется новая цель привязки. Это полезно для мгновенной обратной связи по UX, предоставляя механизм немедленного визуального обновления в зависимости от взаимодействия пользователя.

scroller.addEventListener('scrollsnapchanging', event=> {
    console.log(event.snapTargetBlock);
    console.log(event.snapTargetInline);
  })

Объединив эти события, вы сможете создать удобный интерфейс для выбора элементов с помощью жеста прокрутки. Следующая линейка отмеряет значения в четвертях дюйма и использует анимацию при прокрутке для выделения выбранного значения. Событие scrollsnapchanging используется для немедленного обновления значения в поле ввода, а событие scrollsnapchange используется для поддержки и подтверждения выбранного значения.

Опыт разработчика

Наследование фона ::backdrop

Исторически сложилось так, что ::backdrop псевдоэлемент ниоткуда не наследовался. Начиная с Chrome 122, этот ::backdrop псевдоэлемент был преобразован в элемент, зависящий от дерева, что означает, что он наследует все наследуемые свойства от своего родительского элемента.

Благодаря этому изменению можно переопределять значения пользовательских свойств для определённых элементов, и ::backdrop будет иметь к ним доступ. Например, ::backdrop связанный с открытым <dialog> элементом, теперь может получить доступ к пользовательским свойствам, доступным в этом <dialog>.


light-dark()

Системные цвета в CSS могут реагировать на текущее используемое значение color-scheme . Например, если вы укажете color: CanvasText в правиле CSS, цвет соответствующих элементов будет светлым или тёмным в зависимости от значения color-scheme .

В следующем примере используйте раскрывающийся список для управления color-schemediv. Поскольку div оформлен в системных цветах, он поддерживает как светлые, так и тёмные стили.

Демонстрация системы цветов

Функция light-dark() предоставляет разработчикам такую же возможность. Эта функция принимает два аргумента, оба из которых должны быть <color>.

:root {
  color-scheme: light dark;
  --primary-color: light-dark(#333, #fafafa);
  --primary-background: light-dark(#e4e4e4, #121212);
  --highlight-color: light-dark(hotpink, lime);
}

При изменении значения color-scheme используется либо первое, либо второе значение light-dark() .

  • Если используемая цветовая схема light или неизвестна, то возвращается вычисленное значение первого значения.
  • Если используется цветовая схема dark, то возвращается вычисленное значение второго цвета.
ДЕМОНСТРАЦИЯ. Изменение выделенного значения приводит к изменению color-scheme значения

@property

2024 год ознаменовался тем, что @property наконец-то стал базовым, доступным с самого начала. Поддержка @property в разных браузерах — это очень важная веха, поскольку с помощью @property и его CSS.registerProperty аналога вы можете регистрировать пользовательские свойства определённого типа, управлять их наследованием и задавать им начальное значение.

@property --myColor {
  syntax: '<color>';
  inherits: false;
  initial-value: hotpink;
}

Регистрируя пользовательское свойство определённого типа, браузер знает, как интерполировать его значения при использовании в переходах и анимациях.

При анимации пользовательского свойства ваш CSS становится более лаконичным и удобным для чтения, как показано в следующем фрагменте, в котором свойство --angle анимируется от 0deg до 360deg.

@property --angle {
  syntax: '<angle>';
  initial-value: 0deg;
  inherits: false;
}

@keyframes adjust-angle {
  to {
    --angle: 360deg;
  }
}

div {
  --angle: 0deg;
  animation: 10s adjust-angle linear infinite;
  rotate: var(--angle);
}
Демонстрация с вращающейся градиентной рамкой

Всплывающий API

Popover API предоставляет способы создания многоуровневых интерфейсов, таких как всплывающие подсказки, меню, обучающие интерфейсы и многое другое.

Чтобы создать всплывающее окно со значениями по умолчанию, вам понадобится button для запуска всплывающего окна и элемент, который будет всплывающим окном.

<button popovertarget="my-popover">Open Popover</button>

<div id="my-popover" popover>
  <p><p>I am a popover with more information. Hit <kbd>esc</kbd> or click away to close me.<p></p>
</div>
Простая всплывающая демонстрация

Всплывающие окна имеют встроенную поддержку для продвижения верхнего слоя, функцию быстрого закрытия, управление фокусом по умолчанию и специальные возможности.

Эффекты ввода с помощью @starting-style

Правило @starting-style используется для определения стилей элемента до того, как он получит первое обновление стиля. При настройке этих целевых свойств для перехода с помощью CSS-переходов вы можете использовать эти начальные стили для создания эффектов входа.

В следующем примере вновь добавленные элементы <div> затухают от yellow до исходного цвета фона, который является прозрачным.

div {
  transition: background-color 0.5s;
  background-color: transparent;

  @starting-style {
    background-color: yellow;
  }
}

Другой вариант использования - анимация диалоговых окон при открытии.

dialog[open] {
  opacity: 1;
  transform: scaleX(1);

  @starting-style {
    opacity: 0;
    transform: scaleX(0);
  }
}

Не забудьте установить transition-behavior на allow-discrete при анимации дискретно анимируемых свойств, таких как display.

paint-order

При использовании text-stroke свойство paint-order может управлять порядком наложения или отображения заливки текста и обводки. Это может быть полезно, если вы хотите, чтобы обводка отображалась поверх заливки.

Порядок рисования по умолчанию такой: fill, stroke, затем markers.

На следующем видео показано, что результат обводки текста нежелателен, если текст сначала заливается белым цветом, а затем обводится чёрным. Если сначала обвести текст, а затем залить его, результат будет намного лучше!

CSS-код для управления этим — одна строка. Задайте paint-order для рисования обводки перед заливкой, указав эти ключевые слова в указанном порядке.

h1 {
  paint-order: stroke fill;

  color: white;
  -webkit-text-stroke: 5px black;
}

Попробуйте сами в этом CodePen:

Некоторые люди говорят, что возможность управлять paint-order наконец-то сделала text-stroke пригодным для использования в производстве. Что вы об этом думаете?

Вложенные объявления CSSOM

Чтобы исправить некоторые странные ошибки, связанные с вложенностью CSS, в спецификацию вложенности CSS был добавлен интерфейс CSSNestedDeclarations. С его помощью объявления, которые следуют за правилами стиля, больше не сдвигаются вверх.

Это означает, что следующий фрагмент CSS-кода придаёт элементу .foo цвет фона green вместо red цвета, который был бы без CSSNestedDeclarations.

.foo {
    width: fit-content;

    @media screen {
        background-color: red;
    }
    
    background-color: green;
}

С помощью CSSNestedDeclarations правило CSS преобразуется в следующее, сохраняя объявление background-color: green в исходном положении:

↳ CSSStyleRule
  .type = STYLE_RULE
  .selectorText = ".foo"
  .resolvedSelectorText = ".foo"
  .specificity = (0,1,0)
  .style (CSSStyleDeclaration, 1) =
    - width: fit-content
  .cssRules (CSSRuleList, 2) =
    ↳ CSSMediaRule
    .type = MEDIA_RULE
    .cssRules (CSSRuleList, 1) =
      ↳ CSSNestedDeclarations
        .style (CSSStyleDeclaration, 1) =
          - background-color: red
    ↳ CSSNestedDeclarations
    .style (CSSStyleDeclaration, 1) =
      - background-color: green

Это дополнение появилось в Chrome 130 и дополняет более ранние изменения, которые упростили разбор вложенных стилей.

Информация, использованная в статье, взята с сайта команды разработчиков Chrome DevRel.

Более подробно о новых возможностях в CSS читайте в источнике.

Понравилась статья?
Будем признательны, если поделитесь в соцсетях или мессенджерах, а также присоединитесь к нашей группе Вконтакте. Будет интересно!

Другие статьи по теме:

HOSTCMS v.6. Боковое выпадающее меню на CSS для каталога товаров
HOSTCMS v.6. Боковое выпадающее меню на CSS для каталога товаров

Создадим раздвижное меню для каталога товаров с несколькими уровнями вложенности разделов. Меню будет открыто в основных разделах, лежащих в корневом каталоге. В принципе, вам нужно просто скопировать шаблон, CSS стили и пользоваться этим меню...

Фоновая волна на простом CSS
Фоновая волна на простом CSS

Рассмотрим в этой статье, как сделать фоновые волны на сайте, используя только возможности CSS3 и SVG файл. Т.е. без применения Javascript.

Устаревший HTML код
Устаревший HTML код

HTML является одним из основополагающих строительных блоков Интернета. Но так же, как и методы веб-дизайна меняются со временем, также меняется и код, который мы используем. По мере развития HTML какая-то часть его старой разметки устарела, а какая-то была перепрофилирована...

Имитация стрелочных часов с помощью новых тригонометрических функций CSS sin() и cos ()
Имитация стрелочных часов с помощью новых тригонометрических функций CSS sin() и cos ()
Тригонометрические функции CSS есть в последних версиях Firefox и Safari. Наличие такого рода математической мощи в CSS открывает целую кучу возможностей. В этом материале мы применим пару новых функций: sin()и cos().
4 свойства сетки CSS для большинства ваших потребностей в макетировании
4 свойства сетки CSS для большинства ваших потребностей в макетировании
CSS Grid предоставляет нам мощную систему верстки для веб-сайтов. То, что мы собираемся сделать сейчас, - это обратный подход, чтобы показать вам наименьший возможный набор свойств сетки, которые вам нужно знать, чтобы удовлетворить большинство ваших потребностей в макете.
Как создать пользовательский ползунок диапазона с помощью CSS
Как создать пользовательский ползунок диапазона с помощью CSS

Ползунки диапазона (<input type="range">) позволяют пользователям выбирать значение в пределах заданного диапазона, предоставляя альтернативные типы ввода, такие как <input type="number">.

Мы используем cookie-файлы, чтобы получить статистику, которая помогает нам обеспечивать вас лучшим контентом. Вы можете прочитать подробнее о cookie-файлах или изменить настройки браузера. Отключение cookie-файлов может привести к неполадкам в работе сайта. Продолжая пользоваться сайтом без изменения настроек, вы даете согласие на использование ваших cookie-файлов. Это совершенно безопасно!