Стильные чекбоксы с помощью CSS и jQuery
В этом уроке мы создадим альтернативное оформление для чекбоксов, отличающееся от того, что нам предлагают браузеры по умолчанию. Реализовывать мы это будем с помощью создания несложного плагина jQuery. Он заметно улучшит внешний вид формы, а при выключенном JavaScript все оставит как есть.
HTML
index.html
Сперва нам понадобится HTML-каркас для страницы с формой и чекбоксами, внешний вид которых мы и будем модифицировать средствами jQuery и CSS.
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Better Check Boxes with jQuery and CSS | Tutorialzine Demo</title> <link rel="stylesheet" type="text/css" href="css/styles.css" /> <link rel="stylesheet" type="text/css" href="jquery.tzCheckbox/jquery.tzCheckbox.css" /> </head> <body> <div id="page"> <form method="get" action="./"> <ul> <li> <label for="ch_effects">Отображение эффектов: </label> <input type="checkbox" id="ch_effects" name="ch_effects" data-on="Показывать" data-off="Не показывать" /> </li> <li> <label for="ch_location">Включить отслеживание местоположения: </label> <input type="checkbox" id="ch_location" name="ch_location" checked /> </li> <li> <label for="ch_showsearch">Включить меня в результаты поиска: </label> <input type="checkbox" id="ch_showsearch" name="ch_showsearch" /> </li> <li> <label for="ch_emails">Оповещения по E-mail: </label> <input type="checkbox" id="ch_emails" name="ch_emails" data-on="Обязательно!" data-off="Нет, спасибо" /> </li> </ul> </form> </div> <script src="js/jquery.js"></script> <script src="jquery.tzCheckbox/jquery.tzCheckbox.js"></script> <script src="js/script.js"></script> </body> </html>
Главный содержащий элемент - блок div с #page содержит форму. Внутри формы - ненумерованный список и элементами label, в которых описывается каждый из чекбоксов. Хороший стандарт для повышения юзабилити заключается в том, что клик по текстовой подписи к чекбоксу также выбирает или деактивирует его (это достигается благодаря использованию атрибута for).
Заметьте, что в коде присутствуют атрибуты data из HTML5. Данные атрибуты используются для того, чтобы "присоединить" к тэгу некую дополнительную информацию. В нашем случае атрибуты data-on и data-off определяют тот текст, который отображается при выборе или деактивации чекбокса.
А вот разметка чекбоксов для замены:
<span class="tzCheckBox checked"> <span class="tzCBContent">ON</span> <span class="tzCBPart"></span> </span>
Когда происходит вызов нашего плагина, он проходится циклом по всем чекбоксам и вставляет код, приведенный выше, после каждого из них, одновременно с этим скрывая оригинальное отображение, которое идет по умолчанию. Также с помощью селектора класса задается стилевое оформление чекбокса (состояние выбора и неактивное состояние).
— Регулярная проверка качества ссылок по более чем 100 показателям и ежедневный пересчет показателей качества проекта.
— Все известные форматы ссылок: арендные ссылки, вечные ссылки, публикации (упоминания, мнения, отзывы, статьи, пресс-релизы).
— SeoHammer покажет, где рост или падение, а также запросы, на которые нужно обратить внимание.
SeoHammer еще предоставляет технологию Буст, она ускоряет продвижение в десятки раз, а первые результаты появляются уже в течение первых 7 дней. Зарегистрироваться и Начать продвижение

