Настраиваемый API выбора предлагает декларативный способ оформления элементов <select> на основе CSS, который идеально соответствует системе проектирования вашего бренда. Включив appearance: base-select, вы получите доступ к внутренней теневой модели DOM элемента select. Это позволит вам настраивать стили кнопки, списка выбора вариантов, значка стрелки и индикатора галочки с помощью стандартных свойств CSS.
Раньше, чтобы создать полностью брендированный элемент select, приходилось переписывать его с нуля на JavaScript. Это часто нарушало доступность, навигацию с клавиатуры и интеграцию с нативными формами. С помощью appearance: base-select вы можете настроить внешний вид, а браузер будет управлять фокусом, отрисовкой верхнего слоя и привязками специальных возможностей.
Как реализовать
Чтобы реализовать стили для брендированного выбора:
- Включите настройку. Примените
appearance: base-selectк элементу<select>и псевдоэлементу::picker(select)(который нацелен на раскрывающийся список вариантов). - Структурируйте настраиваемую кнопку (необязательно). Определите элемент
<button>непосредственно внутри<select>, чтобы заменить триггер по умолчанию. Используйте элемент<selectedcontent>внутри этой кнопки, чтобы представить текст или контент выбранного параметра. - Оформление списка выбора. Используйте псевдоэлемент
::picker(select), чтобы настроить типографику, цвета фона, границы и тени для раскрывающегося списка. Браузер отображает его на верхнем слое, что позволяет избежать конфликтовz-index. - Внутренние значки стилей:
- Используйте
select::picker-icon, чтобы изменить стиль или заменить значок стрелки. - Используйте
option::checkmark, чтобы настроить стиль флажка рядом с активным вариантом.
- Используйте
- Настройки стиля. Примените стили к элементам
<option>для состояний при наведении, полей и макета.
Пример кода: выбор брендированной курьерской службы
В примере ниже показан пользовательский элемент select, оформленный с использованием моноширинного шрифта и пунктирных границ, чтобы соответствовать эстетике бренда parcel.
/* Enable customization for the select and its picker */
.brand-select,
.brand-select::picker(select) {
appearance: base-select;
}
/* Style the visible trigger button */
.brand-select {
font-family: 'Courier New', monospace;
background-color: #fffaf0;
color: #8b4513;
border: 2px dashed #8b4513;
border-radius: 4px;
padding: 0.75rem;
font-size: 1rem;
cursor: pointer;
}
/* Style the dropdown options list */
.brand-select::picker(select) {
font-family: 'Courier New', monospace;
background-color: #fffaf0;
border: 2px dashed #8b4513;
border-radius: 4px;
padding: 0.5rem;
}
/* Customize internal part colors to match text */
.brand-select::picker-icon {
color: #8b4513;
}
.brand-select option::checkmark {
color: #8b4513;
}
/* Style individual options and hover effects */
.brand-select option {
padding: 0.5rem;
border-radius: 4px;
color: #8b4513;
cursor: pointer;
}
.brand-select option:hover {
background-color: #fdf5e6;
}
<label for="preferences">Select shipping preference</label>
<select class="brand-select" id="preferences" name="preferences">
<button>
<selectedcontent></selectedcontent>
</button>
<option value="standard">Standard Shipping</option>
<option value="express" selected>Express Shipping</option>
<option value="overnight">Overnight Delivery</option>
</select>
Стратегическое внедрение и рекомендации
- ИСПОЛЬЗУЙТЕ
appearance: base-select, если в вашей системе проектирования требуется высокая точность и визуальная согласованность всех элементов управления формой, которую невозможно достичь с помощью стандартных переопределений select в разных браузерах. - НЕ используйте этот атрибут, если вы полагаетесь на встроенный инструмент выбора операционной системы (например, стандартное колесо прокрутки на iOS-устройствах). Если вы включите
base-select, то вместо элементов управления пользовательского интерфейса на мобильных устройствах будут использоваться меню верхнего уровня, отрисованные в браузере. - Проверяйте, соответствует ли контрастность цветов стандартам WCAG. Вы можете выбрать любой цвет, но должны убедиться, что текст на таком фоне будет читаемым.
- Протестируйте поведение макета. Значение
appearance: base-selectотменяет стандартное поведение браузера, при котором размер элемента select определяется по ширине самого длинного варианта. Чтобы предотвратить смещение макета, может потребоваться задать фиксированную ширину или использовать ограничения flex/grid. - Убедитесь, что у элемента
<select>есть атрибутnameи связанный с ним элемент<label>. Это гарантирует, что даже при наличии пользовательского интерфейса компонент останется доступным для программ чтения с экрана и будет корректно работать со стандартными отправками форм. - Используйте стандартные атрибуты
valueдля вариантов, чтобы отправка формы работала так же, как и раньше.
Резервные стратегии
Резервные объявления и поддержка браузеров для настраиваемых <select>
В браузерах, которые пока не поддерживают appearance: base-select, элемент <select> преобразуется в стандартный раскрывающийся список операционной системы.
- Игнорирование нетекстового контента. Старые браузеры удаляют HTML-теги (например,
<svg>или<div>) внутри тегов<option>и отображают только текстовые узлы. Убедитесь, что текстовый контент элемента<option>понятен и имеет смысл сам по себе. - Обработка структуры HTML. Стандартные синтаксические анализаторы могут игнорировать теги
<button>и<selectedcontent>внутри<select>или считать их недопустимыми. Если вы рассматриваете стандартный текст как резервный вариант, то для прогрессивного улучшения не требуются тяжелые полифилы JavaScript.
document.addEventListener("DOMContentLoaded", () => {
// Check if browser supports base-select value
if (!CSS.supports("appearance", "base-select")) {
// Custom select overrides are not supported natively.
}
});