Новинки CSS и веб-интерфейса: обзор I/O 2024

Веб-платформа полна инноваций, а функции CSS и веб-интерфейса находятся в авангарде этой захватывающей эволюции. Мы живем в золотую эпоху веб-интерфейса, когда новые функции CSS появляются в браузерах с невиданной ранее скоростью, открывая мир возможностей для создания красивых и увлекательных веб-интерфейсов. В этом сообщении блога мы глубоко погрузимся в текущее состояние CSS, исследуя некоторые из самых революционных новых функций, которые переопределяют то, как мы создаем веб-приложения, и которые были представлены в прямом эфире на Google I/O 2024.

Новый интерактивный опыт

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

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

Поддержка браузера

  • Хром: 115.
  • Край: 115.
  • Firefox: за флагом.
  • Сафари: не поддерживается.

Источник

Как следует из названия, API анимации, управляемой прокруткой, позволяет создавать динамические анимации на основе прокрутки, не полагаясь на наблюдателей прокрутки или другие сложные сценарии.

Создавайте анимацию, управляемую прокруткой

Подобно тому, как на платформе работает анимация, основанная на времени , теперь вы можете использовать прогресс прокрутки скроллера для запуска, приостановки и изменения анимации. Таким образом, при прокрутке вперед вы увидите прогресс анимации, а при прокрутке назад все будет наоборот. Это позволяет создавать частичные или полностраничные визуальные эффекты с анимацией элементов в области просмотра и внутри нее (также известное как прокрутка ) для динамического визуального воздействия.

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

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

Живая демонстрация

@keyframes appear {
  from {
    opacity: 0;
    scale: 0.8;
  }
  to {
    opacity: 1;
    scale: 1;
  }
}

img {
  animation: appear linear;
  animation-timeline: view();
  animation-range: entry 25% cover 50%;
}

Приведенный выше код определяет простую анимацию, которая появляется в области просмотра путем изменения непрозрачности и масштаба изображения. Анимация управляется положением прокрутки. Чтобы создать этот эффект, сначала настройте анимацию CSS, а затем установите animation-timeline . В этом случае функция view() со значениями по умолчанию отслеживает изображение относительно области прокрутки (которая в данном случае также является областью просмотра).

Важно учитывать поддержку браузера и предпочтения пользователя, особенно для обеспечения доступности. Поэтому используйте правило @supports , чтобы проверить, поддерживает ли браузер анимацию, управляемую прокруткой, и оберните анимацию, управляемую прокруткой, в запрос пользовательских настроек, например @media (prefers-reduced-motion: no-preference) чтобы учитывать предпочтения пользователя в отношении движения. . Сделав эти проверки, вы знаете, что ваши стили будут работать и что анимация не вызовет проблем у пользователя.

@supports (animation-timeline: view()) {
  @media (prefers-reduced-motion: no-preference) {
    /* Apply scroll-driven animations here */
  }
}

Анимация, управляемая прокруткой, может означать полностраничную прокрутку, но она также может означать более тонкую анимацию, например минимизацию панели заголовка и отображение тени при прокрутке веб-приложения.

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

Живая демонстрация

@keyframes shrink-name {
  from {
    font-size: 2em;
  }
  to {
    font-size: 1.5em;
  }
}

@keyframes add-shadow {
  from {
    box-shadow: none;
  }
  to {
    box-shadow: 0 4px 2px -2px gray;
  }
}

header {
  animation: add-shadow linear both;
}

h2 {
  animation: shrink-name linear both;
}

header, h2 {
  animation-timeline: scroll();
  animation-range: 0 150px;
}

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

Преимущества производительности анимации, управляемой прокруткой

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

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

Анимация, управляемая прокруткой, управляет панелью навигации по продукту в Токопедии при прокрутке вниз.

«Нам удалось сократить до 80% строк кода по сравнению с использованием обычных событий прокрутки JS, и мы заметили, что средняя загрузка ЦП при прокрутке снизилась с 50% до 2%. — Энди Вихалим, старший инженер-программист, Tokopedia»

Будущее эффектов прокрутки

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

В будущем в браузерах появится еще больше функций прокрутки. В следующей демонстрации показано сочетание этих будущих функций. Он использует CSS scroll-start-target для установки начальной даты и времени в средствах выбора, а также событие JavaScript scrollsnapchange для обновления даты заголовка, что упрощает синхронизацию данных с зафиксированным событием.

Посмотрите живую демонстрацию на Codepen

Вы также можете использовать это для обновления средства выбора в реальном времени с помощью события JavaScript scrollsnapchanging .

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

Чтобы узнать больше о начале работы с анимацией, управляемой прокруткой, наша команда только что запустила новую серию видеороликов, которые вы можете найти на YouTube-канале Chrome для разработчиков . Здесь вы изучите основы анимации с прокруткой от Брамуса Ван Дамма, включая то, как работает эта функция, словарный запас, различные способы создания эффектов и способы объединения эффектов для создания насыщенных впечатлений. Это отличная серия видео, которую стоит посмотреть.

Просмотр переходов

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

Поддержка браузера

  • Хром: 111.
  • Край: 111.
  • Firefox: не поддерживается.
  • Сафари: 18.

Источник

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

Переход между видами одного и того же документа, как на Airbnb .
Портфолио Максвелла Барвиана , демонстрирующее переходы между видами.

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

Способ быстрого включения переходов представлений в одностраничном приложении так же прост, как обертывание взаимодействия с помощью document.startViewTransition и проверка того, что каждый элемент, который переходит, имеет view-transition-name , встроенное или динамическое использование JavaScript при создании. DOM-узлы.

Демо-визуал

Живая демонстрация

document.querySelectorAll('.delete-btn').forEach(btn => {
  btn.addEventListener('click', () => {
    document.startViewTransition(() => {
      btn.closest('.card').remove();
    });
  })
});
/* Styles for the transition animation */
::view-transition-old(.card):only-child {
  animation: fade-out ease-out 0.5s;
}

Посмотреть переходные классы

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

Поддержка браузера

  • Хром: 125.
  • Край: 125.
  • Firefox: не поддерживается.
  • Предварительная версия технологии Safari: поддерживается.

Просмотр типов перехода

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

Поддержка браузера

  • Хром: 125.
  • Край: 125.
  • Firefox: не поддерживается.
  • Сафари: 18.

Например, вы можете захотеть, чтобы домашняя страница анимировалась на странице блога иначе, чем эта страница блога анимируется обратно на домашнюю страницу. Или вы можете захотеть, чтобы страницы менялись местами по-разному, как в этом примере, слева направо и наоборот. Раньше это было грязно. Вы можете добавить классы в DOM для применения стилей, а затем потом придется удалить классы. Типы переходов представления позволяют браузеру очищать старые переходы вместо того, чтобы требовать от вас делать это вручную перед запуском новых, выполняя эту работу за вас.

Запись демо-версии пагинации . Типы определяют, какую анимацию использовать. Стили разделены в таблице стилей благодаря активным типам перехода.

Вы можете настроить типы в функции document.startViewTransition , которая теперь принимает объект. update — это функция обратного вызова, которая обновляет DOM, а types — это массив с типами.

document.startViewTransition({
  update: myUpdate,
  types: ['slide', 'forwards']
})

Переходы между просмотрами нескольких страниц

Что делает Интернет мощным, так это то, насколько он обширен. Многие приложения представляют собой не просто одностраничные приложения, а полноценную картину, состоящую из нескольких страниц. И именно поэтому мы так рады сообщить, что добавляем поддержку переходов между представлениями между документами для многостраничных приложений в Chromium 126.

Поддержка браузера

  • Хром: 126.
  • Край: 126.
  • Firefox: не поддерживается.
  • Предварительная версия технологии Safari: поддерживается.

Этот новый набор функций для перекрестных документов включает в себя веб-интерфейсы, находящиеся в одном и том же источнике, например переход с web.dev на web.dev/blog, но не включает навигацию между источниками, например переход с web.dev на web.dev/blog. blog.web.dev или в другой домен, например google.com.

Одним из ключевых отличий переходов между представлениями одного и того же документа является то, что вам не нужно обертывать переход с помощью document.startViewTransition() . Вместо этого включите обе страницы, участвующие в переходе представления, с помощью at-правила CSS @view-transition .

@view-transition {
  navigation: auto;
}

Для более индивидуального эффекта вы можете подключить JavaScript, используя новые прослушиватели событий pageswap или pagereveal , которые предоставляют вам доступ к объекту перехода представления.

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

window.addEventListener('pageswap', async (e) => {
    // ...
});

window.addEventListener('pagereveal', async (e) => {
    // ...
});
Отображение переходов между видами в многостраничном приложении. См. демонстрационную ссылку .

