Большинство элементов интерфейса, созданных браузером, можно в некоторой степени настроить с помощью CSS. Даже если для работы сайта требуются современные функции, он будет корректно работать в старых браузерах, поэтому полифил или резервный вариант часто не требуются.
Прежде чем воссоздавать элементы интерфейса браузера (элементы управления формой, полосы прокрутки, выделения, сообщения об ошибках и т. д.), убедитесь, что:
- Интерфейс браузера нельзя настроить в соответствии с вашими потребностями даже с помощью современного CSS.
- желаемая настройка достаточно критична, чтобы оправдать компромиссы воссоздания встроенного пользовательского интерфейса — в первую очередь потерю доступной семантики, обработки клавиатуры, IME и интеграции AT, которые нативный пользовательский интерфейс предоставляет бесплатно.
Примеры возможных настроек:
- Используйте
::selection, чтобы настроить цвета выделенного текста. - НЕ применяйте
user-select: noneк тексту контента. Это нарушает работу копирования и вставки, инструментов перевода и жестов вспомогательных технологий "читать отсюда". Ограничьте его элементами интерфейса (маркеры перетаскивания, панели инструментов, лишние подписи к кнопкам). - Используйте
accent-color, чтобы применить цвет акцента страницы к любому элементу интерфейса, созданному браузером. - Используйте
color-scheme, чтобы интерфейс браузера адаптировался к светлой или тёмной теме. - Используйте
scrollbar-color, чтобы настроить цвета полосы прокрутки, иscrollbar-width, чтобы управлять ее толщиной. Бегунок должен быть хорошо виден на фоне полосы (≥3:1). Не устанавливайтеscrollbar-width: noneдля прокручиваемых областей (используйте это свойство, только если прокрутка полностью заменена другим элементом). - Для стилизации валидности используйте
:user-invalid/:user-valid, а не:invalid/:valid. Они срабатывают только после того, как пользователь взаимодействовал с полем, что позволяет избежать пометки обязательных пустых полей как ошибок при загрузке страницы. Исключите ползунки диапазонов при таргетинге наinput(например,input:not(input[type="range"]):user-valid), чтобы при настройке ползунка к нему не применялись границы или фоны допустимости поля. - Кнопки и текстовые поля (включая
<textarea>) обычно можно стилизовать как обычные элементы. - Используйте
font-sizeдля масштабирования и другие текстовые свойства для управления типографикой.
Стилизация текстовых полей (<input> и <textarea>)
Для большинства целей стилизации (например, цвета, границы, фон, типографика и т.д.) рассматривайте эти элементы как обычные текстовые контейнеры.
- Используйте
:placeholder-shownи::placeholder, чтобы задать стиль плейсхолдеров. - Используйте
field-sizing: content, чтобы размер текстовых полей соответствовал контенту. - Для элементов
<textarea>используйтеresize: vertical, чтобы отключить изменение размера по горизонтали, илиresize: none, чтобы отключить изменение размера по горизонтали и вертикали.
Элементы управления с несколькими вариантами ответа (выбор, переключатели, флажки)
- Чтобы выбрать один из вариантов в раскрывающемся списке, используйте
<select>+appearance: base-select+::picker(select). Подробнее о стилях для брендированных селекторов… - Выбор одного или нескольких вариантов из нескольких, расположенных на странице в ряд: используйте
<input type=checkbox>или<input type=radio>внутри<label>для каждого варианта. Стиль черезlabel:has(:checked). - Задайте стиль флажков, переключателей и радиокнопок с помощью
appearance: noneи сгенерированного контента (::before/::after) или фоновых изображений, чтобы показать выбранное состояние.
Нетекстовые элементы <input> (кнопки, ползунки, поля ввода файлов и т. д.)
- Ввод файлов: используйте
::file-selector-button, чтобы задать стиль кнопки. - Не используйте
<input>со значениемtype, равнымbutton,submitилиreset. Используйте вместо него<button>и задайте стиль как для обычного элемента. - Ползунки. Используйте
appearance: none+ псевдоэлементы thumb (::-webkit-slider-thumb,::-moz-range-thumbи т. д.) и псевдоэлементы track (::-webkit-slider-runnable-track,::-moz-range-trackи т. д.) для более точного управления.