Кастомизация чекбоксов. Стилизуем чекбоксы и радиокнопки с CSS3

Влад Мержевич

Исходные чекбоксы в форме выглядят хотя и привычно, но уже несколько старомодно. Порой хочется вместо чекбокса использовать стильную картинку, которая лучше будет вписываться в существующий дизайн. С помощью CSS3 мы можем это сделать без всяких скриптов, при этом учтём и старые версии браузеров, в которых функционал формы должен сохраниться.

Для начала подготовим изображения. Нам потребуется две картинки соответствующие разному статусу чекбокса - когда он включен и выключен (рис. 1).

Рис. 1. Вверху чекбокс выключен, внизу он включен

Желательно объединить две картинки в одну в графическом редакторе, сделать из них так называемый CSS-спрайт. Дело в том, что первая картинка покажется сразу после загрузки, а вторая начнёт загружаться только после щелчка по чекбоксу. Несмотря на малый размер изображений и объём загружаемого файла, на загрузку и отображение картинки в первый раз потребуется какое-то время. Даже когда речь идёт о доли секунды эта задержка заметна визуально. Если же мы объединим рисунки в одно изображение, то оно будет загружаться целиком и показываться без малейшего замедления. Чтобы создать иллюзию того, что у нас одна картинка, а не две, надо ограничить размеры элемента и выводить изображение в виде фона. И в нужный момент просто-напросто смещать фон вверх или вниз.

HTML

После того, как спрайт сделан, перейдём к HTML-коду. Он содержит три важных элемента.

Первый это тег

После следует пустой , этот элемент будет выполнять декоративную роль, именно к нему и применяется наш рисунок.

CSS

Для начала определим размер отображаемого рисунка. У меня он составляет 32х26 пикселов. Заметьте, здесь речь идёт не о спрайте, где у нас объединено две картинки, а об одном изображении. Эти размеры подставляем в стиль селектора label .

Label { width: 32px; /* Ширина рисунка */ height: 26px; /* Высота рисунка */ display: block; /* Блочный элемент */ position: relative; /* Относительное позиционирование */ }

Стиль чекбокса не трогаем, он в любом случае не будет виден и переходим к нашему «декоративному» . Важно сделать чтобы элемент занимал всю доступную область внутри

Input + span { position: absolute; /* Абсолютное позиционирование */ left: 0; top: 0; width: 100%; height: 100%; background: url(images/switch.png) no-repeat; /* Фоновый рисунок */ cursor: pointer; /* Курсор в виде руки */ }

Картинка добавляется как фон, здесь никаких сюрпризов нет, и меняем для разнообразия форму курсора.

На этом этапе наш чекбокс уже превратился в симпатичную картинку, осталось только задать смену рисунка, когда внутри чекбокса стоит галочка. Для этого воспользуемся псевдоклассом :checked , он срабатывает при установке галочки в поле. Правда тут есть одна хитрость. :checked применяется к чекбоксу, а менять его стиль необходимости нет, нас интересует только «декоративный» span . Поэтому используем соседние селекторы и добавляем стиль к span идущему после чекбокса с галочкой.

Input:checked + span { background-position: 0 -26px; }

Надеюсь, теперь стало понятно такое положение в HTML-коде, как раз для того, чтобы его легко стилизовать с помощью псевдокласса :checked .

Собираем код воедино (пример 1) и тестируем его в браузерах.

Пример 1. Картинка вместо чекбокса

HTML5 CSS3 IE Cr Op Sa Fx

Переключатель

Браузеры

Все современные версии браузеров - Firefox, Chrome, IE9, Opera, Safari показали одинаковый рабочий результат.

Также код не будет работать в IE8, эта версия не понимает :checked . Давайте сделаем поддержку старых версий IE, для чего вернём настройки элементов формы по умолчанию. Для начала к элементам желательно добавить классы и в стилях обращаться именно к ним. Так мы сможем задать стиль любого элемента без обращения к псевдоклассам CSS3.

Чтобы в стилях затронуть версии IE младше 9.0 воспользуемся условными комментариями. В стилях остаётся задать ширину и высоту для label по умолчанию и скрыть span (пример 2).

Пример 2. Стиль для IE8

Данный код надо вставить сразу после закрывающего тега в примере 1. Таким образом мы получим классический вид чекбоксов в IE7-8 и меняющуюся картинку в современных браузерах.