В будущем мы планируем расширить переходы между представлениями, в том числе:

  • Переходы с ограниченной областью действия : позволяют ограничить переход поддеревом DOM, позволяя остальной части страницы оставаться интерактивной и поддерживая одновременное выполнение нескольких переходов представлений.
  • Переходы между представлениями, управляемые жестами . Используйте жесты перетаскивания или пролистывания, чтобы вызвать переход между представлениями между документами, чтобы обеспечить более естественное взаимодействие в Интернете.
  • Сопоставление навигации в CSS . Настройте переход между представлениями между документами непосредственно в CSS в качестве альтернативы использованию событий pageswap и pagereveal в JavaScript. Чтобы узнать больше о переходах представлений для многостраничных приложений, в том числе о том, как наиболее эффективно настроить их с помощью рендеринга, ознакомьтесь со следующим выступлением Брамуса Ван Дамма:

Компоненты пользовательского интерфейса с поддержкой Engine: упрощение сложных взаимодействий

Создание сложных веб-приложений — непростая задача, но CSS и HTML развиваются, чтобы сделать этот процесс более управляемым. Новые функции и улучшения упрощают создание компонентов пользовательского интерфейса, позволяя вам сосредоточиться на создании отличных впечатлений. Это достигается совместными усилиями нескольких ключевых органов по стандартизации и групп сообщества, в том числе рабочей группы CSS, группы сообщества Open UI и WHATWG (Рабочая группа по технологиям веб-гипертекстовых приложений).

Одна большая проблема разработчиков — это, казалось бы, простой запрос: возможность стилизовать раскрывающиеся меню (элемент select). Хотя на первый взгляд это кажется простым, это сложная проблема, затрагивающая очень много частей платформы; от макета и рендеринга до прокрутки и взаимодействия, до стиля пользовательского агента и свойств CSS и даже изменений в самом HTML.

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

Раскрывающийся список состоит из множества частей и включает в себя множество состояний, которые необходимо учитывать, например:

  • Привязки клавиатуры (для входа/выхода из взаимодействия)
  • Нажмите, чтобы закрыть
  • Активное управление поповерами (закрытие других поповеров при открытии одного)
  • Управление фокусом вкладок
  • Визуализация значения выбранного параметра
  • Стиль взаимодействия со стрелками
  • Управление состоянием (открыть/закрыть)

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

API-интерфейс Поповера

Сначала мы добавили глобальный атрибут под названием popover , который, как я рад сообщить, несколько недель назад достиг нового статуса «Базовый уровень».

Поддержка браузера

  • Хром: 114.
  • Край: 114.
  • Фаерфокс: 125.
  • Сафари: 17.

Источник

Элементы всплывающего окна скрыты с помощью display: none , пока не будут открыты с помощью средства вызова, такого как кнопка, или с помощью JavaScript. Чтобы создать базовый всплывающий элемент, установите атрибут popover для элемента и свяжите его идентификатор с кнопкой с помощью popovertarget . Теперь кнопка является инициатором,

Демо-визуал

Живая демонстрация

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

<div id="my-popover" popover>
  <p>I am a popover with more information.</p>
</div>

Теперь, когда атрибут popover включен, браузер обрабатывает многие ключевые действия без каких-либо дополнительных сценариев, включая:

  • Продвижение на верхний слой. : отдельный слой над остальной частью страницы, поэтому вам не придется экспериментировать с z-index .
  • Функция отключения освещения. : нажатие за пределами области всплывающего окна закроет всплывающее окно и вернет фокус.
  • Управление фокусом вкладок по умолчанию. : при открытии всплывающего окна следующая табуляция перемещается внутри всплывающего окна.
  • Встроенные привязки клавиатуры. : нажатие клавиши esc или двойное переключение закроет всплывающее окно и вернет фокус.
  • Привязки компонентов по умолчанию. : Браузер семантически связывает поповер с его триггером.
Главный экран GitHub
Меню на главной странице GitHub .

Возможно, вы даже используете этот popover API сегодня, даже не осознавая этого. GitHub реализовал всплывающее окно в «новом» меню на своей домашней странице и в обзоре обзора запроса на включение. Они постепенно усовершенствовали эту функцию, используя popover polyfill , созданный Oddbird при значительной поддержке со стороны Кейта Циркеля из GitHub, для поддержки старых браузеров.

«Нам удалось исключить буквально тысячи строк кода, перейдя на popover. Popover помогает нам, устраняя необходимость борьбы с магическими числами z-индекса... наличие правильных отношений дерева доступности, установленных с помощью декларативного поведения кнопок, и встроенных поведений фокуса значительно облегчает нашей системе проектирования правильную реализацию шаблонов. Кейт Сиркел, инженер-программист, GitHub»

Анимация эффектов входа и выхода

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

Возможность анимировать display и content-visibility на временной шкале ключевых кадров.

Свойство transition-behavior с ключевым словом allow-discrete , позволяющее включать переходы дискретных свойств, таких как display .

Поддержка браузера

  • Хром: 117.
  • Край: 117.
  • Фаерфокс: 129.
  • Сафари: 17.4.

Источник

Правило @starting-style для анимации эффектов входа из display: none и в верхний слой .

Поддержка браузера

  • Хром: 117.
  • Край: 117.
  • Фаерфокс: 129.
  • Сафари: 17.5.

Источник

Свойство overlay для управления поведением верхнего слоя во время анимации.

Поддержка браузера

  • Хром: 117.
  • Край: 117.
  • Firefox: не поддерживается.
  • Сафари: не поддерживается.

Источник

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

Демо-визуал

Живая демонстрация

dialog, ::backdrop{
  opacity: 0;
  transition: opacity 1s, display 1s allow-discrete, overlay 1s allow-discrete;
}

[open], [open]::backdrop {
  opacity: 1;
}

@starting-style {
  [open], [open]::backdrop {
    opacity: 0;
  }
}

Сначала настройте @starting-style , чтобы браузер знал, из каких стилей анимировать этот элемент в DOM. Это сделано как для диалога, так и для фона. Затем задайте стиль открытого состояния как для диалогового окна, так и для фона. Для диалога используется атрибут open , а для поповера — псевдоэлемент ::popover-open . Наконец, анимируйте opacity , display и overlay используя ключевое словоallow allow-discrete чтобы включить режим анимации, в котором дискретные свойства могут переходить.

Расположение якоря

Поповер был только началом истории. Очень интересным обновлением является то, что поддержка позиционирования привязки теперь доступна в Chrome 125.

Поддержка браузера

  • Хром: 125.
  • Край: 125.
  • Firefox: не поддерживается.
  • Сафари: не поддерживается.

Источник

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

Демо-визуал

Живая демонстрация

Настройте позиционируемую связь привязки в CSS, используя свойство anchor-name привязывающего элемента (в данном случае кнопки) и свойство position-anchor у позиционируемого элемента (в данном случае — всплывающей подсказки). Затем примените абсолютное или фиксированное позиционирование относительно якоря с помощью функции anchor() . Следующий код помещает верхнюю часть всплывающей подсказки в нижнюю часть кнопки.

.anchor {
  anchor-name: --my-anchor;
}

.positioned {
  position: absolute;
  position-anchor: --my-anchor;
}

В качестве альтернативы можно использовать имя привязки непосредственно в функции привязки и пропустить свойство position-anchor . Это может быть полезно при привязке к нескольким элементам.

.anchor {
  anchor-name: --my-anchor;
}

.positioned {
  position: absolute;
  top: anchor(--my-anchor bottom);
}

Наконец, используйте новое ключевое слово anchor-center для свойств justify и align чтобы центрировать позиционированный элемент по его привязке.

.anchor {
  anchor-name: --my-anchor;
}

.positioned {
  position: absolute;
  top: anchor(--my-anchor bottom);
  justify-self: anchor-center;
}

Хотя использование позиционирования привязки с поповером очень удобно, поповер определенно не является обязательным требованием для использования позиционирования привязки. Позиционирование привязки можно использовать с любыми двумя (или более) элементами для создания визуальной связи. Фактически, следующая демонстрация, вдохновленная статьей Романа Комарова , показывает, как стиль подчеркивания привязывается к элементам списка при наведении на них курсора или табуляции.

Демо-визуал

Живая демонстрация

В этом примере используется функция привязки для установки позиции привязки с использованием физических свойств left , right и bottom . Когда вы наводите курсор на одну из ссылок, целевая привязка меняется, и браузер смещает цель, чтобы применить позиционирование, одновременно анимируя цвет для создания аккуратного эффекта.

ul::before {
  content: "";
  position: absolute;
  left:   anchor(var(--target) left);
  right:  anchor(var(--target) right);
  bottom: anchor(var(--target) bottom);
  ...
}

