Анатомия React компонента
Моё видение того, как должен выглядеть React компонент
421
7 мин.
Стандарт SSB определяет требования к семантике, доступности и логике работы кнопок.
<button>. Элементы <div> и <span> с обработчиками событий не заменяют кнопку: они не получают её поведение с клавиатуры и семантику автоматически.type указывается явно для каждой кнопки. Его значение отражает действие, а не только расположение кнопки:
type="submit" — отправка связанной формы;type="button" — действие интерфейса без отправки или сброса формы;type="reset" — возврат элементов формы к исходным значениям.type может привести к отправке формы: значение по умолчанию зависит от контекста и связи кнопки с формой. Кнопка может быть связана с формой через атрибут form, даже если она расположена вне <form>.type="reset" применяется только тогда, когда возврат к исходным значениям является ожидаемым действием. Такой сброс не обязательно очищает поля: элементам формы восстанавливаются значения по умолчанию.role="group" с доступным именем; для набора связанных полей формы подходит <fieldset> с <legend>.role="toolbar" используется для настоящей панели инструментов, а не как универсальная замена группе. Такая панель реализует клавиатурное перемещение между элементами стрелками и соответствующее управление фокусом.aria-pressed="true" или aria-pressed="false". Если подпись меняется, например с «Воспроизвести» на «Приостановить», aria-pressed обычно не добавляется.aria-label или aria-labelledby.aria-hidden="true". Дублирующее имя через aria-label не добавляется без необходимости.Enter и Space. Пользовательские обработчики не должны нарушать стандартную клавиатурную активацию или вызывать одно действие дважды.:focus-visible; его контраст и видимость проверяются на всех используемых фонах.:hover, :active, :focus-visible и :disabled должны различаться визуально там, где они применимы. Состояние наведения не используется как единственный способ показать действие: оно недоступно при касании и не заменяет состояния фокуса или нажатия.disabled используется для нативного недоступного состояния. В отличие от aria-disabled="true", он блокирует активацию кнопки и исключает её из обычной последовательности фокуса.aria-disabled="true" применяется только при необходимости оставить недоступную кнопку в последовательности фокуса. В этом случае блокировка действия и его обработчика должна быть реализована отдельно.disabled, пока операция выполняется.aria-busy="true" указывает, что соответствующий элемент обновляется, но сам по себе не гарантирует объявление текста загрузки. Изменение статуса передаётся отдельно, например через элемент role="status".aria-busy сбрасывается, кнопка возвращается в актуальное состояние, а результат или ошибка становятся доступны пользователю.cursor: pointer, а для отключённых — cursor: not-allowed. Курсор является только визуальной подсказкой и не заменяет семантику или состояния кнопки.1px. Эффект не должен мешать восприятию текста, фокуса или других состояний.prefers-reduced-motion: reduce, если движение не необходимо для понимания изменения состояния.24 × 24 CSS-px либо должно выполняться одно из предусмотренных критерием исключений, например достаточный интервал между соседними целями.type; отдельно проверяется поведение кнопок внутри формы и кнопок, связанных с ней через атрибут form.:hover, :active, :focus-visible, disabled и загрузки различимы и не зависят только от цвета или курсора.role="toolbar" дополнительно проверяются навигация стрелками, управление фокусом и поведение клавиш Tab.Явно заданные типы кнопок:
<form action="/subscribe" method="post">
<button type="submit">Подписаться</button>
<button type="reset">Вернуть исходные значения</button>
</form>
<button type="button">Открыть настройки</button>Кнопка только с иконкой и группа кнопок:
<button type="button" aria-label="Удалить">
<svg aria-hidden="true" viewBox="0 0 24 24">...</svg>
</button>
<div role="group" aria-label="Форматирование">
<button type="button" aria-pressed="false">Жирный</button>
<button type="button" aria-pressed="false">Курсив</button>
<button type="button" aria-pressed="false">Подчёркнутый</button>
</div>Состояния кнопки и клавиатурный фокус:
button:enabled {
cursor: pointer;
transition: transform 120ms ease;
}
button:disabled {
cursor: not-allowed;
}
button:hover:enabled {
background-color: #e0e0e0;
}
button:active:enabled {
background-color: #d0d0d0;
transform: translateY(1px);
}
button:focus-visible {
outline: 2px solid currentColor;
outline-offset: 2px;
}
@media (prefers-reduced-motion: reduce) {
button {
transition: none;
}
}Цвет индикатора фокуса и фона выбирается с учётом контраста в интерфейсе. Псевдокласс :focus-visible зависит от эвристик браузера и может отображаться не только при вводе с клавиатуры.
Асинхронная операция с отдельным статусом:
<div aria-busy="true">
<button type="submit" disabled>Сохранение...</button>
</div>
<p role="status">Изменения сохраняются</p>aria-busy обозначает обновляемую область, а role="status" сообщает об изменении статуса без принудительного перемещения фокуса. После завершения операции область перестаёт быть занятой, кнопка обновляется, а статус сообщает о результате.
Похожие категории:
Моё видение того, как должен выглядеть React компонент
421
7 мин.
Стандарт SST-A определяет требования к семантике, доступности и логике работы табов
62
6 мин.
Стандарт SSF-U определяет требования к семантике, доступности и логике работы фуллскрина
248
2 мин.
Стандарт SSA определяет требования к семантике, доступности и логике работы аккордеона
258
2 мин.
Разбор критических ошибок веб-дизайна. Почему слайдеры, автоплей и тяжёлые страницы снижают конверсию и позиции в Google и Yandex
232
1 мин.
Стандарт SSP определяет требования к семантике, доступности и логике работы пагинации
240
1 мин.