Web Interface Guidelines
Vercel поделилась списком лучших практик дизайна и разработки веб-интерфейсов. Список разделён на категории: взаимодействие, анимации, раскладка, контент, формы, производительность, дизайн и копирайтинг.
Некоторые пункты специфичны для React, а раздел про копирайтинг отражает особенности брендинга Vercel. В остальном это универсальный список, который точно стоит взять на вооружение дизайнерам и разработчикам интерфейсов.
Vercel также предлагает готовый файл AGENTS.md с адаптированными для LLM рекомендациями. Его можно использовать для расширения контекста агентов, чтобы они следовали этим практикам при генерации кода.
#ui
Vercel поделилась списком лучших практик дизайна и разработки веб-интерфейсов. Список разделён на категории: взаимодействие, анимации, раскладка, контент, формы, производительность, дизайн и копирайтинг.
Некоторые пункты специфичны для React, а раздел про копирайтинг отражает особенности брендинга Vercel. В остальном это универсальный список, который точно стоит взять на вооружение дизайнерам и разработчикам интерфейсов.
Vercel также предлагает готовый файл AGENTS.md с адаптированными для LLM рекомендациями. Его можно использовать для расширения контекста агентов, чтобы они следовали этим практикам при генерации кода.
#ui
Vercel Design
Web Interface Guidelines
Guidelines for building great interfaces on the web. Covers interactions, animations, layout, content, forms, performance & design.
👍7👾3😁1🌚1
Плавающие подписи
В интерфейсах часто встречаются так называемые плавающие подписи (floating labels). Это когда подпись отображается поверх поля ввода как заполнитель (placeholder), а при попадании фокуса плавно съезжает вверх и уменьшается в размерах.
Этот подход стал популярным благодаря дизайн-системе Material Design от Google. Он сохраняется в актуальной на сегодняшний день 3й версии. Его также можно встретить в других дизайн-системах и библиотеках компонентов.
Задумка плавающих подписей — компактность, учитывая что Material Design разработан в том числе для Android. Можно было бы использовать стандартный заполнитель, но это не лучшая идея. Плавающие подписи лучше, чем заполнители.
Но самый надёжный и практичный на мой взгляд способ подписывать поля — видимый текст рядом с полем ввода. Да, он не такой компактный, но лишён недостатков плавающих подписей, более надёжный и доступный.
Недостатки плавающих полей:
1. Структура HTML.
2. Переполнение. Длина подписи может оказаться больше длины поля. Хотя длинные подписи — плохая практика с точки зрения UX, такое иногда встречается. Перенос подписи ломает смещение и перекрывает введённое значение, с
3. Перекрытие заполнителя. Плавающая подпись перекрывает заполнитель, из-за чего его не используют или умышленно делают прозрачным, чтобы не было наложений. Заполнитель полезен, чтобы показать пример требуемых данных или формат ввода.
4. Выглядит как значение. Плавающая подпись у пустого поля выглядит так, как будто в поле уже что-то введено. Это может сбить с толку некоторых пользователей, особенно с когнитивными особенностями или нарушением зрения.
5. Размер шрифта. Наряду со смещением подписи вверх, также принято уменьшать её размер. Это может привести к слишком мелкому тексту, который трудно читать людям с нарушениями зрения. Увеличение размера текста в настройках либо ни к чему не приведёт, либо сломает плавающие подписи.
Для меня этого списка достаточно, чтобы избегать плавающих подписей. По возможности я стараюсь убедить дизайнеров использовать обычную подпись над полем, жертвуя компактностью.
Это оправдано, потому что в хороших формах не должно быть много полей, либо они должны разбиваться на шаги по принципу one thing per page. К тому же вертикальная прокрутка никуда не делась, форму с видимыми подписями можно прокрутить.
#ux #a11y
В интерфейсах часто встречаются так называемые плавающие подписи (floating labels). Это когда подпись отображается поверх поля ввода как заполнитель (placeholder), а при попадании фокуса плавно съезжает вверх и уменьшается в размерах.
Этот подход стал популярным благодаря дизайн-системе Material Design от Google. Он сохраняется в актуальной на сегодняшний день 3й версии. Его также можно встретить в других дизайн-системах и библиотеках компонентов.
Задумка плавающих подписей — компактность, учитывая что Material Design разработан в том числе для Android. Можно было бы использовать стандартный заполнитель, но это не лучшая идея. Плавающие подписи лучше, чем заполнители.
Но самый надёжный и практичный на мой взгляд способ подписывать поля — видимый текст рядом с полем ввода. Да, он не такой компактный, но лишён недостатков плавающих подписей, более надёжный и доступный.
<label for="name">
Имя
</label>
<input
type="text"
id="name"
autocomplete="given-name"
autocapitalize="words"
spellcheck="false"
>
<!--
Имя
[___________]
-->
Недостатки плавающих полей:
1. Структура HTML.
<label> нужно размещать после <input> и использовать селектор с комбинатором ~ или +. Или воспользоваться относительно новым селектором :has():input:is(:not(:placeholder-shown), :focus) + label {
/* ... */
}
label:has(+ input:is(:not(:placeholder-shown), :focus)) {
/* ... */
}
2. Переполнение. Длина подписи может оказаться больше длины поля. Хотя длинные подписи — плохая практика с точки зрения UX, такое иногда встречается. Перенос подписи ломает смещение и перекрывает введённое значение, с
overflow: hidden теряется информация, а торчащая за пределы поля подпись выглядит не красиво.3. Перекрытие заполнителя. Плавающая подпись перекрывает заполнитель, из-за чего его не используют или умышленно делают прозрачным, чтобы не было наложений. Заполнитель полезен, чтобы показать пример требуемых данных или формат ввода.
4. Выглядит как значение. Плавающая подпись у пустого поля выглядит так, как будто в поле уже что-то введено. Это может сбить с толку некоторых пользователей, особенно с когнитивными особенностями или нарушением зрения.
5. Размер шрифта. Наряду со смещением подписи вверх, также принято уменьшать её размер. Это может привести к слишком мелкому тексту, который трудно читать людям с нарушениями зрения. Увеличение размера текста в настройках либо ни к чему не приведёт, либо сломает плавающие подписи.
Для меня этого списка достаточно, чтобы избегать плавающих подписей. По возможности я стараюсь убедить дизайнеров использовать обычную подпись над полем, жертвуя компактностью.
Это оправдано, потому что в хороших формах не должно быть много полей, либо они должны разбиваться на шаги по принципу one thing per page. К тому же вертикальная прокрутка никуда не делась, форму с видимыми подписями можно прокрутить.
#ux #a11y
❤14🥰1😢1👾1
Enhanced Range Input
Во всех браузерах уже достаточно давно существует элемент
- Сложно стилизовать из-за ограничений и различий в вендорных псевдо-элементах;
- Не все части в принципе возможно стилизовать;
- Не поддерживается несколько ползунков, что часто встречается в фильтрах.
Из-за этого стандартный слайдер заменяют JS-библиотеками, вроде noUiSlider. Предложение Enhanced Range Input от OpenUI призвано решить проблемы и предоставить нативное решение.
Первое предложение связано со спецификацией CSS Form Control Styling, о которой я уже рассказывал. Это возможность включить «базовый» режим для стандартных элементов управления с помощью свойства
В «базовом» режиме элемент управления получает набор минималистичных стилей, которые стандартизированы и одинаковы для всех браузеров. Также «базовый» режим открывает доступ к новым псевдо-элементам для стилизации внутренних частей.
Далее предлагается новый элемент
У элемента
Атрибуты
Предусмотрена возможность привязки элемента
Промежутки между несколькими ползунками также можно стилизовать, используя новый псевдо-элемент
Для работы с диапазонами и несколькими значениями у
Предложение развивается и есть ряд открытых вопросов. Примеры кода и API можно посмотреть в самом предложении. Также автор подготовил прототип в виде веб-компонента и интерактивную площадку с примерами. Ждём реализацию в браузерах.
#html #css #js #ui
Во всех браузерах уже достаточно давно существует элемент
<input type="range">, отображающий слайдер с ползунком для изменения значения в заданном диапазоне. Элемент вполне можно использовать, но есть ряд проблем:- Сложно стилизовать из-за ограничений и различий в вендорных псевдо-элементах;
- Не все части в принципе возможно стилизовать;
- Не поддерживается несколько ползунков, что часто встречается в фильтрах.
Из-за этого стандартный слайдер заменяют JS-библиотеками, вроде noUiSlider. Предложение Enhanced Range Input от OpenUI призвано решить проблемы и предоставить нативное решение.
Дисклеймер: это обзор раннего предложения новых функций. Синтаксис может измениться в будущем или от функций могут отказаться.
Первое предложение связано со спецификацией CSS Form Control Styling, о которой я уже рассказывал. Это возможность включить «базовый» режим для стандартных элементов управления с помощью свойства
appearance.В «базовом» режиме элемент управления получает набор минималистичных стилей, которые стандартизированы и одинаковы для всех браузеров. Также «базовый» режим открывает доступ к новым псевдо-элементам для стилизации внутренних частей.
input[type="range"] {
appearance: base;
::slider-track {
/* Шкала, по которой перемещается ползунок */
}
::slider-fill {
/* Заполненная часть шкалы */
}
::slider-thumb {
/* Ползунок */
}
::slider-segment {
/* Часть шкалы между двумя ползунками */
}
::slider-tick {
/* Засечки при использовании <datalist> */
}
::slider-tick-label {
/* Подпись засечки при использовании <datalist> */
}
}Далее предлагается новый элемент
<rangegroup> для создания слайдера с несколькими ползунками. Это контейнер, который оркестрирует элементами <input type="range"> и отображает единый элемент управления.<rangegroup>
<legend>Цена</legend>
<label for="price-min">
Минимальная цена
</label>
<input
type="range"
id="price-min"
name="price-min"
value="25"
>
<label for="price-max">
Максимальная цена
</label>
<input
type="range"
id="price-max"
name="price-max"
value="75"
>
</rangegroup>
У элемента
<rangegroup> можно указать атрибуты min, max, name, list и stepbetween. Первые четыре работают как у <input type="range">, но определяют общий диапазон. stepbetween задаёт минимальную дистанцию между двумя ползунками.Атрибуты
min, max, value, name и step у <input> будут корректно взаимодействовать с атрибутами у <rangegroup>. Так min и max у <rangegroup> ограничивают min и max у <input>, чтобы они не выходили за пределы диапазона.Предусмотрена возможность привязки элемента
<datalist> с набором <option> к <rangegroup> для создания засечек с подсказками, к которым «магнитятся» ползунки. С псевдо-элементами ::slider-tick и ::slider-tick-label их можно стилизовать.Промежутки между несколькими ползунками также можно стилизовать, используя новый псевдо-элемент
::slider-segment в сочетании с псевдо-классами :nth-child. Аналогично можно по-разному стилизовать каждый ползунок.Для работы с диапазонами и несколькими значениями у
<rangegroup> будут соответствующие свойства и методы. Никуда не исчезнет API самих элементов <input type="range">, с которыми можно работать, получив их через <rangegroup>.const rangeGroup = document.querySelector(
'rangegroup[name="price-range"]'
);
// Получение значений
console.log(rangeGroup.values);
// [100, 750]
// Получение слайдеров
const inputs = rangeGroup.inputs;
console.log(inputs.length);
// 2
// Установка значений
rangeGroup.setRangeValue(0, 150);
console.log(rangeGroup.values);
// [150, 750]
Предложение развивается и есть ряд открытых вопросов. Примеры кода и API можно посмотреть в самом предложении. Также автор подготовил прототип в виде веб-компонента и интерактивную площадку с примерами. Ждём реализацию в браузерах.
#html #css #js #ui
👍10🔥4👾2❤1🌚1
Atomic Accessibility
Чарли Триплет создал набор атомарных критериев доступности для дизайнеров, разработчиков, тестировщиков и продуктовых менеджеров. Это своего рода чеклист для проверки доступности, но со своими особенностями.
Atomic Accessibility предлагает атомарный подход к требованиям соответствия. Сначала нужно выбирать роль: дизайнер, веб-, iOS- или Android-разработчик. Для каждой роли есть список элементов с разбивкой по категориям.
Внутри каждой категории находятся конкретные атомарные элементы интерфейса: шапка, форма поиска, хлебные крошки, пагинация, поле ввода пароля, диалоговое окно, флажки, вкладки, подвал и так далее.
У каждого элемента есть критерии соответствия. Для дизайнеров — требования WCAG и нарушения, которые затрагивает элемент. Для разработчиков — ожидаемое поведение клавиатуры, скринридеров и настроек системы.
Информация выводятся в текстовое поле, откуда её можно скопировать и вставить в техническое задание, описание задачи, чеклист приёмки, комментарии в ревью на GitHub, инструкции к нейросетям и агентам или куда-то ещё.
Можно перейти на детальную страницу каждого элемента, с описанием, примерами хорошего и плохого кода, пояснениями и ссылками. Критерии доступны в формате JSON для интеграции с разными системами.
#a11y
Чарли Триплет создал набор атомарных критериев доступности для дизайнеров, разработчиков, тестировщиков и продуктовых менеджеров. Это своего рода чеклист для проверки доступности, но со своими особенностями.
Atomic Accessibility предлагает атомарный подход к требованиям соответствия. Сначала нужно выбирать роль: дизайнер, веб-, iOS- или Android-разработчик. Для каждой роли есть список элементов с разбивкой по категориям.
Внутри каждой категории находятся конкретные атомарные элементы интерфейса: шапка, форма поиска, хлебные крошки, пагинация, поле ввода пароля, диалоговое окно, флажки, вкладки, подвал и так далее.
У каждого элемента есть критерии соответствия. Для дизайнеров — требования WCAG и нарушения, которые затрагивает элемент. Для разработчиков — ожидаемое поведение клавиатуры, скринридеров и настроек системы.
Информация выводятся в текстовое поле, откуда её можно скопировать и вставить в техническое задание, описание задачи, чеклист приёмки, комментарии в ревью на GitHub, инструкции к нейросетям и агентам или куда-то ещё.
Можно перейти на детальную страницу каждого элемента, с описанием, примерами хорошего и плохого кода, пояснениями и ссылками. Критерии доступны в формате JSON для интеграции с разными системами.
#a11y
Atomic Accessibility
Accessibility criteria & checklists
- [Updated 2025] Atomic Accessibility
- [Updated 2025] Atomic Accessibility
❤9👍6🤔2🌚1👾1
Custom ident и dashed ident
В CSS есть два типа значений:
Тип
Многие новые возможности CSS используют тип
Кевин Пауэлл в видеокасте рассуждает о статье Ромы Комарова об именовании сущностей. Как не запутаться, где нужно использовать
Дело в том, что
Тогда не имеет значения, это
#css
В CSS есть два типа значений:
<custom-ident> и <dashed-ident>. Оба типа позволяют создавать произвольные идентификаторы для некоторых сущностей. В отличие от строкового типа, для идентификаторов не требуются кавычки.<custom-ident> используется для именования счётчиков, ключевых кадров, линий и областей сетки. Это значения list, bounce, logo, nav и search в следующем примере:ul {
counter-reset: list;
}
li {
counter-increment: list;
}
li::before {
content: counter(list);
}
@keyframes bounce {
/* ... */
}
.bounce {
animation-name: bounce;
/* ... */
}
.header {
grid-template-area: 'logo nav search' ;
}
.header__logo {
grid-area: logo;
}
.header__nav {
grid-area: nav;
}
.header__search {
grid-area: search;
}Тип
<dashed-ident> будет знаком по синтаксису пользовательских свойств. Это такой же произвольный идентификатор, но который должен начинаться с двух дефисов --. Не всем нравятся эти лишние символы, но на то есть ряд исторических причин.Многие новые возможности CSS используют тип
<dashed-ident> для именования. Среди них view-transition-name, anchor-name, anchor-target, view-timeline-name, scroll-timeline-name, функции и миксины.Кевин Пауэлл в видеокасте рассуждает о статье Ромы Комарова об именовании сущностей. Как не запутаться, где нужно использовать
<custom-ident>, а где <dashed-ident>? Рома предлагает решение.Дело в том, что
<custom-ident> может содержать в начале два тире, потому что тире — это обычный символ, который разрешён в идентификаторах. Поэтому все пользовательские идентификаторы можно начинать с --.Тогда не имеет значения, это
<custom-ident> или <dashed-ident>, синтаксис будет одинаковый, а запоминать разницу не придётся. Хотя такой подход странновато выглядит в именованных областях и линиях сетки, он имеет право на жизнь.ul {
counter-reset: --list;
}
li {
counter-increment: --list;
}
li::before {
content: counter(--list);
}
@keyframes --bounce {
/* ... */
}
.bounce {
animation-name: --bounce;
/* ... */
}
.header {
grid-template-area:
'--logo --nav --search'
;
}
.header__logo {
grid-area: --logo;
}
.header__nav {
grid-area: --nav;
}
.header__search {
grid-area: --search;
}#css
🔥4🤔2❤1👾1
Nerdy Notebook
Адам Аргайл запустил проект Nerdy Notebook, где он собирает различные фрагменты CSS. Так как Адам работал в команде Chrome DevRel и отвечал за контент про CSS и UI, в заметках много современных возможностей.
Также советую посмотреть личный сайт Адама, на нём собраны его заметки, статьи, доклады, выступления, фрагменты кода и инструменты. Сам сайт при этом стоит изучить в DevTools. желательно в последней версии Chrome, Адам любит экспериментировать.
#css #ui
Адам Аргайл запустил проект Nerdy Notebook, где он собирает различные фрагменты CSS. Так как Адам работал в команде Chrome DevRel и отвечал за контент про CSS и UI, в заметках много современных возможностей.
Также советую посмотреть личный сайт Адама, на нём собраны его заметки, статьи, доклады, выступления, фрагменты кода и инструменты. Сам сайт при этом стоит изучить в DevTools. желательно в последней версии Chrome, Адам любит экспериментировать.
#css #ui
nerdy.dev
Adam Argyle
Website for Adam Argyle: Teacher, Speaker, CSSWG member, and creator of Open Props and VisBug.
🔥12❤4👍1🌚1
Атрибуты supports и layer для <link>
У элемента
Если условие не выполняется, файл стилей загружается с низким приоритетом и асинхронно (не блокирует отрисовку), а сами стили не применяются. Эта механика лежит в основе доклада Вадима Макеева «условно адаптивно», о котором я делал пост.
В 496-м выпуске Веб-стандартов слушатель задал вопрос про директиву
Тут бы пригодился атрибут
Браузер загрузит
Директива
Не смотря на то, что в файле
Другая полезная директива —
В WHATWG есть issue, где обсуждается расширение элемента
#html #css
У элемента
<link rel="stylesheet"> можно указать атрибут media с выражением как в директиве @media. Браузер будет проверять медиа-выражение на соответствие текущему окружению, что повлияет на загрузку файла стилей. <link
rel="stylesheet"
href="mobile.css"
media="(width < 600px)"
>
Если условие не выполняется, файл стилей загружается с низким приоритетом и асинхронно (не блокирует отрисовку), а сами стили не применяются. Эта механика лежит в основе доклада Вадима Макеева «условно адаптивно», о котором я делал пост.
В 496-м выпуске Веб-стандартов слушатель задал вопрос про директиву
@import и каскадные слои (@layer). Хочется обернуть стили из внешнего файла в каскадный слой без изменения исходного кода этого файла.Тут бы пригодился атрибут
layer у элемента <link>, который помещал бы загруженные стили в указанный слой. Но такого атрибута на данный момент нет. Единственный способ — использовать директиву @import с layer() внутри элемента <style>:<!-- атрибут layer не поддерживается
<link
rel="stylesheet"
href="utils.css"
layer="utils"
>
-->
<style>
@import url('utils.css') layer(utils);
</style>
Браузер загрузит
utils.css и поместит его в слой с именем utils, что позволит управлять каскадом: повысить или понизить приоритет всех стилей из этого файла по сравнению со стилями из других слоёв.Директива
@import известна как плохое решение для производительности и многие рекомендуют её избегать. Дело в том, что вложенные @import приводят к последовательной загрузке стилей вместо параллельной.Не смотря на то, что в файле
utils.css могут отсутствовать директивы @import и загрузка должна быть как у <link rel="stylesheet">, всё ещё остаются вопросы к такому методу подключения внешних файлов стилей.Другая полезная директива —
@supports. В теории хотелось бы загружать некоторые стили только при наличии поддержки определённых CSS-функций. Это пригодилось бы для реализации прогрессивного улучшения:<!-- атрибут supports не поддерживается
<link
rel="stylesheet"
href="scroll-animations.css"
supports="(animation-timeline: scroll())"
>
-->
<style>
@import url('scroll-animations.css') supports(animation-timeline: scroll());
</style>
В WHATWG есть issue, где обсуждается расширение элемента
<link>, чтобы учесть директивы @layer и @supports. Пока решение по этому вопросу не принято, но есть разные идеи того, как это может выглядеть и работать.#html #css
GitHub
Allow authors to apply new css features (like cascade layers) while linking stylesheets · Issue #7540 · whatwg/html
I opened this issue in the wrong repo initially, so summarizing that conversation here: The problem The CSSWG recently added a feature to CSS called Cascade Layers. It allows authors to more explic...
❤8👍5🔥2
Будущее фронтенда: хватит ли веб-платформы?
20-21 октября буду на конференции Frontendconf в качестве участника круглого стола на тему «Будущее фронтенда: хватит ли веб-платформы?» Обсудим разработку UI-библиотек, как в этом могут помочь современные возможности веб-платформы, конечно же затронем веб-компоненты и попытаемся заглянуть в будущее. Кто среди подписчиков будет на Frontendconf — приходите послушать нашу дискуссию.
#ui
20-21 октября буду на конференции Frontendconf в качестве участника круглого стола на тему «Будущее фронтенда: хватит ли веб-платформы?» Обсудим разработку UI-библиотек, как в этом могут помочь современные возможности веб-платформы, конечно же затронем веб-компоненты и попытаемся заглянуть в будущее. Кто среди подписчиков будет на Frontendconf — приходите послушать нашу дискуссию.
#ui
frontendconf.ru
Крупнейшая профессиональная конференция фронтенд-разработчиков в России 2025
Мы собираем индустрию, чтобы обсудить последние тенденции, технологии и лучшие практики в области веб-разработки
🔥10👎1🌚1
Scoped Focusgroup
Я слежу за развитием предложения focusgroup от OpenUI и жду реализации в браузерах, а опросы показывают интерес сообщества к этой функции. К моему сожалению, предложение перевели в статус неактивного.
Недавно было опубликовано новое предложение Scoped Focusgroup — следующую итерациею focusgroup. Некоторые идеи оригинального предложения отложили, а остальные немного переработали. Что изменилось:
- Поддержка CSS-свойств отложена на будущее;
- Поддержка навигации по двум осям отложена на будущее;
- Добавлена область действия для управление фокусом только там, где это предполагается исходя из ролей элементов.
В целом синтаксис и поведение атрибута focusgroup и его значений сохраняется (за исключением навигации по двум осям). Но добавляется набор новых значений для определения области действия, которые соответствуют ролям ARIA.
Новый синтаксис выглядит так:
-
-
-
-
В примере элемент получает роль toolbar (из значения
Другие примеры и подробности можно посмотреть в самом предложении. Выглядит многообещающе, а изменения вполне логичные и правильные. Буду следить за развитием дальше и приносить новости.
#html #ui
Дисклеймер: это обзор раннего предложения новых функций. Синтаксис может измениться в будущем или от функций могут отказаться.
Я слежу за развитием предложения focusgroup от OpenUI и жду реализации в браузерах, а опросы показывают интерес сообщества к этой функции. К моему сожалению, предложение перевели в статус неактивного.
Недавно было опубликовано новое предложение Scoped Focusgroup — следующую итерациею focusgroup. Некоторые идеи оригинального предложения отложили, а остальные немного переработали. Что изменилось:
- Поддержка CSS-свойств отложена на будущее;
- Поддержка навигации по двум осям отложена на будущее;
- Добавлена область действия для управление фокусом только там, где это предполагается исходя из ролей элементов.
В целом синтаксис и поведение атрибута focusgroup и его значений сохраняется (за исключением навигации по двум осям). Но добавляется набор новых значений для определения области действия, которые соответствуют ролям ARIA.
Новый синтаксис выглядит так:
<div focusgroup="<behavior> [inline|block] [wrap] [no-memory]">
<!-- ... -->
</div>
-
<behavior> — роль элемента и поведение фокуса. Принимает значения toolbar, tablist, radiogroup, listbox, menu, menubar, в будущем grid;-
[inline|block] — направление навигации: inline — горизонтально, block — вертикально, зависит от направления письма;-
[wrap] — циклический перенос между крайними элементами. Если значение wrap указано, то перенос включён;-
[no-memory] — сброс последнего сфокусированного элемента при выходе за пределы виджета. Если значение no-memory указано, фокус сбрасывается.<div
focusgroup="toolbar inline wrap"
aria-label="Форматирование текста"
>
<button type="button">
Жирный
</button>
<button type="button">
Курсив
</button>
<button type="button">
Подчёркнутый
</button>
</div>
В примере элемент получает роль toolbar (из значения
<behavior>), кнопки удаляются из последовательности табуляции, добавляются обработчики клавиатуры для горизонтальной навигации с переносом между крайними кнопками.Другие примеры и подробности можно посмотреть в самом предложении. Выглядит многообещающе, а изменения вполне логичные и правильные. Буду следить за развитием дальше и приносить новости.
#html #ui
👍6👾2
WCAG 2.2 — международный стандарт ISO/IEC
21 октября Международная организация по стандартизации (ISO/IEC JTC 1) утвердила WCAG 2.2 в качестве международного стандарта ISO/IEC 40500:2025. Это позволит большему числу стран официально принять WCAG 2.2.
Многие страны в той или иной степени используют WCAG разных версий как основу для законов об обеспечении доступности. Теперь они смогут использовать международный стандарт ISO/IEC 40500:2025.
#a11y
21 октября Международная организация по стандартизации (ISO/IEC JTC 1) утвердила WCAG 2.2 в качестве международного стандарта ISO/IEC 40500:2025. Это позволит большему числу стран официально принять WCAG 2.2.
Многие страны в той или иной степени используют WCAG разных версий как основу для законов об обеспечении доступности. Теперь они смогут использовать международный стандарт ISO/IEC 40500:2025.
#a11y
W3C
W3C Web Content Accessibility Guidelines 2.2 approved as ISO/IEC international standard
WCAG 2.2 is now ISO/IEC 40500:2025. This standard enables more countries to formally adopt WCAG 2.2. ISO/IEC 40500:2025 is free from the ISO website. Supporting resources and translations are free from the W3C website.
🎉6🌚1👾1
Quiet UI
Месяц назад Кори ЛаВиска, создатель библиотеки веб-компонентов Shoelace, объявил у себя в блоге о запуске проекта Quiet UI. Это библиотека из 80+ готовых UI-компонентов, которые выполнены в виде веб-компонентов.
Может возникнуть вопрос: зачем автор создал ещё одну библиотеку веб-компонентов, когда есть Shoelace и Web Awesome? Более того, в Quiet UI используются многие наработки из этих двух проектов.
Как отмечает автор, Shoelace и его наследник Web Awesome — это серьёзные проекты с большим сообществом, командой разработки и финансовой поддержкой. Quiet UI — пет-проект для тестирования идей и творчества.
Quiet UI не конкурирует с Shoelace и Web Awesome, а служит творческой площадкой и испытательным полигоном. Вскоре после релиза автор поменял лицензию на MIT и теперь библиотека доступна как ПО с открытым исходным кодом.
В Quiet UI используются некоторые новые возможности браузеров и есть компоненты, которых нет в Shoelace и Web Awesome. Не исключено что в будущем некоторые из таких компонентов будут адаптированы и перенесены.
В общем интересный проект, который можно использовать как альтернативу Shoelace и Web Awesome. Причём использовать можно с любым фреймворком или без них, так как в этом сила веб-компонентов.
#ui
Месяц назад Кори ЛаВиска, создатель библиотеки веб-компонентов Shoelace, объявил у себя в блоге о запуске проекта Quiet UI. Это библиотека из 80+ готовых UI-компонентов, которые выполнены в виде веб-компонентов.
Может возникнуть вопрос: зачем автор создал ещё одну библиотеку веб-компонентов, когда есть Shoelace и Web Awesome? Более того, в Quiet UI используются многие наработки из этих двух проектов.
Как отмечает автор, Shoelace и его наследник Web Awesome — это серьёзные проекты с большим сообществом, командой разработки и финансовой поддержкой. Quiet UI — пет-проект для тестирования идей и творчества.
Quiet UI не конкурирует с Shoelace и Web Awesome, а служит творческой площадкой и испытательным полигоном. Вскоре после релиза автор поменял лицензию на MIT и теперь библиотека доступна как ПО с открытым исходным кодом.
В Quiet UI используются некоторые новые возможности браузеров и есть компоненты, которых нет в Shoelace и Web Awesome. Не исключено что в будущем некоторые из таких компонентов будут адаптированы и перенесены.
В общем интересный проект, который можно использовать как альтернативу Shoelace и Web Awesome. Причём использовать можно с любым фреймворком или без них, так как в этом сила веб-компонентов.
UPD 11.11.2025. Автор в конечном итоге принял решение оставить проект для личного пользования. Поэтому теперь библиотека недоступна для использования и больше не предоставляется как проект с открытым исходным кодом. Все статьи о проекте в блоге удалены.
#ui
quietui.org
Quiet UI
A UI library for the Web with a focus on accessibility, longevity, performance, and simplicity.
👍12🔥2🌚1👾1
Порядок в <head>
Как часто вы заглядываете в
Начать стоит с валидности. Внутри
- Один
- Один
- Ноль и более
- Ноль и более
- Ноль и более
- Ноль и более
- Ноль и более
- Ноль и более
При обнаружении любого другого элемента парсер немедленно закрывает
У этого есть разные последствия, потому что от размещения элементов в
Недопустимые элементы в
Инструкции к таким вставками обычно предлагают вставить сниппет в начало
Другой источник проблем — неверный порядок элементов в
Выявить проблемы с порядком элементов помогут два инструмента:
- ct.css — файл стилей, который делает элементы
- capo.js — сниппет, который анализирует содержимое
Отдельного внимания заслуживают менеджеры тегов, через которые на сайты неконтролируемо попадают разные маркетинговые скрипты и засоряют
#html #performance
Как часто вы заглядываете в
<head> ваших проектов и проверяете, что там происходит? А стоило бы периодически это делать, потому что содержимое и порядок элементов могут негативно влиять на производительность.Начать стоит с валидности. Внутри
<head> допустимы только определённые элементы:- Один
<noscript>- Один
<base>- Ноль и более
<link>- Ноль и более
<meta>- Ноль и более
<noscript>- Ноль и более
<style>- Ноль и более
<template>- Ноль и более
<nonoscript>При обнаружении любого другого элемента парсер немедленно закрывает
<head> и переносит оставшиеся элементы в <body>.<head>
<meta charset="utf-8">
<noscript>Мой сайт</noscript>
<img src="pixel.png">
<link
rel="preload"
href="custom-font.woff2"
as="font"
type="font/woff2"
>
<link
rel="stylesheet"
href="styles.css"
>
<noscript
src="noscript.js"
defer
></noscript>
</head>
<body>
<!-- ... -->
</body>
<!-- парсер сделает так: -->
<head>
<meta charset="utf-8">
<noscript>Мой сайт</noscript>
</head>
<body>
<img src="pixel.png">
<link
rel="preload"
href="custom-font.woff2"
as="font"
type="font/woff2"
>
<link
rel="stylesheet"
href="styles.css"
>
<noscript
src="noscript.js"
defer
></noscript>
<!-- ... -->
</body>
У этого есть разные последствия, потому что от размещения элементов в
<head> или <body> меняется место и приоритет в очереди загрузки ресурсов, статус блокировки парсера, нарушается работа скриптов, завязанных на <head>.Недопустимые элементы в
<head> часто появляются при интеграции различных «пикселей», аналитических фреймов и прочих сторонних вставок. Обычно они представлены элементами <img>, <iframe> и <div>.Инструкции к таким вставками обычно предлагают вставить сниппет в начало
<body>, но нередко они попадают в <head> вместе с элементами <noscript>. Отловить подобные ошибки помогает валидатор HTML.Другой источник проблем — неверный порядок элементов в
<head>. Простая перестановка элементов в нужном порядке может выиграть вплоть до нескольких секунд времени загрузки. Об этом есть отличный доклад Гарри Робертса.Выявить проблемы с порядком элементов помогут два инструмента:
- ct.css — файл стилей, который делает элементы
<head> видимыми и подсвечивает проблемные места;- capo.js — сниппет, который анализирует содержимое
<head> и выводит в консоль текущий и отсортированный порядок.Отдельного внимания заслуживают менеджеры тегов, через которые на сайты неконтролируемо попадают разные маркетинговые скрипты и засоряют
<head>. Подробнее об этом как-нибудь напишу пост.#html #performance
Erwin Hofman [sitespeed consultant]
How invalid HTML elements impact web performance
Independent website speed and performance consultant / specialist, Core Web Vitals included
👍16🔥4❤2🌚1👾1
Релиз Web Awesome
В понедельник я рассказал о проекте Quiet UI, а тут спустя почти 4 месяца бета-теста произошёл официальный релиз другого проекта того же автора — Web Awesome. Это полноценный UI kit на базе веб-стандартов, «Bootstrap нового поколения».
Web Awesome — наследник библиотеки компонентов с открытым исходным кодом Shoelace, которую я часто упоминаю. Проведена работа по улучшению архитектуры и системы темизации, добавлены новые компоненты, утилиты, темы и раскладки.
Web Awesome распространяется по модели freemium. Все базовые компоненты, утилиты, раскладки и 3 темы доступны для использования бесплатно. Всё, что было доступно в Shoelace, бесплатно доступно в Web Awesome.
Платная часть распространяется по подписке и включает в себя pro-компоненты, визуальный конфигуратор тем, шаблоны готовых интерфейсов из компонентов, раскладок и утилит, Figma kit, дополнительные темы, CDN и техническую поддержку.
В честь релиза предлагается пожизненная скидка 20% на подписку Pro до 19 ноября.
#ui
В понедельник я рассказал о проекте Quiet UI, а тут спустя почти 4 месяца бета-теста произошёл официальный релиз другого проекта того же автора — Web Awesome. Это полноценный UI kit на базе веб-стандартов, «Bootstrap нового поколения».
Web Awesome — наследник библиотеки компонентов с открытым исходным кодом Shoelace, которую я часто упоминаю. Проведена работа по улучшению архитектуры и системы темизации, добавлены новые компоненты, утилиты, темы и раскладки.
Web Awesome распространяется по модели freemium. Все базовые компоненты, утилиты, раскладки и 3 темы доступны для использования бесплатно. Всё, что было доступно в Shoelace, бесплатно доступно в Web Awesome.
Платная часть распространяется по подписке и включает в себя pro-компоненты, визуальный конфигуратор тем, шаблоны готовых интерфейсов из компонентов, раскладок и утилит, Figma kit, дополнительные темы, CDN и техническую поддержку.
В честь релиза предлагается пожизненная скидка 20% на подписку Pro до 19 ноября.
#ui
Web Awesome
Build better with Web Awesome, the biggest open-source library of meticulously designed, highly customizable, and framework-agnostic UI components.
❤4🔥2🌚1👾1
Toolbar Elements
Члены группы OpenUI продолжают работать над UI-примитивами и опубликовали черновик предложения Toolbar Elements. Они предлагают добавить в веб-платформу встроенное решение для создания панели инструментов.
Такие панели встречаются во многих веб-приложениях: Google Docs, Figma, VSCode, Notion, Photoshop Web и так далее. Панель инструментов группирует кнопки, списки выбора, переключатели и другие интерактивные элементы интерфейса.
Сейчас для создания панели инструментов нужно использовать ARIA-роль toolbar. В спецификации ARIA также пишется, что у элемента с ролью
Предлагается новый элемент
Есть открытые вопросы о том, как должен стилизоваться
В будущем предполагается расширить возможности
#html #ui
Члены группы OpenUI продолжают работать над UI-примитивами и опубликовали черновик предложения Toolbar Elements. Они предлагают добавить в веб-платформу встроенное решение для создания панели инструментов.
Такие панели встречаются во многих веб-приложениях: Google Docs, Figma, VSCode, Notion, Photoshop Web и так далее. Панель инструментов группирует кнопки, списки выбора, переключатели и другие интерактивные элементы интерфейса.
Сейчас для создания панели инструментов нужно использовать ARIA-роль toolbar. В спецификации ARIA также пишется, что у элемента с ролью
toolbar можно реализовать управление фокусом, что подразумевает навигацию стрелками.Дисклеймер: это обзор раннего предложения новых функций. Синтаксис может измениться в будущем или от функций могут отказаться.
Предлагается новый элемент
<toolbar>, в который будет встроена роль toolbar и навигация по интерактивным элементам с помощью стрелок. По умолчанию <toolbar> отображает элементы горизонтально.<toolbar aria-label="Main">
<button
id="undoButton"
aria-label="Undo"
>
<img src="..." alt="">
</button>
<button
id="redoButton"
aria-label="Redo"
>
<img src="..." alt="">
</button>
<button
id="printButton"
aria-label="print"
>
<img src="..." alt="">
</button>
<input
id="zoomSelect"
list="zoom"
aria-label="zoom"
>
<!-- ... -->
</toolbar>
<datalist id="zoom">
<option>Fit</option>
<option>50%</option>
<!-- ... -->
</datalist>
<noscript>
undoButton.addEventListener("click",
() => undo();
);
// ...
</noscript>
Есть открытые вопросы о том, как должен стилизоваться
<toolbar>, как должно работать изменение ориентации (для вертикальной панели инструментов) и нужно ли поддерживать внутри разделители (как <hr> внутри <select>).В будущем предполагается расширить возможности
<toolbar>, которые на данный момент находятся за пределами предложения. В конечном итоге в веб-платформе должен появиться встроенный аналог шаблона панели инструментов.#html #ui
Web Accessibility Initiative (WAI)
Toolbar Pattern
Accessibility resources free online from the international standards organization: W3C Web Accessibility Initiative (WAI).
🔥7🌚4👾1
Negative border radius
Бывает, что дизайнеры рисуют блоки с причудливыми вырезами, у которых закруглённые углы, как на прикреплённом изображении. Буквально на днях у меня спрашивали, как такое реализовать.
Есть разные хаки с абсолютно позиционированными элементами-масками. В целом вёрстка таких блоков — задача непростая. Но ребята из HTML Academy выкатили решение — библиотеку nebo.css.
Nebo — сокращение от negative border radius, как часто называют подобные эффекты. Это CSS-файл на 100 с лишним строчек кода, который предоставляет несколько классов и пользовательские свойства для точечной настройки.
В этих 100 строках скрыта магия CSS: градиенты в сочетании с математикой и, конечно же, масками позволяют добиться нужного эффекта. Кому интересно, как это работает, предлагаю изучить исходный код библиотеки.
Для использования достаточно подключить nebo.css к проекту или просто скопировать код и вставить в файл стилей. Далее к элементу, у которого нужно сделать вырез, добавляется класс
Доступны модификаторы для четырёх сторон:
-
-
-
-
Логические свойства не завезли, но это отличный повод сделать pull request. Также есть ограничение, что одновременно на элементе можно сделать только один вырез. Если нужно несколько вырезов, то придётся использовать обёртки.
Далее у элемента с вырезом можно точечно настраивать параметры с помощью пользовательских свойств:
-
-
-
Также есть набор пользовательских свойств для каждого угла, чтобы можно было задавать разные радиусы, а также переменная для настройки дуги, чтобы можно было делать более интересные вырезы с помощью эллипсов.
Подробнее о библиотеке рассказывает Александр Першин в видео Вогнутые углы за пару строк CSS из рубрики CSS Боль. Также есть интерактивная песочница, где пошагово демонстрируются возможности библиотеки.
#css
Alt изображения:четыре квадратных блока с фиолетовым градиентным фоном расположены по два в ряд. У каждого блока есть вырез со скруглёнными углами. У первого блока квадратный вырез в левом верхнем углу. У второго блока вытянутый прямоугольный вырез в правом верхнем углу. У третьего блока вытянутый прямоугольный вырез в левом нижнем углу. У четвёртого блока квадратный вырез в правом нижнем углу.
Бывает, что дизайнеры рисуют блоки с причудливыми вырезами, у которых закруглённые углы, как на прикреплённом изображении. Буквально на днях у меня спрашивали, как такое реализовать.
Есть разные хаки с абсолютно позиционированными элементами-масками. В целом вёрстка таких блоков — задача непростая. Но ребята из HTML Academy выкатили решение — библиотеку nebo.css.
Nebo — сокращение от negative border radius, как часто называют подобные эффекты. Это CSS-файл на 100 с лишним строчек кода, который предоставляет несколько классов и пользовательские свойства для точечной настройки.
В этих 100 строках скрыта магия CSS: градиенты в сочетании с математикой и, конечно же, масками позволяют добиться нужного эффекта. Кому интересно, как это работает, предлагаю изучить исходный код библиотеки.
Для использования достаточно подключить nebo.css к проекту или просто скопировать код и вставить в файл стилей. Далее к элементу, у которого нужно сделать вырез, добавляется класс
nebo и модификатор стороны, с которой нужен вырез:<link rel="stylesheet" href="nebo.css">
<!-- br - сокращение bottom right -->
<div class="card nebo nebo--br">
<!-- контент карточки -->
</div>
Доступны модификаторы для четырёх сторон:
-
.nebo--tl — top left-
.nebo--tr — top right-
.nebo--bl — bottom left-
.nebo--br — bottom rightЛогические свойства не завезли, но это отличный повод сделать pull request. Также есть ограничение, что одновременно на элементе можно сделать только один вырез. Если нужно несколько вырезов, то придётся использовать обёртки.
Далее у элемента с вырезом можно точечно настраивать параметры с помощью пользовательских свойств:
-
--nb-r — радиус всех трёх скруглений-
--nb-w — ширина выреза-
--nb-h — высота вырезаТакже есть набор пользовательских свойств для каждого угла, чтобы можно было задавать разные радиусы, а также переменная для настройки дуги, чтобы можно было делать более интересные вырезы с помощью эллипсов.
Подробнее о библиотеке рассказывает Александр Першин в видео Вогнутые углы за пару строк CSS из рубрики CSS Боль. Также есть интерактивная песочница, где пошагово демонстрируются возможности библиотеки.
#css
Alt изображения:
❤10🔥4❤🔥2👾1
История архитектуры веб-приложений
На сайте Plain Vanilla есть статья с обзором архитектуры веб-приложений: классический и современный серверный рендеринг, клиентский рендеринг, серверный рендеринг с гидратацией на клиенте. В конце статья приходит к подходу local-first, о чём в блоге есть отдельная статья. Хороший исторический экскурс, рекомендую к прочтению.
#architecture
На сайте Plain Vanilla есть статья с обзором архитектуры веб-приложений: классический и современный серверный рендеринг, клиентский рендеринг, серверный рендеринг с гидратацией на клиенте. В конце статья приходит к подходу local-first, о чём в блоге есть отдельная статья. Хороший исторический экскурс, рекомендую к прочтению.
#architecture
Plainvanillaweb
The history of web application architecture
The many different ways of building for the web, and their many frustrations.
👍10❤3🔥3👾1
Critical CSS
Во многих руководствах по улучшению производительности рекомендуется реализовать технику критического CSS (Critical CSS). То есть выделить стили, важные для начальной области просмотра, и встроить их в
Остальные, некритические стили, загрузить асинхронно, чтобы они не блокировали отрисовку. Звучит заманчиво, но у меня эта техника оптимизации вызывает лишь вопросы и мысли о сложности реализации.
Что считать критическими стилями? Какие размеры начальной области просмотра брать за основу, если их огромное множество? Выносить ли стили скрытых элементов, которые, тем не менее, находятся на начальном экране?
Как эффективно разделять стили на критические и некритические? Как вносить изменения, чтобы критическая часть обновлялась? Как лучше загружать некритическую часть? И ещё много вопросов, ответы на которые не до конца ясны.
Единственное применение, как мне видится, в одностраничных лэндингах. Там весь CSS можно встроить в
Но Critical CSS, как подход, не рационален для лэндингов и в целом. Вряд-ли CSS будет узким местом, а реализация техники может не дать хоть какого-то улучшения. Гарри Робертс в статье несколько раз акцентирует на этом внимание.
Если есть проблема с долгим FCP, то стоит убедиться, а в CSS ли дело. Чаще всего проблема не в нём. Но если проблема действительно из-за большого количества CSS, то стоит применить другие техники оптимизации.
Прежде всего, сократить объём CSS за счёт грамотной стратегии разделения по страницам, разделам или компонентам и загрузкой только там, где это нужно. Это можно использовать в сочетании с элементами
Ну и, само собой, стили нужно минифицировать, сжимать хотя-бы через gzip, а лучше через brotli или zstd, проверять поддерживаемые браузеры для предотвращения лишних префиксов и трансформации и кэшировать.
#css #performance
Во многих руководствах по улучшению производительности рекомендуется реализовать технику критического CSS (Critical CSS). То есть выделить стили, важные для начальной области просмотра, и встроить их в
<head>.Остальные, некритические стили, загрузить асинхронно, чтобы они не блокировали отрисовку. Звучит заманчиво, но у меня эта техника оптимизации вызывает лишь вопросы и мысли о сложности реализации.
Что считать критическими стилями? Какие размеры начальной области просмотра брать за основу, если их огромное множество? Выносить ли стили скрытых элементов, которые, тем не менее, находятся на начальном экране?
Как эффективно разделять стили на критические и некритические? Как вносить изменения, чтобы критическая часть обновлялась? Как лучше загружать некритическую часть? И ещё много вопросов, ответы на которые не до конца ясны.
Единственное применение, как мне видится, в одностраничных лэндингах. Там весь CSS можно встроить в
<head> из-за небольшого объёма кода. Инструменты, такие как penthouse, как раз работают с одной страницей.Но Critical CSS, как подход, не рационален для лэндингов и в целом. Вряд-ли CSS будет узким местом, а реализация техники может не дать хоть какого-то улучшения. Гарри Робертс в статье несколько раз акцентирует на этом внимание.
Если есть проблема с долгим FCP, то стоит убедиться, а в CSS ли дело. Чаще всего проблема не в нём. Но если проблема действительно из-за большого количества CSS, то стоит применить другие техники оптимизации.
Прежде всего, сократить объём CSS за счёт грамотной стратегии разделения по страницам, разделам или компонентам и загрузкой только там, где это нужно. Это можно использовать в сочетании с элементами
<link> в <body>.Ну и, само собой, стили нужно минифицировать, сжимать хотя-бы через gzip, а лучше через brotli или zstd, проверять поддерживаемые браузеры для предотвращения лишних префиксов и трансформации и кэшировать.
#css #performance
Debugbear
Inlining Critical CSS: Does It Make Your Website Faster? | DebugBear
Learn what critical CSS is, how to inline it to improve page load performance, and understand the trade-offs before implementing it on your website.
👍10❤3💯2
Расширение <label>
Элемент
Также есть 5 правил ARIA, первое из которых гласит: «используйте встроенные в HTML элементы и атрибуты для передачи нужной семантики вместо использования ARIA».
Всё бы хорошо, но
Это значит, что если по тем или иным причинам пришлось создать собственный элемент управления на основе ARIA, то использовать
Также кажется логичным использование
Раз
Или нужен новый элемент, например
Что вы думаете по этому поводу? Проголосуйте в опросе ниже.
#html #a11y
Элемент
<label> предназначен для добавления подписи к элементам управления. Есть два способа: вложить элемент управления внутрь <label> или связать <label> и элемент управления через атрибуты for и id.Также есть 5 правил ARIA, первое из которых гласит: «используйте встроенные в HTML элементы и атрибуты для передачи нужной семантики вместо использования ARIA».
<label> — как раз пример такого встроенного элемента.<!-- вместо этого: -->
<span id="name-label">Имя</span>
<input
type="text"
name="name"
autocomplete="given-name"
autocapitalize="words"
aria-labelledby="name-label"
>
<!-- лучше сделать так: -->
<label for="name">Имя</label>
<input
type="text"
name="name"
autocomplete="given-name"
autocapitalize="words"
id="name"
>
Всё бы хорошо, но
<label> работает только со стандартными элементами управления: <input>, <select>, <textarea>, <button>, <meter>, <progress>, <output> и пользовательскими элементами, которые ассоциированы с формой.Это значит, что если по тем или иным причинам пришлось создать собственный элемент управления на основе ARIA, то использовать
<label> для привязки подписи к нему не получится. Подпись придётся также добавлять с помощью ARIA.<!-- это не сработает:
<label for="listbox">Пол</label>
-->
<!-- поэтому делают так: -->
<span id="listbox-label">Пол</span>
<div
role="listbox"
tabindex="0"
id="listbox"
aria-labelledby="listbox-label"
>
<!-- опции -->
</div>
Также кажется логичным использование
<label> для задания подписей не только к элементам управления, но и к контейнерам, у которых может быть указано имя. Сейчас для этого нужно использовать ARIA и следовать первому правилу не получается.<!-- Примеры иллюстративные,
не используйте их на реальных проектах! -->
<nav id="nav">
<!-- это не сработает -->
<label for="nav">Основная</label>
<!-- ссылки -->
</nav>
<section id="faq-section">
<h2>
<!-- это не сработает -->
<label for="faq-section">FAQ</label>
</h2>
<!-- список вопросов и ответов -->
</section>
<div role="group" id="socials">
<!-- это не сработает -->
<label for="socials">
Мы в социальных сетях
</label>
<!-- ссылки на социальные сети -->
</div>
<!-- это не сработает -->
<label for="formatting">
Форматирование текста
</label>
<div
role="toolbar"
id="formatting"
>
<!-- опции форматирования -->
</div>
Раз
<label> уже существует в HTML и может задавать имя для элемента управления через атрибут for, кажется, было бы полезно расширить эту функциональность и на другие элементы, где это уместно на основе роли элемента.Или нужен новый элемент, например
<name> (<caption> и <noscript> уже заняты), а <label> пусть остаётся только для стандартных элементов управления? Аналогичные идеи в сообществе были по поводу элемента <denoscription>.Что вы думаете по этому поводу? Проголосуйте в опросе ниже.
#html #a11y
❤1👾1
Как относитесь к идее расширения <label>?
Anonymous Poll
52%
<label> неплохо было бы расширить для привязки имени к разным элементам
11%
<label> должен остаться без изменений, лучше добавить новый элемент
9%
Пусть aria-label или aria-labelledby задают имя, если нет встроенного аналога
4%
Добавить глобальный атрибут label для указания имени
25%
Смотреть ответы
❤1👾1
Кнопки для CSS-карусели
В 135й версии Chrome появились CSS-карусели. С помощью Scroll Snap и новых псевдо-элементов можно создать функциональные карусели (и не только) с прокруткой, стрелками и маркерами, используя лишь HTML и CSS вместо тяжёлых JS-библиотек.
Звучит классно, но разработчики Chrome поторопились и выкатили реализацию, к которой в сообществе возникли вопросы. В частности, критиковалась доступность и использование псевдо-элементов в CSS для создания кнопок.
Многие высказались в пользу использования обычных HTML-кнопок. Я в том числе оставлял фидбек и предлагал использовать активно развивающийся API Invoker Commands, который уже внедрён в Chrome 135 и Firefox 144.
В мае началось обсуждение в OpenUI о добавлении новых команд для прокрутки. Затем последовал небольшой эксплейнер с описанием API. И на днях команда Chromium взялась за создание прототипа. Поэтому есть шансы, что это появится.
Что предлагается: 8 новых команд для прокрутки Scroll Snap контейнеров, на базе которых работает CSS-карусель. 4 команды для каждого направления плюс логические эквиваленты:
-
-
-
-
-
-
-
-
Выглядеть это будет вот так:
Кнопки привязываются к карусели через
Это делает кнопки полностью настраиваемыми: можно добавить классы, атрибуты, вложить иконки, поместить в контейнер и разместить в нужном месте. Сама карусель избавляется от псевдо-элементов-кнопок, хотя их всё ещё можно будет добавить.
Для начала функциональность ограничена прокруткой одной страницы по нужной оси. Но уже обсуждаются расширения: отключение при достижении крайних элементов, автоматическая привязка без
Использование обычных кнопок в сочетании с Invoker Commands — это именно то, как изначально должны были быть реализованы встроенные в платформу карусели на мой взгляд. Это понятнее, удобнее и доступнее кнопок, создаваемых в CSS.
#html #css
В 135й версии Chrome появились CSS-карусели. С помощью Scroll Snap и новых псевдо-элементов можно создать функциональные карусели (и не только) с прокруткой, стрелками и маркерами, используя лишь HTML и CSS вместо тяжёлых JS-библиотек.
Звучит классно, но разработчики Chrome поторопились и выкатили реализацию, к которой в сообществе возникли вопросы. В частности, критиковалась доступность и использование псевдо-элементов в CSS для создания кнопок.
Многие высказались в пользу использования обычных HTML-кнопок. Я в том числе оставлял фидбек и предлагал использовать активно развивающийся API Invoker Commands, который уже внедрён в Chrome 135 и Firefox 144.
В мае началось обсуждение в OpenUI о добавлении новых команд для прокрутки. Затем последовал небольшой эксплейнер с описанием API. И на днях команда Chromium взялась за создание прототипа. Поэтому есть шансы, что это появится.
Дисклеймер: это обзор раннего предложения новых функций. Синтаксис может измениться в будущем или от функций могут отказаться.
Что предлагается: 8 новых команд для прокрутки Scroll Snap контейнеров, на базе которых работает CSS-карусель. 4 команды для каждого направления плюс логические эквиваленты:
-
page-up-
page-down-
page-left-
page-right-
page-block-start-
page-block-end-
page-inline-start-
page-inline-endВыглядеть это будет вот так:
<style>
.carousel__track {
display: flex;
overflow-x: auto;
width: 300px;
scroll-snap-type: x mandatory;
}
.carousel__slide {
min-width: 300px;
scroll-snap-align: center;
}
</style>
<section
class="carousel"
aria-labelledby="related"
aria-roledenoscription="carousel"
>
<h2 id="related">Смотрите также</h2>
<div class="carousel__controls">
<button
type="button"
command="page-inline-start"
commandfor="track"
>
Предыдущий
</button>
<button
type="button"
command="page-inline-end"
commandfor="track"
>
Следующий
</button>
</div>
<div class="carousel__track" id="track">
<div
class="carousel__slide"
role="group"
aria-roledenoscription="slide"
aria-label="1 из 6"
>
<!-- Слайд 1 -->
</div>
<div
class="carousel__slide"
role="group"
aria-roledenoscription="slide"
aria-label="2 из 6"
>
<!-- Слайд 2 -->
</div>
<!-- остальные слайды -->
</div>
</section>
Кнопки привязываются к карусели через
commandfor. Нажатие приводит к вызову системной команды на карусели «прокрутить одну страницу» в зависимости от направления. В конечном итоге это приводит к прокрутке слайдов с учётом точек привязки.Это делает кнопки полностью настраиваемыми: можно добавить классы, атрибуты, вложить иконки, поместить в контейнер и разместить в нужном месте. Сама карусель избавляется от псевдо-элементов-кнопок, хотя их всё ещё можно будет добавить.
Для начала функциональность ограничена прокруткой одной страницы по нужной оси. Но уже обсуждаются расширения: отключение при достижении крайних элементов, автоматическая привязка без
commandfor, «scroll to top» и количество страниц.Использование обычных кнопок в сочетании с Invoker Commands — это именно то, как изначально должны были быть реализованы встроенные в платформу карусели на мой взгляд. Это понятнее, удобнее и доступнее кнопок, создаваемых в CSS.
#html #css
❤13💩1👾1
You don't know HTML: <time> и <data>
В HTML есть два редких элемента:
Стандарт HTML говорит, что текст внутри
Атрибут позволяет сохранить машиночитаемые данные для поисковых роботов, ИИ, и других потребителей, а пользователям показывать человекочитаемые данные или относительные значения «вчера», «5 минут назад», «на прошлой неделе».
У
Человекочитаемый контент указывается внутри элемента, а машиночитаемая альтернатива в атрибуте
Есть ведь универсальные
Добавление
Может показаться, что элементы помогут программам чтения с экрана правильно обработать данные. Предположение логичное, но ложное.
Возможно, со временем поддержка семантических элементов уровня текста во вспомогательных технологиях улучшится. Тогда
А пока у
#ydkhtml
В HTML есть два редких элемента:
<time> и <data>. Первый ещё можно встретить в разметке, где думают о семантике. Второй практически не встретить. Оба элемента объединяет возможность добавления машиночитаемых данных.<time> предназначен для разметки дат, времени, временных зон и длительностей в формате ISO 8601. Это международный стандарт, который могут распознавать различные системы. Вот несколько примеров:<!-- дата с годом -->
<time>2025-11-14</time>
<!-- месяц и день без года -->
<time>11-14</time>
<!-- время без секунд -->
<time>17:03</time>
<!-- дата и время с секундами -->
<time>2025-11-14T17:03</time>
<!-- временная зона -->
<time>+0300</time>
<!-- длительность -->
<time>2h 13m 42s</time>
Стандарт HTML говорит, что текст внутри
<time> должен соответствовать формату (по сути ISO 8601). Если это не так, то дата/время/длительность в нужном формате должна быть указана в атрибуте datetime. Это позволяет парсить данные.<!-- валидная строка по ISO 8601 -->
<time>2025-11-14 17:03</time>
<!-- невалидная строка по ISO 8601,
но валидная указана в атрибуте -->
<time datetime="2025-11-14 17:03">
Четверг, 14 ноября, 17:03
</time>
Атрибут позволяет сохранить машиночитаемые данные для поисковых роботов, ИИ, и других потребителей, а пользователям показывать человекочитаемые данные или относительные значения «вчера», «5 минут назад», «на прошлой неделе».
У
<data> похожая задача: показать человекочитаемые данные и предоставить машиночитаемую альтернативу. Разница в том, что <data> не привязан ни к какому стандарту и формату, поэтому принимает произвольные данные.Человекочитаемый контент указывается внутри элемента, а машиночитаемая альтернатива в атрибуте
value.<!-- даты допустимы, но лучше
использовать <time> -->
<p>
Дата публикации:
<data value="2025-11-14">
Четверг, 14 ноября 2025
</data>
</p>
<!-- идентификатор, модель, артикул,
SKU, или url handle товара -->
<h2>
<data value="GA-B419SWGL">
Холодильник LG GA-B419SQGL
</data>
</h2>
<!-- код валюты в ISO 4217
и неформатированная цена -->
<p>
Price:
<data value="USD">$</date>
<data value="119999">1.199,99</data>
</p>
<!-- Price: $1.199,99 -->
Есть ведь универсальные
data-* атрибуты, которые можно использовать для хранения машиночитаемых данных у любых элементов? Это так, но они семантически нейтральные, в отличие от datetime у <time> и value у <data>.Добавление
data-* атрибута не значит, что это машиночитаемые данные, которые связаны с контентом. Это просто произвольные данные. <time datetime> и <data value> обладают конкретной семантикой.Может показаться, что элементы помогут программам чтения с экрана правильно обработать данные. Предположение логичное, но ложное.
<time> и <data> — элементы со встроенной ролью generic, поэтому работают как <span>.Возможно, со временем поддержка семантических элементов уровня текста во вспомогательных технологиях улучшится. Тогда
<time> и <data> будут предоставлять дополнительный контекст. А пока у
<time> и <data> есть только теоретическая польза. Также они могут быть полезны для считывания и обработки в JS, как альтернатива data-* атрибутам. Для ИИ и парсеров контент тоже будет чуть более понятным.#ydkhtml
ИСО
ИСО - ISO 8601 — Представление дат и времени
Используйте международно признанный формат представления даты и времени.
👍6👌5❤4👾4