li:nth-child(1) { --anchor: --item-1 }
ul:has(:nth-child(1) a:is(:hover, :focus-visible)) {
  --target: --item-1;
  --color: red;
}

позиционирование inset-area

В дополнение к направленному абсолютному позиционированию по умолчанию, которое вы, вероятно, использовали раньше, включен новый механизм макета, который стал частью API позиционирования привязки, называемой областью вставки. Область вставки позволяет легко размещать позиционированные элементы относительно их соответствующих привязок и работает в сетке из 9 ячеек с привязывающим элементом в центре. Например, inset-area: top помещает позиционированный элемент вверху, а inset-area: bottom помещает позиционированный элемент внизу.

Упрощенная версия первой демонстрации привязки с inset-area выглядит следующим образом:

.anchor {
  anchor-name: --my-anchor;
}

.positioned {
  position: absolute;
  position-anchor: --my-anchor;
  inset-area: bottom;
}

Вы можете комбинировать эти позиционные значения с ключевыми словами диапазона, чтобы начать с центральной позиции и либо охватить влево, либо вправо, либо охватить все, чтобы занять полный набор доступных столбцов или строк. Вы также можете использовать логические свойства. Чтобы было проще визуализировать и освоить этот механизм компоновки, воспользуйтесь этим инструментом в Chrome 125+:

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

Демо-визуал

Живая демонстрация

Динамические позиции привязки с position-try-options

Меню и навигацию по подменю намного проще создавать с помощью комбинации всплывающего окна и позиционирования привязки. И когда вы касаетесь края области просмотра закрепленным элементом, вы также можете позволить браузеру обрабатывать изменение позиционирования за вас. Вы можете сделать это несколькими способами. Первый — создать свои собственные правила позиционирования. В этом случае подменю изначально располагается справа от кнопки «Витрина». Но вы можете создать блок @position-try на тот случай, если справа от меню недостаточно места, присвоив ему собственный идентификатор --bottom . Затем вы подключаете этот блок @position-try к якорю, используя position-try-options .

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

Демо-визуал

Живая демонстрация

#submenu {
  position-anchor: --submenu;
  top: anchor(top);
  left: anchor(right);
  margin-left: var(--padding);

  position-try-options: --bottom;

  transition: top 0.25s, left 0.25s;
  width: max-content;
}

@position-try --bottom {
  top: anchor(left);
  left: anchor(bottom);
  margin-left: var(--padding);
}

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

position-try-options: flip-block, flip-inline;

Чтобы упростить процесс переворота, воспользуйтесь этими значениями ключевых слов переворота и вообще пропустите написание определения position-try . Итак, теперь вы можете получить полнофункциональный привязанный к местоположению элемент с привязкой всего лишь к нескольким строкам CSS.

Демо-визуал

Живая демонстрация

.tooltip {
  inset-area: top;
  position-try-options: flip-block;
}

Узнайте больше об использовании позиционирования привязки .

Будущее многоуровневого пользовательского интерфейса

Мы видим привязанный опыт повсюду, и набор функций, показанный в этом посте, является отличным началом для раскрытия творческих способностей и лучшего контроля над элементами, расположенными на привязке, и многоуровневыми интерфейсами. Но это только начало. Например, в настоящее время popover работает только с кнопками в качестве вызывающего элемента или с JavaScript. Для чего-то вроде предварительного просмотра в стиле Википедии, шаблона, наблюдаемого по всей веб-платформе, должна быть возможность взаимодействовать, а также вызывать всплывающее окно по ссылке и от пользователя, проявляющего интерес, без обязательного перехода по нему, например, при наведении или вкладке. фокус.

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

<a interesttarget="my-tooltip">Hover/Focus to show the tooltip</a>

<span popover=hint id="my-toolip">This is the tooltip</span>

Кроме того, благодаря работе двух сторонних разработчиков, Кейта Сиркеля и Люка Варлоу, на Canary доступен для тестирования еще один перспективный общий метод вызова ( invoketarget ). invoketarget поддерживает декларативный опыт разработчика, который popovertarget предоставляет всплывающие окна, нормализованные для всех интерактивных элементов, включая <dialog> , <details> , <video> , <input type="file"> и другие.

<button invoketarget="my-dialog">
  Open Dialog
</button>

<dialog id="my-dialog">
  Hello world!
</dialog>

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

Стильный выбор

Используя popover и anchor вместе, команда добилась прогресса в создании настраиваемого раскрывающегося списка выбора. Хорошей новостью является то, что достигнут большой прогресс. Плохая новость заключается в том, что этот API в настоящее время все еще находится в экспериментальном состоянии. Тем не менее, я рад поделиться некоторыми живыми демонстрациями и обновлениями о нашем прогрессе и, надеюсь, получить ваши отзывы. Во-первых, достигнут прогресс в том, как включить пользователей в новый, настраиваемый интерфейс выбора. Текущий способ сделать это — использовать свойство внешнего вида в CSS, для которого установлено appearance: base-select . Как только внешний вид будет настроен, вы согласитесь на новый, настраиваемый интерфейс выбора.

select {
  appearance: base-select;
}

Помимо appearance: base-select есть несколько новых обновлений HTML. К ним относятся возможность заключать ваши параметры в datalist для настройки и возможность добавлять произвольный неинтерактивный контент, например изображения, в ваши параметры. У вас также будет доступ к новому элементу <selectedoption> , который будет отражать содержимое параметров, которое вы затем сможете настроить в соответствии со своими потребностями. Этот элемент действительно удобен.

Демо-визуал

флаг демо

Живая демонстрация

<select>
  <button type=popover>
    <selectedoption></selectedoption>
  </button>
  <datalist>
    <option value="" hidden>
      <p>Select a country</p>
    </option>
    <option value="andorra">
      <img src="Flag_of_Andorra.svg" />
      <p>Andorra</p>
    </option>
    <option value="bolivia">
      <img src="Flag_of_Bolivia.svg" />
      <p>Bolivia</p>
    </option>
...
  </datalist>
</select>

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

Демо-визуал

демо-версия Gmail

Живая демонстрация

selectedoption .text {
  display: none;
}

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

Неподдерживаемый браузер получает текущую версию выбора.
Поддерживаемый визуальный элемент браузера слева и неподдерживаемый резервный браузер справа.

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

Демо-визуал

Живая демонстрация

Эксклюзивный аккордеон

Решение выбора стиля (и всех связанных с ним частей) — не единственный компонент пользовательского интерфейса, на котором сосредоточилась команда Chrome. Первое дополнительное обновление компонента — это возможность создавать эксклюзивные аккордеоны, при которых одновременно можно открыть только один из предметов в аккордеоне.

Поддержка браузера

  • Хром: 120.
  • Край: 120.
  • Фаерфокс: 130.
  • Сафари: 17.2.

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

Эксклюзивная демонстрация аккордеона
<details name="learn-css" open>
  <summary>Welcome to Learn CSS!</summary>
</details>

<details name="learn-css">
  <summary>Box Model</summary>
  <p>...</p>
</details>

<details name="learn-css">
  <summary>Selectors</summary>
  <p>...</p>
</details>

:user-valid и :user-invalid

Еще одним улучшением компонента пользовательского интерфейса являются псевдоклассы :user-valid и :user-invalid . Псевдоклассы :user-valid и :user-invalid ставшие в последнее время стабильными во всех браузерах, ведут себя аналогично псевдоклассам :valid и :invalid , но соответствуют элементу управления формой только после того, как пользователь существенно взаимодействовал с вводом. Это означает, что требуется значительно меньше кода, чтобы определить, взаимодействовало ли значение формы или стало ли оно «грязным», что может быть очень полезно для обеспечения обратной связи с пользователем и сокращает количество сценариев, которые были бы необходимы для этого в прошлое.

Поддержка браузера

  • Хром: 119.
  • Край: 119.
  • Фаерфокс: 88.
  • Сафари: 16.5.

Источник

Демо-скринкаст

Живая демо-версия

input:user-valid,
select:user-valid,
textarea:user-valid {
    --state-color: green;
    --bg: linear-gradient(...);
}

input:user-invalid,
select:user-invalid,
textarea:user-invalid {
    --state-color: red;
    --bg: linear-gradient(...);
}

Узнайте больше об использовании псевдоэлементов проверки формы user-* .

field-sizing: content

Еще одно удобное обновление компонента, которое появилось недавно, — это field-sizing: content , которое можно применять к элементам управления формой, таким как поля ввода и текстовые области. Это позволяет размеру ввода увеличиваться (или уменьшаться) в зависимости от его содержимого. field-sizing: content может быть особенно удобен для текстовых областей, поскольку вы больше не можете использовать фиксированные размеры, и вам может потребоваться прокрутить вверх, чтобы увидеть то, что вы написали в предыдущих частях вашего приглашения, в слишком маленьком поле ввода.

