Вы найдете тумблеры, подобные мобильному интерфейсу, в разных местах в Интернете, но я хотел улучшить существующие примеры.
В частности, я хотел решение, которое:
- прогрессивно улучшенные стандартные флажки
- не использовал лишние HTML-теги или атрибуты
- поддерживаемые метки ввода
- используется только CSS без изображений или JavaScript
- используемые относительные единицы, поэтому элементы управления могут быть изменены / реагировать
- была приятная анимация
- идеально работал в ряде мобильных браузеров, и
- изящно ухудшился, так что он оставался пригодным для использования во всех браузерах
Просмотрите демонстрационную страницу и код HTML / CSS …
HTML
Нам требуется поле input
label
<div>
<input type="checkbox" id="switch1" name="switch1" class="switch" />
<label for="switch1">first switch</label>
</div>
На input
Это гарантирует, что мы можем сохранить обычные флажки, если они нам понадобятся.
Пуристы HTML будут в ужасе, увидев div
Кроме того, вам, вероятно, понадобятся div
HTML будет хорошо отображаться в большинстве браузеров с минимальным стилем. Пользователи IE6, 7 и 8 увидят это:
CSS
Теперь для интересной части. Во-первых, мы будем скрывать поле ввода, используя отрицательное поле — это может быть предпочтительнее для отображения: ни один, который часто отключает его на мобильных устройствах:
input.switch:empty
{
margin-left: -999px;
}
Возможно, вы видели :empty
Как создать адаптивное центрированное изображение в CSS3» . Он соответствует только элементам, у которых нет дочерних элементов, но, поскольку он не поддерживается в IE8 и ниже, эти браузеры не будут пытаться применять стили.
Далее, мы будем стилизовать метки родственных элементов для флажка ввода:
input.switch:empty ~ label
{
position: relative;
float: left;
line-height: 1.6em;
text-indent: 4em;
margin: 0.2em 0;
cursor: pointer;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
Основные свойства, на которые следует обратить внимание: положение: относительное, текстовый отступ, обеспечивающий пространство для нашего переключателя, и высота строки, определяющая его высоту.
Сам тумблер создается с использованием псевдоэлементов :before
:after
- оба элемента абсолютно расположены на левом краю нашего лейбла
- белый переключатель имеет меньший размер и имеет левое поле, чтобы выровнять его по фону
- применяется рамка-радиус и вставка box-shadow для придания некоторой глубины, и
- переход определен для анимации.
input.switch:empty ~ label:before,
input.switch:empty ~ label:after
{
position: absolute;
display: block;
top: 0;
bottom: 0;
left: 0;
content: ' ';
width: 3.6em;
background-color: #c33;
border-radius: 0.3em;
box-shadow: inset 0 0.2em 0 rgba(0,0,0,0.3);
-webkit-transition: all 100ms ease-in;
transition: all 100ms ease-in;
}
input.switch:empty ~ label:after
{
width: 1.4em;
top: 0.1em;
bottom: 0.1em;
margin-left: 0.1em;
background-color: #fff;
border-radius: 0.15em;
box-shadow: inset 0 -0.2em 0 rgba(0,0,0,0.2);
}
Наконец, когда флажок установлен, мы перемещаем переключатель к правому краю и меняем цвет фона:
input.switch:checked ~ label:before
{
background-color: #393;
}
input.switch:checked ~ label:after
{
margin-left: 2em;
}
Просмотрите демонстрационную страницу и код HTML / CSS …
Всем нравится тумблер! Пожалуйста, используйте код, как вам нравится. Приветствуется ссылка на эту статью или твит «Эй, Крейг, это круто / ужасно» .