Группа кнопок
Группа объединяет несколько связанных кнопок в один компактный элемент: соседние границы сливаются, внешние углы сохраняют радиус кнопок. Берите её для близких по смыслу действий над одним объектом; для выбора одного значения из нескольких есть Smart-компонент Button Group.
Пример
Разметка
Минимальную разметку показывает пример выше: контейнер
<div class="sf-button-group"> и прямые дочерние
кнопки sf-button.
- Кнопки лежат прямыми потомками контейнера: группа соединяет только их.
- Контейнеру нужно доступное имя —
aria-labelилиaria-labelledby. Рольgroupскрипт компонента ставит сам, если роли нет. - Скрипт расставляет кнопкам классы сегментов
segment-start,segment-middleиsegment-endпо их порядку и обновляет их при добавлении и удалении кнопок. Писать эти классы вручную не нужно. - Все кнопки группы берут один размер и одну схему; вид может отличаться, например у выбранного действия.
- Группа не переносится на новую строку: если кнопки не помещаются по ширине, она прокручивается по горизонтали.
Варианты
Ориентация
По умолчанию кнопки стоят в строку. Атрибут data-orientation="vertical" на
контейнере ставит их в столбец: кнопки занимают общую ширину группы и
сохраняют один внешний контур. Вертикальная группа подходит узкой боковой
панели. Атрибут aria-orientation="vertical" скрипт понимает так же, но
сам переносит значение в data-orientation.
data-orientation="horizontal"
data-orientation="vertical"
Состояния
Нажатая кнопка
Кнопка с aria-pressed="true" или классом active поднимается над соседями:
её граница рисуется поверх общих границ группы. aria-pressed ставьте
только настоящей кнопке-переключателю, которая включает и выключает свой
параметр независимо от остальных. Исключение — группа выбора темы из кнопок
sf-theme-button с data-theme: aria-pressed в ней ставит сам Framework,
нажата кнопка выбранного режима (см. Тема).
Фокус
При переходе клавишей Tab кольцо фокуса рисуется внутри текущей кнопки и
поверх общих границ, поэтому соседние сегменты его не обрезают. Щелчок мышью
кольца не показывает. В примере фокус показан классом focus-visible, который
CSS читает наравне с :focus-visible.
Доступность
- Контейнер с ролью
groupи доступным именем сообщает, что кнопки связаны. - Каждая кнопка остаётся отдельной точкой Tab и сохраняет своё нативное действие: группа не перехватывает нажатия.
- Для выбора одного значения из нескольких не собирайте radio-семантику
вручную: Smart Button Group создаёт
radiogroupи управляет одной точкой Tab. Рольtoolbarставьте только настоящей панели инструментов с полной клавиатурной моделью стрелок. aria-orientationскрипт оставляет только ролям, которые его поддерживают (toolbar,radiogroup,tablist,menu,listbox,tree); у ролиgroupон его снимает.- Внешние углы и границы сегментов зеркалятся при письме справа налево.
JavaScript
Скрипт компонента находит группы .sf-button-group при загрузке страницы,
расставляет роль, ориентацию и классы сегментов и следит за изменением
состава группы. Для разметки, вставленной позже, он даёт две функции:
SF.ButtonGroup.init(target)— подключает все группы внутриtarget(по умолчаниюdocument) и самtarget, если это группа;SF.ButtonGroup.sync(group)— один раз пересчитывает роль, ориентацию и сегменты одной группы.
Событий компонент не отправляет. Объект SF.ButtonGroup появляется вместе со
скриптом компонента; Loader подключает его, когда находит .sf-button-group.
SF.Loader появляется к событию sf-loader-init на window, а
SF.Loader.ready('ButtonGroup', callback) вызывает функцию, когда компонент
зарегистрирован:
const whenLoader = (run) => (window.SF?.Loader ? run() : window.addEventListener('sf-loader-init', run, {once: true}));
whenLoader(() => SF.Loader.ready('ButtonGroup', () => {
SF.ButtonGroup.init(document.querySelector('#toolbar-area'));
}));
Классы
| Что | Классы |
|---|---|
| Блок | sf-button-group |
| Части | sf-button-group-count, sf-button-group-icon-only, sf-button-group-label--hidden, sf-button-group-segment |
| Модификаторы | sf-button-group--full-width, sf-button-group--on-surface, sf-button-group--plate-raised, sf-button-group--primary, sf-button-group--secondary, sf-button-group--segmented |
| Размеры | sf-button-group--size-1/2, sf-button-group--size-1/3, sf-button-group--size-2, sf-button-group--size-3 |
Классы и переменные собраны из CSS выпуска и обновляются вместе с ним.
Переменные
Настройка
Эти переменные — поверхность настройки компонента. Их имена стабильны: переименовать или убрать такую переменную можно только через журнал изменений, с предупреждением, как атрибут. Framework их не задаёт, поэтому значение можно поставить на сам компонент (.sf-button-group) или на любого предка. Переменные действуют на спокойный вид; наведение, фокус, нажатие, недоступность и ошибка рисуются поверх, поэтому состояния остаются видны.
| Переменная | Что задаёт | По умолчанию |
|---|---|---|
--sf-button-group-background-color |
Заливка дорожки сегментированного вида в спокойном состоянии. | var(--sf-surface-container); зависит от вида |
--sf-button-group-padding |
Внутренний отступ дорожки сегментированного вида со всех сторон, он же промежуток между сегментами; скругление плашки остаётся концентричным. | var(--sf-a4); зависит от вида, размера |
--sf-button-group-color |
Цвет подписи и иконки невыбранного сегмента в спокойном состоянии; наведение, нажатие и недоступность сохраняют свои цвета. | var(--sf-on-surface-container--variant); зависит от вида |
--sf-button-group-plate-background-color |
Заливка плашки под выбранным сегментом; недоступность сохраняет свою. | var(--sf-primary); зависит от вида, схемы |
--sf-button-group-plate-color |
Цвет подписи, иконки и числа на плашке выбранного сегмента. | var(--sf-on-primary); зависит от вида, схемы |
--sf-button-group-count-color |
Цвет числа в невыбранном сегменте; выбранный берёт цвет содержимого плашки. | currentColor; зависит от вида |
.sf-button-group {
--sf-button-group-background-color: var(--sf-surface-container);
}
Устройство
Остальные переменные — внутренняя проводка компонента: модификаторы задают им значения, а части их читают. Их имена и устройство могут меняться в любом выпуске, поэтому проект их не задаёт. Значение по умолчанию — из базового правила блока (.sf-button-group); переменную без него задают только модификаторы.
| Переменная | По умолчанию | Задаёт |
|---|---|---|
--sf-button-group--count-gap |
не задана; задают модификаторы, например .sf-button-group.sf-button-group--segmented: var(--sf-ui-1--text-space-x) |
margin-inline-start |
--sf-button-group--padding |
не задана; задают модификаторы, например .sf-button-group.sf-button-group--segmented: var(--sf-button-group-padding, var(--sf-a4)) |
gap, padding, border-radius |
--sf-button-group--plate-radius |
не задана; задают модификаторы, например .sf-button-group.sf-button-group--segmented: var(--sf-button-radius, var(--sf-radius--ui)) |
border-radius |
--sf-button-group--text-height |
не задана; задают модификаторы, например .sf-button-group.sf-button-group--segmented: var(--sf-text-height-1) |
line-height |
--sf-button-group--text-size |
не задана; задают модификаторы, например .sf-button-group.sf-button-group--segmented: var(--sf-text-size-1) |
font-size |