Поддержка браузера

  • Хром: 123.
  • Край: 123.
  • Firefox: не поддерживается.
  • Сафари: не поддерживается.

Источник

Демо-скринкаст

Живая демо-версия

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

Узнайте больше о размерах полей .

<hr> в <select>

Возможность включить <hr> или элемент горизонтального правила в selects — еще одна небольшая, но полезная функция компонента. Хотя это не имеет большого семантического использования, оно помогает вам хорошо разделить контент в списке выбора, особенно контент, который вы не обязательно хотите группировать с помощью optgroup, например, значение-заполнитель.

Выберите снимок экрана

снимок экрана hr в select со светлой и темной темой в Chrome

Выберите живую демонстрацию

<select name="majors" id="major-select">
  <option value="">Select a major</option>
  <hr>
  <optgroup label="School of Fine Arts">
    <option value="arthist">
Art History
  </option>
  <option value="finearts">
    Fine Arts
  </option>
...
</select>

Узнайте больше об использовании hr в select

Улучшение качества жизни

Мы постоянно проводим итерации, и это касается не только взаимодействий и компонентов. За последний год появилось много других обновлений качества жизни.

Вложение с предварительным просмотром

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

Поддержка браузера

  • Хром: 120.
  • Край: 120.
  • Фаерфокс: 117.
  • Сафари: 17.2.

Источник

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

.card {
  /* card base styles */

  h2 {
    /* child element style */
  }

  &.highlight {
    /* modifier style */
  }

  &:hover, &:focus {
    /* state styles */
  }

  @container (width >= 300px) {
    /* container query styles */
  }
}

Align-content для макета блока

Еще одно действительно приятное изменение — возможность использовать механизмы центрирования, такие как align-content в макете блока. Это означает, что теперь вы можете делать такие вещи, как вертикальное центрирование внутри элемента div, без необходимости применять гибкий макет или макет сетки, а также без побочных эффектов, таких как предотвращение схлопывания полей, которые вам могут не понадобиться в этих алгоритмах макета.

Поддержка браузера

  • Хром: 123.
  • Край: 123.
  • Фаерфокс: 125.
  • Сафари: 17.4.

Скриншот

Живая демо-версия

div {
  align-content: center;
}

Обтекание текстом: баланс и красота

Говоря о макете, макет текста получил хорошее улучшение с добавлением text-wrap: balance и pretty . text-wrap: balance используется для более однородного блока текста, а text-wrap: pretty фокусируется на уменьшении одиночных элементов в последней строке текста.

Демо-скринкаст

Живая демо-версия

В следующей демонстрации вы можете сравнить, перетаскивая ползунок, эффекты balance и pretty на заголовок и абзац. Попробуйте перевести демо на другой язык!
h1 {
  text-wrap: balance;
}

Узнайте больше о переносе текста: баланс .

Обновления международной типографики

Обновления типографского макета для текстовых функций CJK за последний год получили много приятных обновлений, таких как функция word-break: auto-phrase , которая переносит строку на естественную границу фразы.

Поддержка браузера

  • Хром: 119.
  • Край: 119.
  • Firefox: не поддерживается.
  • Сафари: не поддерживается.

разрыв слова: автофраза переносит строку на естественную границу фразы.
Сравнение word-break: normal и word-break: auto-phrase

И text-spacing-trim , который применяет кернинг между знаками препинания, чтобы улучшить читаемость китайской, японской и корейской типографики и добиться более приятных визуально результатов.

Поддержка браузера

  • Хром: 123.
  • Край: 123.
  • Firefox: не поддерживается.
  • Сафари: не поддерживается.

Источник

Правая половина периода CJK удаляется с помощью text-spacing-trim.
Когда знаки препинания появляются подряд, правая половина точки CJK должна быть удалена.

Синтаксис относительного цвета

В мире цветовых тем мы увидели большое обновление относительного цветового синтаксиса.

В этом примере цвета используют тему на основе Oklch. Поскольку значение оттенка регулируется в зависимости от ползунка, меняется вся тема. Этого можно достичь с помощью относительного цветового синтаксиса. Фон использует основной цвет на основе оттенка и настраивает каналы яркости, цветности и оттенка для регулировки его значения. -Я-индекс братьев и сестер в списке для градации значений, показывая, как вы можете объединить шаг с пользовательскими свойствами и относительным синтаксисом цвета для создания тем.

Демонстрация экрана

Живая демонстрация

В следующей демонстрации вы можете сравнить, перетаскивая ползунок, последствия balance и pretty на заголовок и абзац. Попробуйте перевести демонстрацию на другой язык!
:root {
  --hue: 230;
  --primary: oklch(70% .2 var(--hue));
}

li {
  --_bg: oklch(from var(--primary)
    calc(l - (var(--i) * .05))
    calc(c - (var(--i) * .01))
    calc(h - (var(--i) + 5)));
}

Функция light-dark()

Наряду с функцией light-dark() , темация стала гораздо более динамичной и упрощенной.

Поддержка браузера

  • Хром: 123.
  • Край: 123.
  • Firefox: 120.
  • Сафари: 17,5.

Источник

Функция light-dark() -это эргономическое улучшение, которое упрощает варианты тематического размещения цвета, чтобы вы могли писать стили тем более кратко, как показано на этой визуальной диаграмме Адамом Аргайлом. Раньше вам понадобятся два разных блока кода (ваша тема по умолчанию и запрос предпочтений пользователя), чтобы настроить параметры темы. Теперь вы можете написать эти варианты стиля как для легких, так и для темных тем в одной и той же линии CSS, используя функцию light-dark() .

Визуализация light-dark() . Смотрите демо , чтобы узнать больше.
html {
  color-scheme: light dark;
}

button {
    background-color: light-dark(lightblue, darkblue);
}

Если пользователь выбрал легкую тему, кнопка будет иметь светло -синий фон. Если пользователь выбрал темную тему, кнопка будет иметь темно -синий фон.

:has() селектор

И я был бы упущением, чтобы поговорить о современном пользовательском интерфейсе, не упоминая одно из самых эффективных моментов взаимодействия прошлого года, которое должно быть :has() селектор, приземляющийся в браузерах в декабре прошлого года. Этот API меняет правила игры для написания логических стилей.

Поддержка браузера

  • Хром: 105.
  • Край: 105.
  • Firefox: 121.
  • Сафари: 15.4.

Источник

The :has() селектор позволяет вам проверить, есть ли у детей -элемента конкретные дети, или эти дети находятся в определенном состоянии, и, по сути, также может функционировать как селектор родителей.

Демонстрация has() используется для стиля сравнения блоков на Токопедии .

:has() уже показал, что он особенно полезен для многих компаний , в том числе PolicyBazaar, которые используют :has() для стиля блоков на основе их внутреннего содержания, например, в разделе сравнения, где стиль корректирует, если есть план Сравните в блоке, или если он пуст.

«С помощью: hast () селектор мы смогли устранить валидацию выбора пользователя на основе JavaScript и заменить его на решение CSS, которое легко работает для нас с тем же опытом, что и раньше. - Аман Сони, технический лидер, политика базара»

Контейнерные запросы

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

Поддержка браузера

  • Хром: 105.
  • Край: 105.
  • Firefox: 110.
  • Сафари: 16.

Источник

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

Angular.dev сайт демонстрирует запросы контейнера в картах заголовков.

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

Демонстрация экрана

Живая демонстрация

Воссоздание запроса контейнерного контейнера для угловой карты.

@property

И, наконец, очень скоро мы рады увидеть землю @property в базовом уровне. Это ключевая особенность для обеспечения семантического значения для CSS -пользовательских свойств (также известных как переменные CSS), и позволяет множество новых функций взаимодействия. @property также позволяет контекстно, Typechecking, Defalault и запасные значения в CSS. Открытие двери для еще более надежных функций, таких как запросы в стиле диапазона. Это особенность, которая никогда не была возможна раньше, и теперь обеспечивает такую ​​большую глубину языку CSS.

Поддержка браузера

  • Хром: 85.
  • Край: 85.
  • Firefox: 128.
  • Сафари: 16.4.

Источник

Демонстрация экрана

Живая демонстрация

@property --card-bg {
  syntax: "<color>";
  inherits: false;
  initial-value: #c0bae8;
}

Заключение

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

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

