Компонент Switch (переключатель) используется для управления булевыми состояниями интерфейса — включено/выключено. В отличие от чекбоксов, переключатели чаще применяются для мгновенных изменений, которые не требуют дополнительного подтверждения, и визуально имитируют физические тумблеры.
Switch применяется в следующих сценариях:
Ключевые особенности:
true / false)Простейшая реализация Switch может быть построена на основе обычного
input type="checkbox" с кастомным стилем.
<script>
let checked = false;
</script>
<label class="switch">
<input type="checkbox" bind:checked>
<span class="slider"></span>
</label>
<p>Состояние: {checked ? 'Включено' : 'Выключено'}</p>
<style>
.switch {
position: relative;
display: inline-block;
width: 50px;
height: 26px;
}
.switch input {
display: none;
}
.slider {
position: absolute;
cursor: pointer;
background-color: #ccc;
border-radius: 26px;
inset: 0;
transition: 0.3s;
}
.slider::before {
content: "";
position: absolute;
height: 20px;
width: 20px;
left: 3px;
top: 3px;
background: white;
border-radius: 50%;
transition: 0.3s;
}
input:checked + .slider {
background-color: #4caf50;
}
input:checked + .slider::before {
transform: translateX(24px);
}
</style>
Svelte предоставляет реактивную привязку через
bind:checked, что делает управление состоянием максимально
простым.
<input type="checkbox" bind:checked={enabled}>
Особенности:
Для более сложной логики можно использовать события:
<input
type="checkbox"
bind:checked={enabled}
on:change={(e) => handleToggle(e.target.checked)}
>
function handleToggle(value) {
console.log('Новое состояние:', value);
}
Switch должен быть доступен для всех пользователей:
role="switch"aria-checkedПример:
<button
role="switch"
aria-checked={checked}
on:click={() => checked = !checked}
class:active={checked}
>
{checked ? 'ON' : 'OFF'}
</button>
<script>
import { Switch } from '@skeletonlabs/skeleton';
let enabled = false;
</script>
<Switch bind:checked={enabled} />
Особенности:
<script>
import { Toggle } from 'flowbite-svelte';
let enabled = true;
</script>
<Toggle bind:checked={enabled} />
Дополнительные возможности:
sm, md, lg)<script>
import { Switch } from 'bits-ui';
let checked = false;
</script>
<Switch bind:checked />
Отличительные черты:
.switch.small {
width: 40px;
height: 20px;
}
.switch.large {
width: 70px;
height: 34px;
}
input:checked + .slider {
background-color: #2196f3;
}
input:checked + .slider.red {
background-color: #f44336;
}
.slider {
transition: background-color 0.4s ease;
}
.slider::before {
transition: transform 0.4s cubic-bezier(0.4, 0, 0.2, 1);
}
Switch часто используется вместе со стором:
import { writable } from 'svelte/store';
export const darkMode = writable(false);
<script>
import { darkMode } from './store';
</script>
<input type="checkbox" bind:checked={$darkMode}>
Преимущества:
Switch может быть частью формы:
<form on:submit|preventDefault={submit}>
<input type="checkbox" bind:checked={subscribe}>
<button type="submit">Отправить</button>
</form>
function submit() {
console.log({ subscribe });
}
<Switch bind:checked={value} />
Состояние полностью управляется извне.
<Switch defaultChecked={true} />
Состояние хранится внутри компонента.
{#each settings as setting}
<Switch bind:checked={setting.enabled} />
{/each}
<script>
import { darkMode } from './store';
</script>
<Switch bind:checked={$darkMode} />
{#if $darkMode}
<body class="dark" />
{/if}
async function toggle(value) {
loading = true;
await api.update(value);
loading = false;
}
<input
type="checkbox"
bind:checked={enabled}
on:change={(e) => toggle(e.target.checked)}
>
1. Потеря синхронизации состояния Использование локального состояния без сторов в крупных приложениях приводит к рассинхронизации.
2. Отсутствие debounce при API-запросах Частые переключения могут перегружать сервер.
3. Игнорирование accessibility Отсутствие ARIA-атрибутов ухудшает доступность.
4. Смешивание контролируемого и неконтролируемого режима Приводит к непредсказуемому поведению.
{#if loading}
<span>Загрузка...</span>
{:else}
<Switch bind:checked />
{/if}
<input type="checkbox" bind:checked disabled>
<Switch let:checked>
<span>{checked ? 'ON' : 'OFF'}</span>
</Switch>
| Характеристика | Switch | Checkbox |
|---|---|---|
| Визуальная модель | Переключатель | Галочка |
| Использование | Настройки | Формы |
| Реакция | Мгновенная | Часто требует подтверждения |
| UX | Более интуитивный | Более формальный |
Switch — ключевой элемент современного UI, особенно в интерфейсах настроек и управления состояниями. В экосистеме SvelteKit он реализуется просто благодаря реактивности, легко интегрируется с библиотеками и масштабируется через сторы и композицию компонентов.