Иногда, когда мы смотрим на радиокнопки или input type checkbox , то у нас возникают неприятные ощущения. Кажется, что они выглядят ужасно. Но пока не посыпалась нецензурные слова, я попытаюсь избавить вас от этого чувства.

Сегодня мы будем работать только с кодом. Для начала сформируем его структуру:

//Radio //Checkbox

Если эта кнопка покажется вам некрасивой, не беспокойтесь. Так и должно быть, потому что все остальное мы сделаем при помощи CSS .

Первое что нужно сделать, это скрыть элемент, который генерирует саму некрасивую кнопку – тэг input . Мы все равно сможем нажимать ее, даже несмотря на то, что она скрыта. Как? Вложив input type checkbox в label .

Теперь, когда все стандартные и некрасивые переключатели скрыты, пришло время заняться созданием собственных, красивеньких.

Радиокнопка

Но сильно с оформлением не разгуляешься, так как остальные переключатели тоже должны работать корректно. Давайте просто слегка приукрасим их:

label input { display: none; } label input ~ span { position: relative; display: inline-block; padding: 3px 0 3px 25px; } label input ~ span:before { content: ""; position: absolute; display: block; width: 18px; height: 18px; background: #fff; margin-right: 5px; border: 1px solid #ccc; border-radius: 50%; left: 0; top: 0; box-sizing: border-box; transition: all 300ms ease-in-out; } label input:checked ~ span:before { border: 5px solid #29d; }

На данный момент наша радиокнопка будет выглядеть следующим образом:

Гораздо привлекательней, не так ли?

Чекбокс (флажок)

Давайте начнем с простого HTML input type checkbox . Сейчас я хочу превратить переключатель, который вы видите на скриншоте, в нечто подобное:

label.spin input { display: none; /*hides ugly toggle*/ } label.spin input ~ span { position: relative; display: inline-block; padding: 3px 0 3px 25px; /*adds spacing on the left*/ } /*create our new toggle*/ label.spin input ~ span:before { content: "2713"; /*add a new check mark*/ text-align: center; font-size: 13px; position: absolute; display: block; width: 18px; height: 18px; background: #fff; color: #fff; margin-right: 5px; border: 1px solid #ccc; border-radius: 50%; left: 0; top: 0; box-sizing: border-box; transition: all 500ms ease-in-out; } /*if checked do this*/ label.spin input:checked ~ span:before { transform: rotatez(360deg); background: #29d; border-color: #29d; }

Действительно красивый переключатель!

Наверняка вы видели input type checkbox , в которых тумблер скользит слева направо при нажатии. Такого эффекта можно легко добиться при помощи CSS . Давайте попробуем.

Сначала создадим обычный чекбокс без установленного флажка. Сейчас вы уже знаете, что нам потребуется скрыть стандартный переключатель:

label input { display: none; }

Затем добавьте немного пространства с левой стороны при помощи свойства padding . После этого задайте чекбоксу относительное позиционирование, так как нам нужно, чтобы он содержал в себе и все остальные элементы внутри span :

label input ~ span { position: relative; display: inline-block; padding: 3px 0 3px 35px; }

Перейдем к стилизации CSS input type checkbox при помощи псевдоэлементов :before и :after . Так сгенерированным CSS-кодом будет проще управлять:

label input ~ span:before, label.slide input ~ span:after { content: ""; position: absolute; display: block; width: 18px; height: 18px; background: #fff; margin-right: 5px; border: 1px solid #ccc; left: 0; top: 0; box-sizing: border-box; transition: all 300ms ease-in-out; }

Этот код приведет к появлению элемента, похожего на блок. Так как это свойство установлено для обоих псевдоэлементов, то они будут выглядеть одинаково, и расположены один поверх другого.

Пришло время немного украсить эти псевдоэлементы. :after будет выступать в роли фона, а :before отвечать за переключение ползунка. Давайте отредактируем ширину элемента, чтобы он стал больше. Также не забудьте добавить inset shadow , чтобы он выглядел как бы вдавленным. Кроме этого не забываем про красный фон, который будет интуитивно указывать на “выключенный ” режим:

label input ~ span:before { width: 30px; border-radius: 20px; box-shadow: inset 0 2px 5px -1px rgba(0, 0, 0, 0.4), inset 0 -2px 0 -1px rgba(255, 255, 255, 0.2); background: #F22613; }

Что касается :before , то нам нужно сделать так, чтобы элемент стал круглым, а также немного «приподнять » его при помощи эффекта box-shadow :

label.slide input ~ span:after { box-shadow: 0 3px 4px -2px rgba(0, 0, 0, 0.5); border-radius: 50%; }

Во «включенном » режиме нам нужно сместить ползунок HTML input type checkbox в сторону, и изменить цвет фона с красного на оттенок голубого:

label.slide input:checked ~ span:before { background: #29d; } label.slide input:checked ~ span:after { left: 13px; }

На этом все! Наши красивые чекбоксы и радиокнопки готовы!

Перевод статьи “Styling Radio and Check buttons with CSS ” был подготовлен дружной командой проекта .

Благодаря CSS3, мы можем добиться практически любого нужного нам на экране эффекта. В этом уроке рассмотрим, каким образом можем стилизовать чекбоксы и радио кнопки.

Input:checked + label:before { content: "\2022"; color: #f3f3f3; font-size: 30px; text-align: center; line-height: 18px; }

Теперь когда мы нажмём на радио кнопку, в основном сером круге должен появиться маленький белый кружок.

Стилизуем чекбоксы

Теперь давайте займёмся оформление чекбоксов. Для начала снова спрячем элемент:

Input { display: none; }

Поскольку мы убираем стандартное отображение чекбокса при помощи псевдо-элемента:before, просто добавим рамку:

Checkbox label:before { border-radius: 3px; }

Затем добавим символ “галочка”, который появится при клике по чекбоксу. Сделаем это по аналогии с радиокругом. На этот раз нам понадобится преобразовать HTML символ? ✓.

Input:checked + label:before { content: "\2713"; text-shadow: 1px 1px 1px rgba(0, 0, 0, .2); font-size: 15px; color: #f3f3f3; text-align: center; line-height: 15px; }

В итоге, вот что у нас должно получиться:

Итоги

В этом уроке мы рассмотрели способ, который вы можете использовать для нужного вам отображения радио кнопок и чекбоксов. Поскольку мы использовали CSS3, то данная техника будет работать только в браузерах, которые поддерживают эту технологию. Для того чтобы добиться подобных результатов в более старых браузерах, можете воспользоваться соответствующим

a! Часто ли Вы создаете различные формы, опросы на своих сайтах? Если да, то наверняка Вам хотелось изменить стандартные элементы. В этой статье покажу как можно легко и просто заменить стандартные элементы checkbox (флажки) и radio button (переключатели) на свои. Использовать будем средства только CSS3 !

То что получилось посмотрите и опробуйте на демо-странице или скачайте исходники:

HTML разметка

Расположим элементы на странице:

Здесь ничего особенного, каждому элементу задаем id и name , также используем label для описания элементов «переключателя» и «флажка». Внутрь тега label , вставляем span . Для чего именно, написано ниже.

Правила CSS

Сейчас начинается самое интересное. Разберем создание только элемента «флажок», «переключатель» формируется аналогичным путем. Первое что мы делаем, это скрываем стандартный флажок из виду:

input[ type= "checkbox" ] {
display : none ;
}

Теперь, становится ясно, для чего нужен элемент span . Вместо скрытого стандартного флажка организуем новый, используя span :

1
2
3
4
5
6
7
8
9

input[ type= "checkbox" ] + label span {
display : inline-block ;
width : 19px ;
height : 19px ;
margin : -1px 4px 0 0 ;
vertical-align : middle ;
background : url () left top no-repeat ;
cursor : pointer ;
}

С помощью CSS селектора выбираем все span внутри тега label , которые принадлежат элементам input с типом checkbox (т.е. выбираем все «флажки»). И используем вот такой спрайт (одно общее изображение, вместо множества):

Для выбранных span задаем высоту и ширину в 19px , и располагаем фоновое изображение.

Осталось только организовать правило для активного «флажка» (псевдо-селектор :checked ). Для этого просто смещаем данное изображение влево на 19px :

input[ type= "checkbox" ] : checked + label span {
background : url () -19px top no-repeat ;
}

Вот таким не хитрым способом, с применением нескольких тактик можно организовать на сайте, элементы на свой вкус. Для «переключателей» правила выстраиваются подобным образом, только соответственно фоновое изображение смещается еще на 19px и немного изменятся css селектор, вместо type=»checkbox» используется type=»radio» .