Это никогда не было лучшим временем, чтобы стать веб -разработчиком. С момента объявления CSS3 не было так много энергии и волнения. Особенности, которые нам нужны, но только мечтали о том, чтобы на самом деле приземлиться в прошлом, наконец -то становятся реальностью и частью платформы. И именно из -за вашего голоса мы можем расставить приоритеты и, наконец, воплотить эти возможности в жизнь. Мы работаем над тем, чтобы упростить то, чтобы сделать трудные, утомительные вещи, чтобы вы могли потратить больше времени на создание вещей, которые имеют значение, например, основные функции и детали дизайна, которые выделяют ваш бренд.

Чтобы узнать больше об этих новых функциях, когда они приземляются, следуйте на разработчике .Chrome.com и Web.Dev, где наша команда делится последними новостями в веб -технологиях. Попробуйте анимации, управляемые прокруткой, просмотреть переходы, позиционирование якоря или даже стилируемый выбор, и дайте нам знать, что вы думаете. Мы здесь, чтобы послушать, и мы здесь, чтобы помочь.

,

Веб -платформа жива с инновациями, с CSS и функциями веб -пользовательского интерфейса в центре этой захватывающей эволюции. Мы живем в золотую эру для веб -интерфейса, с новыми CSS, которые приземляются через браузеры в темпе, который мы никогда не видели раньше, открывая мир возможностей для создания красивых и привлекательных веб -опыта. Этот пост в блоге погрузится в текущее состояние CSS, изучая некоторые из самых изменяющих игру новых функций, которые переопределяют то, как мы создаем веб-приложения, в прямом эфире Google I/O 2024.

Новые интерактивные переживания

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

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

Поддержка браузера

  • Хром: 115.
  • Край: 115.
  • Firefox: за флагом.
  • Сафари: не поддерживается.

Источник

Как следует из названия, API анимации, управляемые свитками, позволяет создавать динамические анимации на основе прокрутки, не полагаясь на наблюдателей прокрутки или другие тяжелые сценарии.

Создайте анимацию, управляемую прокруткой

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

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

Визуальная анимация, управляемая свитка

Живая демонстрация

@keyframes appear {
  from {
    opacity: 0;
    scale: 0.8;
  }
  to {
    opacity: 1;
    scale: 1;
  }
}

img {
  animation: appear linear;
  animation-timeline: view();
  animation-range: entry 25% cover 50%;
}

Предыдущий код определяет простую анимацию, которая появляется в точке зрения, изменяя непрозрачность и масштаб изображения. Анимация обусловлена ​​позицией прокрутки. Чтобы создать этот эффект, сначала настроите анимацию CSS, а затем установите animation-timeline . В этом случае функция view() со значениями по умолчанию отслеживает изображение относительно Scrollport (который в этом случае также является ViewPort).

Важно помнить о поддержке браузеров и предпочтениях пользователей, особенно для потребностей доступности. Поэтому используйте правило @supports , чтобы проверить, поддерживает ли браузер анимацию, управляемую прокруткой, и оберните анимацию, управляемую прокруткой, в запрос предпочтений пользователя, как @media (prefers-reduced-motion: no-preference) . Сделав эти чеки, вы знаете, что ваши стили будут работать, и что анимация не проблематична для пользователя.

@supports (animation-timeline: view()) {
  @media (prefers-reduced-motion: no-preference) {
    /* Apply scroll-driven animations here */
  }
}

Анимации, управляемые прокруткой, могут означать полностраничные впечатления от скрипов, но они также могут означать более тонкие анимации, такие как панель заголовка, минимизируя и показывают тень при прокрутке веб-приложения.

Визуальная анимация, управляемая свитка

Живая демонстрация

@keyframes shrink-name {
  from {
    font-size: 2em;
  }
  to {
    font-size: 1.5em;
  }
}

@keyframes add-shadow {
  from {
    box-shadow: none;
  }
  to {
    box-shadow: 0 4px 2px -2px gray;
  }
}

header {
  animation: add-shadow linear both;
}

h2 {
  animation: shrink-name linear both;
}

header, h2 {
  animation-timeline: scroll();
  animation-range: 0 150px;
}

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

Преимущества производительности анимации, управляемых свитками

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

Tokopedia недавно использовала анимацию, управляемую свитками, чтобы сделать навигационную панель продукта, когда вы прокручиваете. Использование этого API имело некоторые серьезные преимущества, как для управления кодом, так и для производительности.

Анимация, управляемая прокруткой, приводит к тому, что этот навигационный панель продукта на токопедии прокручивает вниз.

«Нам удалось сократить до 80% наших строк кода по сравнению с использованием обычных событий прокрутки JS, и отметили, что среднее использование ЦП уменьшилось с 50% до 2% при прокрутке. - Энди Вихалим, старший инженер программного обеспечения, Токопедия».

Будущее эффектов свитка

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

И в будущем появятся еще больше функций прокрутки в браузерах. Следующая демонстрация показывает комбинацию этих будущих функций. Он использует CSS scroll-start-target чтобы установить начальную дату и время внутри сборщиков, а также событие JavaScript scrollsnapchange для обновления даты заголовка, что делает его тривиальным для синхронизации данных с разбитым событием.

Смотрите в прямом эфире на Codepen

Вы также можете опираться на это, чтобы обновить сборщика в режиме реального времени с помощью события JavaScript scrollsnapchanging .

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

Чтобы узнать больше о начале работы с анимацией, основанной на свитках, наша команда только что запустила новый видео сериал, который вы можете найти на Chrome для разработчиков YouTube Channel . Здесь вы узнаете основы анимации, основанных на свитках от Bramus van Damme, включая то, как работает функция, словарный запас, различные способы создания эффектов и способы объединения эффектов для создания богатого опыта. Это отличная видео серия, чтобы проверить.

Просмотреть переходы

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

Поддержка браузера

  • Хром: 111.
  • Край: 111.
  • Firefox: не поддерживается.
  • Сафари: 18.

Источник

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

Переход с тем же документом, как видно на Airbnb .
Портфолио Максвелла Барвияна , демонстрируя просмотр переходов между представлениями.

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

Способ быстро включить просмотр переходов в вашем одностраничном приложении так же просто, как view-transition-name взаимодействия с использованием document.startViewTransition DOM узлы.

Демо -визуальный

Живая демонстрация

document.querySelectorAll('.delete-btn').forEach(btn => {
  btn.addEventListener('click', () => {
    document.startViewTransition(() => {
      btn.closest('.card').remove();
    });
  })
});
/* Styles for the transition animation */
::view-transition-old(.card):only-child {
  animation: fade-out ease-out 0.5s;
}

Посмотреть классы перехода

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

Поддержка браузера

  • Хром: 125.
  • Край: 125.
  • Firefox: не поддерживается.
  • Предварительный просмотр технологий Safari: поддерживается.

Просмотреть типы переходов

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

Поддержка браузера

  • Хром: 125.
  • Край: 125.
  • Firefox: не поддерживается.
  • Сафари: 18.

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

Запись демо . Типы определяют, какую анимацию использовать. Стили разделены в листе стиля благодаря активным типам переходов.

Вы можете настроить типы в вашем document.startViewTransition . update - это функция обратного вызова, которая обновляет DOM, а types - это массив с типами.

document.startViewTransition({
  update: myUpdate,
  types: ['slide', 'forwards']
})

Многостраничный просмотр переходов

Что делает Интернет мощным, так это то, насколько она широко распространена. Многие приложения представляют собой не просто страницы, а надежный гобелен, содержащий несколько страниц. И именно поэтому мы так рады сообщить, что отправляем переходные переходы для просмотра переходов для многостраничных приложений в Chromium 126.

Поддержка браузера

  • Хром: 126.
  • Край: 126.
  • Firefox: не поддерживается.
  • Предварительный просмотр технологий Safari: поддерживается.

Этот новый набор функций по междокументию включает в себя веб-опыт, которые живут в пределах того же теорига, такие как навигация от web.dev to web.dev/blog, но это не включает навигацию по перекрестному происхождению, например, навигация с web.dev blog.web.dev или в другой домен, такой как Google.com.

Одним из ключевых различий с переходом в одно и то же документ является то, что вам не нужно обернуть свой переход document.startViewTransition() . Вместо этого, зарегистрируйте обе страницы, участвующие в переходе представления, используя CSS @view-transition AT-RULE.

@view-transition {
  navigation: auto;
}

Для более индивидуального эффекта вы можете зацепить JavaScript, используя новые прослушивание pageswap или pagereveal Event, которые дают вам доступ к объекту перехода View.

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

window.addEventListener('pageswap', async (e) => {
    // ...
});

window.addEventListener('pagereveal', async (e) => {
    // ...
});
Показание просмотра переходов в многостраничном приложении. Смотрите демонстрационную ссылку .