Как вы видите на иллюстрации, в качестве фона для чекбоксов используется удлиненная фоновая картинка в формате png для того, чтобы размер измененных чекбоксов изменялся в зависимости от текста, который используется для подписи.
Теперь давайте перейдем к стилевому оформлению.
CSS
Верхяя чать png-картинки используется для состояния, когда чекбокс отмечен, а нижняя - для неактивного чекбокса. Как уже было упомянуто выше, ширина меняется в зависимости от того, насколько длинный текст находится в тэге label.
jquery.tzCheckbox.css
.tzCheckBox{ background:url('background.png') no-repeat right bottom; display:inline-block; min-width:60px; height:33px; white-space:nowrap; position:relative; cursor:pointer; margin-left:14px; } .tzCheckBox.checked{ background-position:top left; margin:0 14px 0 0; } .tzCheckBox .tzCBContent{ color: white; line-height: 31px; padding-right: 38px; text-align: right; } .tzCheckBox.checked .tzCBContent{ text-align:left; padding:0 0 0 38px; } .tzCBPart{ background:url('background.png') no-repeat left bottom; width:14px; position:absolute; top:0; left:-14px; height:33px; overflow: hidden; } .tzCheckBox.checked .tzCBPart{ background-position:top right; left:auto; right:-14px; }
Элемент span с классом .tzCheckBox спозиционирован как inline-block, что позволяет ему оставаться на том же уровне, что и окружающий текст, давая нам при этом возможность задать ему стили для внешних и внутренних отступов как блочному элементу.
Также для него установлено относительное позиционирование, что позволяет нам использовать так называемый эффект "раздвижных дверей" и показывать элемент span с классом .tzCBPart с оставшейся частью фона.
В зависимости от того, выбран чекбокс или нет, элемент span с классом .tzCPContent выравнивается по левому или по правому краю с соответствующими отступами, что приводит к расширению элемента span с классом .tzCheckBox.

И теперь пришло время создать сам jQuery плагин.
jQuery
Мы назовем его tzCHeckbox. В качестве параметров будет использоваться значение поля label. По сути это массив, в котором содержатся значения полей label для состояний вкл / выкл.
jquery.tzCheckbox.js
(function($){ $.fn.tzCheckbox = function(options){ // Default On / Off labels: options = $.extend({ labels : ['ON','OFF'] },options); return this.each(function(){ var originalCheckBox = $(this), labels = []; // Проверяем наличие атрибутов data-on / data-off: if(originalCheckBox.data('on')){ labels[0] = originalCheckBox.data('on'); labels[1] = originalCheckBox.data('off'); } else labels = options.labels; // Создаем разметку для "нового чекбокса": var checkBox = $('<span>',{ className : 'tzCheckBox '+(this.checked?'checked':''), html: '<span class="tzCBContent">'+labels[this.checked?0:1]+ '</span><span class="tzCBPart"></span>' }); // Вставляем "новый чекбокс" и прячем исходный: checkBox.insertAfter(originalCheckBox.hide()); checkBox.click(function(){ checkBox.toggleClass('checked'); var isChecked = checkBox.hasClass('checked'); // Синхронизация оригинального чекбокса: originalCheckBox.attr('checked',isChecked); checkBox.find('.tzCBContent').html(labels[isChecked?0:1]); }); // Отслеживаем изменения для оригинального чекбокса и "переносим" их на новый чекбокс: originalCheckBox.bind('change',function(){ checkBox.click(); }); }); }; })(jQuery);
Все изменения с нашим "замененным чекбоксом" возвращаются обратно оригинальному чекбоксу (который спрятан, но все же находится на странице).
Сохранение оригинальных чекбоксов на странице важно, т.к. это позволяет при отправке формы в любом случае (с или без AJAX) передать значения, которые выбрал пользователь.
Использование плагина вполне очевидное. В файле script.js пишем:
$('input[type=checkbox]').tzCheckbox({ labels: [ 'Включено', 'Выключено' ] });
Данный код выбирает все чекбоксы на странице и передает их функции tzCheckbox со словами "Включено" и "Выключено" как замещающий текст.
Все, наш плагин jQuery для модификации чекбоксов готов!
Заключение
Вы можете использовать данное решение для улучшения внешнего вида чекбоксов в Ваших формах. Но если по каким-то причинам JavaScript отключен, то пользователь увидит чекбоксы в том виде, как браузер отображает их по умолчанию.
По материалам tutorialzine.com
Перевод - Дмитрий
P.S. Присмотритесь к премиум-урокам по различным аспектам сайтостроения, включая JavaScript, jQuery и Ajax, а также к бесплатному курсу по адаптивной верстке. Все это позволит вам быстрее овладеть важными навыками в создании сайтов:
— Разгрузит мастера, специалиста или компанию;
— Позволит гибко управлять расписанием и загрузкой;
— Разошлет оповещения о новых услугах или акциях;
— Позволит принять оплату на карту/кошелек/счет;
— Позволит записываться на групповые и персональные посещения;
— Поможет получить от клиента отзывы о визите к вам;
— Включает в себя сервис чаевых.
Для новых пользователей первый месяц бесплатно. Зарегистрироваться в сервисе
Понравился материал и хотите отблагодарить?
Просто поделитесь с друзьями и коллегами!
Смотрите также: