Переключатель
Переключатель включает или выключает одну настройку, и изменение применяется сразу. Кнопки «Сохранить» нет.
<tk-switch checked helper="Applies to all new uploads">Auto-enhance photos</tk-switch>
Анатомия
| Часть | Что это |
|---|---|
tk-switch |
сам элемент; одна остановка Tab |
| слот по умолчанию | подпись перед дорожкой, обязательна; она же доступное имя, в ней может быть ссылка |
| подсказка | необязательный текст под подписью |
| дорожка | скруглённая полоса; акцентная во включённом виде, серая в выключенном |
| ползунок | белая скруглённая плашка, которая уходит на сторону «вкл» или «выкл» |
| знаки ✓ и ✕ | внутри дорожки; вместе с положением ползунка показывают состояние без цвета |
| индикатор загрузки | рядом с дорожкой, пока задан loading |
Вся строка, подпись и дорожка, нажимается целиком. Длинная подпись переносится, а дорожка остаётся на уровне её первой строки. В интерфейсах справа налево всё отражается зеркально.
Размеры
<tk-switch>Show previews</tk-switch> <tk-switch size="small">Compact rows</tk-switch>
size |
Дорожка | Ползунок |
|---|---|---|
medium (по умолчанию) |
40 × 20px | 20 × 16px |
small |
32 × 16px | 16 × 12px |
Строка в обоих размерах не ниже 24px. small берите только для плотных списков настроек.
Подпись и подсказка не меняют размер.
Состояния
<tk-switch checked>Wi-Fi</tk-switch> <tk-switch checked disabled>Essential cookies</tk-switch> <tk-switch loading>Sync over cellular</tk-switch>
При наведении дорожка меняет оттенок. При фокусе с клавиатуры вокруг дорожки появляется рамка.
checked: начальное состояние. Нажатие его переключает; текущее состояние читайте из свойстваchecked.disabled: на переключатель нельзя перейти, его нельзя изменить. Подходит для настроек, которые обязаны оставаться включёнными, и для строк, выключенных родительской настройкой. Отключённая дорожка серая и во включённом, и в выключенном виде, а в тёмной теме они одного цвета, поэтому состояние показывают ползунок и знак ✓ или ✕.loading: переключатель сохраняет текущее состояние, не реагирует на ввод и остаётся в фокусе. Рядом появляется индикатор, а если ожидание дольше 2 секунд, скринридер произносит «Loading».
Состояния ошибки нет. Если сохранить не удалось, оставьте переключатель как был и сообщите
о проблеме в другом месте, например в
Сохранение на сервер
Чтобы переключатель сработал только после успешного сохранения, отмените нажатие, покажите
loading и поставьте checked сами:
<tk-switch id="sync">Sync over cellular</tk-switch>
<script>
const sync = document.querySelector('#sync');
sync.addEventListener('click', async (e) => {
e.preventDefault();
sync.loading = true;
const next = !sync.checked;
if (await save(next)) sync.checked = next;
sync.loading = false;
});
</script>Без обработчика переключатель срабатывает сразу. Так и нужно для настроек, которые хранятся на устройстве.
Списки настроек
Переключатели друг под другом — это ваша вёрстка; каждый работает сам по себе. Если строк
больше пяти, добавьте заголовки разделов. Если один переключатель управляет остальными,
ставьте disabled на зависимые строки, пока он выключен. С label-hidden подпись всё равно
должна называть настройку.
Когда использовать
- Переключатель — для одной настройки, которая срабатывает в момент переключения.
- Если изменение ждёт кнопки «Сохранить» или «Отправить», нужен
Checkbox . Переключатель в такой форме показывает несохранённое состояние. - Если вариантов больше двух, берите
Radio group илиSelect . - Если обоим вариантам нужна видимая подпись, например единицам измерения или периоду
оплаты, берите
Segmented control . - Если изменение нужно подтвердить или его нельзя отменить, нужна
Button . - Не меняйте существующие чекбоксы на переключатели ради внешнего вида.
Текст
- Называйте настройку, а не состояние или действие: «Улучшать фото автоматически», а не «Включено» или «Включить улучшение». Если просится глагол, нужна кнопка.
- Формулируйте так, чтобы «вкл» значило, что названное происходит.
- Подпись не меняется при переключении.
- Подписи короткие, заглавная буква только в начале, без точки в конце.
- Подсказка — одно короткое предложение, без точки и без ссылок. Пояснения пишите в ней, а не во всплывающей подсказке.
Можно / нельзя
| ✅ Можно | ❌ Нельзя |
|---|---|
| Переключатель, только когда изменение применяется сразу | Переключатель в форме, которая ждёт «Сохранить» |
| Название настройки: «Улучшать фото автоматически» | Состояние или действие: «Включено», «Включить» |
Держать переключение с loading, пока сохранение не прошло |
Переключить сразу и вернуть при ошибке |
| Ошибку сохранения показать в своём интерфейсе | Ждать от переключателя состояния ошибки |
| Обратимые изменения | Удалять или подтверждать что-то переключателем |
| Закреплённую настройку показать включённой и отключённой | Прятать настройки, которые нельзя изменить |
Связанные
Checkbox : вкл/выкл в форме, применяется при отправке.Radio group : ровно один из нескольких вариантов.Segmented control : два или больше подписанных варианта, которые применяются сразу.Spinner : индикатор, который показываетloading.
API
Атрибуты
| Атрибут | Тип | По умолчанию | Что делает |
|---|---|---|---|
checked |
boolean | false |
начальное состояние; свойство показывает текущее |
disabled |
boolean | false |
не в фокусе, не меняется |
loading |
boolean | false |
держит состояние, не реагирует на ввод, остаётся в фокусе, показывает индикатор |
loading-label |
string | Loading |
что услышит скринридер через 2 секунды loading |
size |
medium | small |
medium |
дорожка 40 × 20 или 32 × 16px |
helper |
string | подсказка под подписью | |
label-hidden |
boolean | false |
прячет подпись с экрана, доступное имя остаётся |
Слоты
| Слот | Содержимое |
|---|---|
| по умолчанию | подпись, обязательна; может содержать ссылки, нажатие на них не переключает |
События
change срабатывает, когда пользователь переключает нажатием, Space или Enter, но не
когда checked меняет ваш код. Новое состояние читайте из checked. Чтобы не дать
переключиться, вызовите preventDefault() на click. Переключатель не поле формы: у него
нет name и value, он ничего не отправляет.
CSS
::part(row): строка с подписью и дорожкой, область нажатия.::part(control): внутренняя кнопка-переключатель: дорожка, ползунок и знаки.
Токены
| Состояние | Дорожка | Ползунок | Знаки | Подпись |
|---|---|---|---|---|
| выключен | fill/default; при наведении fill/hover |
icon/accent/on-fill + shadow-1 |
✕ icon/secondary |
text/default |
| включён | fill/accent; при наведении fill/accent/hover |
icon/accent/on-fill + shadow-1 |
✓ icon/accent/on-fill |
text/default |
| отключён, выключен | surface/disabled |
icon/disabled |
icon/disabled |
text/disabled |
| отключён, включён | fill/disabled |
icon/disabled |
icon/disabled |
text/disabled |
Рамка фокуса border/accent/focus. Подсказка text/secondary, индикатор icon/secondary.
В контрастной теме у выключенной дорожки появляется край 1px border/default. Углы дорожки
и ползунка radius-full. Значения по темам:
Доступность
Встроено:
- Настоящая кнопка с
role="switch": скринридер говорит «переключатель, вкл» или «выкл». - Tab доходит до каждого переключателя;
SpaceиEnterпереключают. Нажатие на подпись тоже переключает. - Состояние видно без цвета: по положению ползунка и знаку ✓ или ✕.
- Подсказка читается вместе с переключателем.
loadingставитaria-busy. - Строка не ниже 24px, рамка фокуса никогда не прячется. При уменьшенной анимации ползунок перескакивает, а не едет.
На вашей стороне:
- Применяйте изменение сразу при переключении; иначе берите чекбокс.
- При сохранении на сервер переключайте только после успеха, а ошибки показывайте в своём интерфейсе.
- Подпись в обоих состояниях одна и та же.
| Клавиша | Действие |
|---|---|
Tab |
переводит фокус на переключатель |
Space / Enter |
включает или выключает его |
Пределы контраста
- Выключенная дорожка: 1.33:1 к фону страницы в светлой теме, 1.82:1 в тёмной и 1.50:1 в контрастной. Состояние передают ползунок и знак ✕, не ниже 3.45:1.
- Отключённый: в тёмной теме включённая и выключенная дорожки одного цвета; различают их только положение ползунка и знаки.