В будущем мы планируем расширить переходы, в том числе:

  • Переходы с общего объема : пусть вы ограничиваете переход к поддеревому DOM, что позволяет остальной части страницы продолжать быть интерактивным, и поддерживая несколько переходов просмотра, работающие одновременно.
  • Переходы просмотра жестов : используйте жесты перетаскивания или промахивания, чтобы запустить переход по перекрестному представлению для более естественных, похожий на нативные впечатления в Интернете.
  • Навигационное сопоставление в CSS : настраивайте переход по переходу по просмотру документации непосредственно в ваших CSS в качестве альтернативы использованию pageswap и pagereveal Events в JavaScript, чтобы узнать больше о переходах просмотра для многостраничных приложений, в том числе о том, как наиболее эффективно настроить их с предварительным. рендеринг, проверьте следующий разговор Bramus van Damme:

Компоненты пользовательского интерфейса с поддержкой двигателя: упрощение сложных взаимодействий

Создание сложных веб -приложений нелегко, но CSS и HTML развиваются, чтобы сделать этот процесс намного более управляемым. Новые функции и усовершенствования упрощают создание компонентов пользовательского интерфейса, что позволяет вам сосредоточиться на создании отличного опыта. Это делается благодаря совместным усилиям с участием нескольких ключевых органов стандартов и общественных групп, включая рабочую группу CSS, Open UI Group и WhatWG (Work Hypertext Application Technology Working Group).

Один из больших депутаторов - это, казалось бы, простой запрос: способность стилевого выпадающих меню (элемент Select). Хотя на поверхности это кажется простым, это сложная проблема, касаясь так много кусков платформы; От макета и рендеринга до прокрутки и взаимодействия, до стиля пользователя и свойств CSS, и даже изменяется в самой HTML.

Выберите с DataList параметров, которые имеют параметры внутри, кнопку триггера, стрелка индикатора и выбранную опцию.
Разбивая куски выбора

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

  • Привязки клавиатуры (для ввода/выхода из взаимодействия)
  • Нажмите на увольнение
  • Активное управление Popover (закройте другие поповерс, когда откроется)
  • Tab Focus Management
  • Визуализация выбранного значения опции
  • Стиль взаимодействия стрел
  • Государственное управление (открыто/закрыто)

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

Попвер API

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

Поддержка браузера

  • Хром: 114.
  • Край: 114.
  • Firefox: 125.
  • Сафари: 17.

Источник

Элементы Popover скрыты с display: none , пока не открыт с помощью инвента, такой как кнопка или с JavaScript. Чтобы создать базовый Popover, установите атрибут Popover на элементе и свяжите его идентификатор с кнопкой с помощью popovertarget . Теперь кнопка - Invoker,

Демо -визуальный

Живая демонстрация

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

<div id="my-popover" popover>
  <p>I am a popover with more information.</p>
</div>

С включенным атрибутом Popover, браузер обрабатывает множество ключевых поведений без каких -либо дополнительных сценариев, включая:

  • Продвижение до верхнего слоя. : Отдельный слой над остальной частью страницы, поэтому вам не нужно играть с z-index .
  • Функциональность Light-Dismiss. : Щелчок за пределами области Поповер закроет Popover и вернет фокус.
  • По умолчанию управление фокусировкой. : Открытие Поповер делает следующую вкладку остановки внутри Попора.
  • Встроенные привязки клавиатуры. : Нажимать на ключ esc или двойное переключение закроет Popover и вернет фокус.
  • Привязки компонентов по умолчанию. : Браузер семантически соединяет поповер к своему триггеру.
Github Homecen
Меню на домашней странице GitHub .

Вы можете даже использовать этот Popover API сегодня, не осознавая этого. Github внедрил Popover в своем «Новом» меню домашней страницы и в своем обзоре проверки запроса на привлечение. Они прогнозируют эту функцию, используя Popover Polyfill , построенный Oddbird с некоторой значительной поддержкой собственного Keith Cirkel от Github для поддержки более старых браузеров.

«Нам удалось установить буквально 1000 линий кода, мигрируя в Popover. Поповер помогает нам, устраняя необходимость борьбы с магическими Z-индексными числами ... наличие правильных отношений с деревами доступности, установленных с поведением декларативной кнопки, и встроенным поведением фокусировки облегчает нашу систему проектирования правильным образом. Кит Циркель, инженер -программист, GitHub »

Анимирующие эффекты ввода и выхода

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

Возможность анимировать display и content-visibility на временной шкале ключа.

Свойство transition-behavior с ключевым словом allow-discrete для обеспечения переходов дискретных свойств, таких как display .

Поддержка браузера

  • Хром: 117.
  • Край: 117.
  • Firefox: 129.
  • Сафари: 17.4.

Источник

Правило @starting-style , чтобы оживить эффекты входа от display: none и в верхний слой .

Поддержка браузера

  • Хром: 117.
  • Край: 117.
  • Firefox: 129.
  • Сафари: 17,5.

Источник

Свойство наложения для управления поведением верхнего слоя во время анимации.

Поддержка браузера

  • Хром: 117.
  • Край: 117.
  • Firefox: не поддерживается.
  • Сафари: не поддерживается.

Источник

Эти свойства работают для любого элемента, который вы анимируете в верхнем слое, будь то поповер или диалог. Все вместе, это выглядит так для диалога с фоном:

Демо -визуальный

Живая демонстрация

dialog, ::backdrop{
  opacity: 0;
  transition: opacity 1s, display 1s allow-discrete, overlay 1s allow-discrete;
}

[open], [open]::backdrop {
  opacity: 1;
}

@starting-style {
  [open], [open]::backdrop {
    opacity: 0;
  }
}

Во-первых, установите @starting-style , чтобы браузер знал, какие стили анимируют этот элемент в DOM. Это делается как для диалога, так и для фона. Затем стиль открытого состояния как для диалога, так и для фона. Для диалога это использует open атрибут, а для Popover-псевдоэлемента ::popover-open . Наконец, анимируйте opacity , display и overlay используя ключевое слово allow-discrete , чтобы включить режим анимации, где могут переходить дискретные свойства.

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

Поповер был только началом истории. Очень интересное обновление заключается в том, что поддержка позиционирования якоря теперь доступна от Chrome 125.

Поддержка браузера

  • Хром: 125.
  • Край: 125.
  • Firefox: не поддерживается.
  • Сафари: не поддерживается.

Источник

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

Демо -визуальный

Живая демонстрация

Установите позиционируемое отношение якоря в CSS, используя свойство anchor-name на элементе привязки (в данном случае кнопка) и свойство position-anchor на позиционированном элементе (в данном случае для подсказки инструментов). Затем примените абсолютное или фиксированное позиционирование относительно якоря, используя функцию anchor() . Следующий код позиционирует верхнюю часть подъема инструментов в нижнюю часть кнопки.

.anchor {
  anchor-name: --my-anchor;
}

.positioned {
  position: absolute;
  position-anchor: --my-anchor;
}

В качестве альтернативы, используйте якорь-имени непосредственно в функции якоря и пропустите свойство position-anchor . Это может быть полезно при привязке к нескольким элементам.

.anchor {
  anchor-name: --my-anchor;
}

.positioned {
  position: absolute;
  top: anchor(--my-anchor bottom);
}

Наконец, используйте новое ключевое слово anchor-center для justify и align свойства, чтобы сосредоточить позиционированный элемент на его якорь.

.anchor {
  anchor-name: --my-anchor;
}

.positioned {
  position: absolute;
  top: anchor(--my-anchor bottom);
  justify-self: anchor-center;
}

Хотя очень удобно использовать позиционирование якоря с Popover, Popover определенно не является обязательным требованием для использования позиционирования якоря. Позиционирование якоря может использоваться с любыми двумя (или более) элементами для создания визуальных отношений. Фактически, следующая демонстрация, вдохновленная статьей из Романа Комарова , показывает, что стиль подчеркивается, чтобы перечислить элементы, когда вы падаете или накладываете над ними.

Демо -визуальный

Живая демонстрация

В этом примере используется функция привязки для установки позиции якоря, используя физические свойства left , right и bottom . Когда вы падаете по одной из ссылок, целевой якорь меняется, и браузер смещает цель, чтобы применить позиционирование, также анимируя цвет одновременно для создания аккуратного эффекта.

ul::before {
  content: "";
  position: absolute;
  left:   anchor(var(--target) left);
  right:  anchor(var(--target) right);
  bottom: anchor(var(--target) bottom);
  ...
}

li:nth-child(1) { --anchor: --item-1 }
ul:has(:nth-child(1) a:is(:hover, :focus-visible)) {
  --target: --item-1;
  --color: red;
}

