Сниппет, заменяющий стандартный чекбокс на современный и красивый тумблер (переключатель). Использование псевдоэлементов CSS и псевдокласса :checked обеспечивает плавную анимацию без применения JavaScript.

Код

<label class="custom-toggle">
  <input type="checkbox" class="custom-toggle-input" aria-label="Toggle Switch" />
  <span class="custom-toggle-slider"></span>
</label>
/* Контейнер тумблера */
.custom-toggle {
  position: relative;
  display: inline-block;
  width: 60px;
  height: 34px;
}

/* Скрываем стандартный чекбокс */
.custom-toggle-input {
  opacity: 0;
  width: 0;
  height: 0;
}

/* Фон ползунка */
.custom-toggle-slider {
  position: absolute;
  cursor: pointer;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background-color: #e2e8f0;
  transition: background-color 0.4s;
  border-radius: 34px;
  box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.1);
}

/* Кнопка (ручка) ползунка */
.custom-toggle-slider:before {
  position: absolute;
  content: "";
  height: 26px;
  width: 26px;
  left: 4px;
  bottom: 4px;
  background-color: white;
  transition: transform 0.4s cubic-bezier(0.68, -0.55, 0.265, 1.55);
  border-radius: 50%;
  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
}

/* Цвет фона в активном состоянии */
.custom-toggle-input:checked + .custom-toggle-slider {
  background-color: #3b82f6;
}

/* Контур при фокусе с клавиатуры */
.custom-toggle-input:focus-visible + .custom-toggle-slider {
  outline: 2px solid #3b82f6;
  outline-offset: 2px;
}

/* Смещение ручки в активном состоянии */
.custom-toggle-input:checked + .custom-toggle-slider:before {
  transform: translateX(26px);
}

Особенности реализации

Стандартный <input type="checkbox"> имеет разный вид в разных браузерах и плохо поддается стилизации, поэтому в этом сниппете сам чекбокс скрыт, а внешний вид создается с помощью соседнего элемента <span> (ползунка).

  1. Скрытие чекбокса: opacity: 0, а также нулевые ширина и высота скрывают элемент визуально, сохраняя при этом его функциональность.
  2. Стилизация ползунка: Круглая “ручка” создается с помощью псевдоэлемента ::before.
  3. Плавная анимация: Указание transition: transform 0.4s cubic-bezier(0.68, -0.55, 0.265, 1.55) добавляет приятную анимацию с небольшим эффектом отскока (easing) при перемещении ручки.
  4. Учет доступности: Для того чтобы фокус был заметен при навигации с клавиатуры, используется :focus-visible для отображения контура.

Этот тумблер отлично подходит для экранов настроек, переключения темной темы и других ситуаций, требующих интуитивно понятного управления вкл/выкл.