позиционирование inset-area

В дополнение к абсолютному абсолютному позиционированию по умолчанию, которое вы, вероятно, использовали ранее, есть новый механизм макета, включенный, который приземлился как часть API позиционирования якоря, называемого области вставки. Зона вставки позволяет легко разместить расположенные элементы по сравнению с их соответствующими якорями, и работает на 9-клеточной сетке с элементом привязки в центре. Например, inset-area: top помещает расположенный элемент сверху и inset-area: bottom помещает расположенный элемент внизу.

Упрощенная версия первого якоря демо выглядит так с inset-area :

.anchor {
  anchor-name: --my-anchor;
}

.positioned {
  position: absolute;
  position-anchor: --my-anchor;
  inset-area: bottom;
}

Вы можете объединить эти позиционные значения с ключевыми словами SPAN, чтобы начать в центре положения и либо SPAN влево, SPAN вправо или SPAN, чтобы взять полный набор столбцов или доступных рядов. Вы также можете использовать логические свойства. Чтобы облегчить визуализацию и поднять этот механизм макета, ознакомьтесь с этим инструментом в Chrome 125+:

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

Демо -визуальный

Живая демонстрация

Динамические позиции якоря с position-try-options

Меню и навигацию подменю намного проще создать с помощью комбинации поповер и позиционирования якоря. И, когда вы нажимаете на край просмотра с вашим якоренным элементом, вы можете позволить браузеру обрабатывать изменение позиционирования для вас. Вы можете сделать это несколькими способами. Первое - создать свои собственные правила позиционирования. В этом случае подменю изначально расположен в правой части кнопки «Стоина». Но вы можете создать блок @position-try для того, что в правом меню не хватает места, давая ему --bottom идентификатор. Затем вы подключаете этот блок @position-try к якору, используя position-try-options .

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

Демо -визуальный

Живая демонстрация

#submenu {
  position-anchor: --submenu;
  top: anchor(top);
  left: anchor(right);
  margin-left: var(--padding);

  position-try-options: --bottom;

  transition: top 0.25s, left 0.25s;
  width: max-content;
}

@position-try --bottom {
  top: anchor(left);
  left: anchor(bottom);
  margin-left: var(--padding);
}

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

position-try-options: flip-block, flip-inline;

Для простого опыта переворачивания воспользуйтесь этими значениями ключевых слов FLIP и вообще пропустите написание определения position-try . Так что теперь у вас может быть полностью функциональный расположенный якорь, реагирующий на местоположение элемент с несколькими линиями CSS.

Демо -визуальный

Живая демонстрация

.tooltip {
  inset-area: top;
  position-try-options: flip-block;
}

Узнайте больше об использовании позиционирования якоря .

Будущее слоистого пользовательского интерфейса

Мы видим привязанные переживания повсюду, и набор функций, показанных в этом посте, является отличным началом для развязанности творчества и лучшего контроля над элементами, расположенными якоря, и слоистыми интерфейсами. Но это только начало. Например, в настоящее время popover работает только с кнопками в качестве элемента вызывающего или JavaScript. Для чего-то вроде предварительных просмотров в стиле Википедии, шаблона, видимого по всей веб-платформе, с ним необходимо взаимодействовать, а также запустить попвер из ссылки и от пользователя, показывающего интерес, не нажимая, например, на воздухе или вкладке фокус.

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

<a interesttarget="my-tooltip">Hover/Focus to show the tooltip</a>

<span popover=hint id="my-toolip">This is the tooltip</span>

Кроме того, есть еще один будущий генерал Invoker ( invoketarget ) для тестирования в Canary благодаря работе двух сторонних разработчиков, Кейта Циркеля и Люка Уорлоу. invoketarget поддерживает опыт декларативного разработчика, который popovertarget предоставляет Popovers, нормализованные для всех интерактивных элементов, включая <dialog> , <details> , <video> , <input type="file"> и многое другое.

<button invoketarget="my-dialog">
  Open Dialog
</button>

<dialog id="my-dialog">
  Hello world!
</dialog>

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

Стиль Select

Используя popover и anchor вместе, команда добилась прогресса, наконец, обеспечивая настраиваемое раскрытие выбора. Хорошей новостью является то, что было много прогресса. Плохая новость заключается в том, что в настоящее время этот API все еще находится в экспериментальном состоянии. Тем не менее, я рад поделиться некоторыми живыми демонстрациями и обновлениями о нашем прогрессе и, надеюсь, получить некоторые из ваших отзывов. Во -первых, был прогресс в том, как выбрать пользователей в новый, настраиваемый опыт Select. Текущий, работающий необработанный способ сделать это-использовать свойство внешнего вида в CSS, установленное на appearance: base-select . После того, как появится внешний вид, вы выберете новый, настраиваемый опыт Select.

select {
  appearance: base-select;
}

В дополнение к appearance: base-select , есть несколько новых обновлений HTML. Они включают в себя возможность обернуть ваши параметры в datalist для настройки и возможность добавлять произвольный неинтерактивный контент, такой как изображения в ваших параметрах. У вас также будет доступ к новому элементу, <selectedoption> , который будет отражать содержание параметров, которые вы можете затем настроить на свои собственные потребности. Этот элемент действительно удобен.

Демо -визуальный

Флаг Демо

Живая демонстрация

<select>
  <button type=popover>
    <selectedoption></selectedoption>
  </button>
  <datalist>
    <option value="" hidden>
      <p>Select a country</p>
    </option>
    <option value="andorra">
      <img src="Flag_of_Andorra.svg" />
      <p>Andorra</p>
    </option>
    <option value="bolivia">
      <img src="Flag_of_Bolivia.svg" />
      <p>Bolivia</p>
    </option>
...
  </datalist>
</select>

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

Демо -визуальный

Gmail Demo

Живая демонстрация

selectedoption .text {
  display: none;
}

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

Неподдерживаемый браузер получает текущий опыт.
Supported browser visual on the left vs. unsupported browser fallback on the right.

With customizable selects, the possibilities are endless. I particularly love this Airbnb-style country selector because there is a clever style for responsive design. You can do this and so much more with the upcoming stylable select, making it a much-needed addition to the web platform.

Demo visual

Live demo

Exclusive accordion

Solving select styling (and all the pieces that come along with it) isn't the only UI component the Chrome team has been focusing on. The first additional component update is the ability to create exclusive accordions, in which only one of the items in the accordion can be opened at a time

Поддержка браузера

  • Chrome: 120.
  • Edge: 120.
  • Firefox: 130.
  • Safari: 17.2.

The way to enable this is to apply the same name value for multiple details elements, hence creating a connected group of details, much like a group of radio buttons

Exclusive accordion demo
<details name="learn-css" open>
  <summary>Welcome to Learn CSS!</summary>
</details>

<details name="learn-css">
  <summary>Box Model</summary>
  <p>...</p>
</details>

<details name="learn-css">
  <summary>Selectors</summary>
  <p>...</p>
</details>

:user-valid and :user-invalid

Another UI component improvement are the :user-valid and :user-invalid pseudo-classes. Stable in all browsers recently, the :user-valid and :user-invalid pseudo-classes behave similarly to the :valid and :invalid pseudo-classes, but match a form control only after a user has significantly interacted with the input. This means significantly less code is needed to determine if a form value has been interacted with, or has become “dirty”, which can be very useful for providing user feedback, and reduces a lot of scripting that would be necessary to do this in the прошлое.

Поддержка браузера

  • Chrome: 119.
  • Edge: 119.
  • Firefox: 88.
  • Safari: 16.5.

Источник

Demo Screencast

Live Demo

input:user-valid,
select:user-valid,
textarea:user-valid {
    --state-color: green;
    --bg: linear-gradient(...);
}

input:user-invalid,
select:user-invalid,
textarea:user-invalid {
    --state-color: red;
    --bg: linear-gradient(...);
}

Learn more about using user-* form validation pseudo-elements .

field-sizing: content

Another handy component update that has landed recently is field-sizing: content , which can be applied to form controls like inputs and textareas. This enables the size of the input to grow (or shrink) depending on its contents. field-sizing: content can be particularly handy for textareas, as you no longer are resolved to fixed sizes where you may need to scroll up to see what you wrote in the earlier parts of your prompt in a too-small input box.

Поддержка браузера

  • Chrome: 123.
  • Edge: 123.
  • Firefox: не поддерживается.
  • Сафари: не поддерживается.

Источник

Demo Screencast

Live Demo

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

Learn more about field sizing .

<hr> in <select>

The ability to enable the <hr> , or horizontal rule element in selects is another small but useful component feature. While this doesn't have much semantic use, it does help you nicely separate content within a select list, especially content that you might not necessarily want to group with an optgroup, like a placeholder value.

Select Screenshot

screenshot of hr in select with a light and dark theme in Chrome

Select Live Demo

<select name="majors" id="major-select">
  <option value="">Select a major</option>
  <hr>
  <optgroup label="School of Fine Arts">
    <option value="arthist">
Art History
  </option>
  <option value="finearts">
    Fine Arts
  </option>
...
</select>

Learn more about using using hr in select

Quality-of-life improvements

We're constantly iterating, and it's not just for interactions and components. There are many other quality of life updates that have landed in the past year.

Nesting with lookahead

Native CSS nesting landed in all browsers last year, and has since improved to support lookahead, which means the & before element names is no longer a requirement. This makes nesting feel so much more ergonomic and similar to what I have been used to in the past.

Поддержка браузера

  • Chrome: 120.
  • Edge: 120.
  • Firefox: 117.
  • Safari: 17.2.

Источник

One of my favorite things about CSS nesting is that it enables you to visually block components, and within those components include states and modifiers, such as container queries and media queries. Previously, I was in the habit of grouping all of these queries at the bottom of the file for specificity purposes. Now, you can write them in a way that makes sense, right next to the rest of your code

.card {
  /* card base styles */

  h2 {
    /* child element style */
  }

  &.highlight {
    /* modifier style */
  }

  &:hover, &:focus {
    /* state styles */
  }

  @container (width >= 300px) {
    /* container query styles */
  }
}

Align-content for block layout

Another really nice change is the ability to use centering mechanisms like align-content in block layout. This means you can now do things like vertical centering within a div without needing to apply flex or grid layout, and without side effects like preventing margin-collapse, that you may not want from those layout algorithms.

Поддержка браузера

  • Chrome: 123.
  • Edge: 123.
  • Firefox: 125.
  • Safari: 17.4.

Скриншот

Live Demo

div {
  align-content: center;
}

Text-wrap: balance and pretty

Speaking of layout, text layout got a nice improvement with the addition of text-wrap: balance and pretty . text-wrap: balance is used for a more uniform block of text, while text-wrap: pretty focuses on reducing singletons on the last line in the text.

Demo Screencast

Live Demo

In the following demo you can compare by dragging the slider, the effects of balance and pretty on a heading and a paragraph. Try translating the demo into another language!
h1 {
  text-wrap: balance;
}

Learn more about text-wrap: balance .

International typography updates

Typographic layout updates for CJK text features got a lot of nice updates in the past year, like the word-break: auto-phrase feature that wraps the line at the natural phrase boundary.

Поддержка браузера

  • Chrome: 119.
  • Edge: 119.
  • Firefox: не поддерживается.
  • Сафари: не поддерживается.

word-break: auto-phrase wraps the line at the natural phrase boundary.
Comparison of word-break: normal and word-break: auto-phrase

And text-spacing-trim , which applies kerning between punctuation characters to improve the readability of Chinese, Japanese, and Korean typography for more visually pleasing results.

Поддержка браузера

  • Chrome: 123.
  • Edge: 123.
  • Firefox: не поддерживается.
  • Сафари: не поддерживается.

Источник

The right-half of the CJK period is removed with text-spacing-trim.
When punctuation characters appear in a row, the right-half of the CJK period should be removed.

Relative color syntax

In the world of color theming, we saw a big update with relative color syntax.

In this example, the colors here use Oklch-based theming. As the hue-value adjusts based on the slider, the entire theme changes. This can be achieved with relative color syntax. The background uses the primary color, based on the hue, and adjusts the lightness, chroma, and hue channels to adjust its value. --i is the sibling index in the list for the gradation of values, showing how you can combine stepping with custom properties and relative color syntax to build themes.

Demo Screencast

Live Demo

In the following demo you can compare by dragging the slider, the effects of balance and pretty on a heading and a paragraph. Try translating the demo into another language!
:root {
  --hue: 230;
  --primary: oklch(70% .2 var(--hue));
}

li {
  --_bg: oklch(from var(--primary)
    calc(l - (var(--i) * .05))
    calc(c - (var(--i) * .01))
    calc(h - (var(--i) + 5)));
}

light-dark() function

Along with the light-dark() function, theming has become much more dynamic and simplified.

Поддержка браузера

  • Chrome: 123.
  • Edge: 123.
  • Firefox: 120.
  • Safari: 17.5.

Источник

The light-dark() function is an ergonomic improvement that simplifies color theming options so that you can write theme styles in a more concise way, as demonstrated so nicely in this visual diagram by Adam Argyle. Before, you would need two different blocks of code, (your default theme and a user preference query), to set up theme options. Now, you can write these style options for both light and dark themes in the same line of CSS using the light-dark() function.

Visualization of light-dark() . See demo for more.
html {
  color-scheme: light dark;
}

button {
    background-color: light-dark(lightblue, darkblue);
}

If the user selected a light theme, the button will have a light blue background. If the user selected a dark theme, the button will have a dark blue background.

:has() selector

And I would be remiss to talk about modern UI without mentioning one of the most impactful interop highlights from the past year, which has to be the :has() selector, landing across browsers in December of last year. This API is a game-changer for writing logical styles.

Поддержка браузера

  • Chrome: 105.
  • Edge: 105.
  • Firefox: 121.
  • Safari: 15.4.

Источник

The :has() selector enables you to check if a child element has specific children, or if those children are in a specific state, and essentially can function as a parent selector as well.

Demo of has() being used to style comparison blocks on Tokopedia .

:has() has already shown to be particularly useful for many companies , including PolicyBazaar, who use :has() to style blocks based on their interior content, such as in the compare section, where the style adjusts if there is a plan to compare in the block, or if its empty.

“With the :has() selector, we were able to eliminate JavaScript based validation of the user's selection and replace it with a CSS solution which is working seamlessly for us with the same experience as before.–Aman Soni, Tech Lead, PolicyBazaar”

Container queries

Another key addition to the web that is now newly available and growing in usage is container queries, which enable the ability to query an element parent's intrinsic size to apply styles: a much more fine-toothed comb than media queries, which only query the viewport размер.

Поддержка браузера

  • Chrome: 105.
  • Edge: 105.
  • Firefox: 110.
  • Safari: 16.

Источник

Angular recently launched a beautiful new documentation site on angular.dev using container queries to style the header blocks based on their available space on the page. So even if the layout changes, and goes from a multicolumn sidebar layout to a single-column layout, the header blocks can self-adjust.

Angular.dev site showcasing container queries in the header cards.

Without container queries, doing something like this was quite hard to achieve, and damaging for performance, requiring resize observers and element observers. Now, it's trivial to style an element based on its parent size.

Demo Screencast

Live Demo

Recreating the Angular header card container query.

@property

And finally very soon, we are excited to see @property land in Baseline. This is a key feature for providing semantic meaning to CSS custom properties (also known as CSS variables), and enables a slew of new interaction features. @property also enables contextual meaning, typechecking, defaults, and fallback values in CSS. Opening the doors for even more robust features like range style queries. This is a feature that was never possible before, and now provides so much depth to the language of CSS.

Поддержка браузера

  • Chrome: 85.
  • Edge: 85.
  • Firefox: 128.
  • Сафари: 16.4.

Источник

Demo Screencast

Live Demo

@property --card-bg {
  syntax: "<color>";
  inherits: false;
  initial-value: #c0bae8;
}

Заключение

With all of these new powerful UI capabilities landing across browsers, the possibilities are endless. Novel interactive experiences with scroll-driven animations and view transitions make the web more fluid and interactive in ways we've never seen before. And next level UI components make it easier than ever to build robust, beautifully customized components without ripping out the entire native experience. And finally, quality of life improvements in architecture, layout, typography, and responsive design not only solve the little big things, but also give developers the tools they need to build complex interfaces that work on a variety of devices, form factors, and user потребности.

These new features you should be able to remove third-party scripting for performance-heavy features like scrollytelling and tethering elements to each other with anchor positioning, build fluid page transitions, finally style dropdowns, and improve the overall structure of your code natively.

It's never been a better time to be a web developer. There hasn't been so much energy and excitement since the announcement of CSS3. Features we've needed but have only dreamed of actually landing in the past, are finally becoming a reality and a part of the platform. And it's because of your voice that we're able to prioritize and finally bring these capabilities to life. We're working on making it easier to do the hard, tedious stuff natively so you can spend more time building the things that matter–like the core features and design details that set your brand apart.

To learn more about these new features as they land, follow along at developer.chrome.com and web.dev, where our team shares the latest news in web technologies. Try out scroll driven animations, view transitions, anchor positioning, or even the stylable select, and let us know what you think. We're here to listen and we're here to help.