Браузерные чекбоксы и радиокнопки в разных браузерах могут выглядеть по-разному. Кроме того, внешний вид этих элементов практически всегда выбивается из стиля сайта. А как их стилизовать? Как у чекбокса поменять рамку с галочкой, а радиокнопку сделать квадратной?
Я вам покажу два способа. Первый способ самый удобный, но необходимо его использовать с аккуратностью, так как могут быть проблемы с кроссбраузерностью. Он основывается на appearance: none;. Это свойство достаточно хорошо поддерживается, но для моей работы он всё-таки не подходит, так как мы работаем для множества стран, и не везде всё так хорошо с вебом как у нас. Второй способ более кроссбраузерный, но менее удобный. Есть ещё один способ — о нём кратко в конце.
видео
Самый простой способ кастомизации.
Самый простой, и при этом более надёжный способ, у которого могут быть проблемы с кроссбраузерностью если нужна поддержка очень старых браузеров.
Первым делом отключаю браузерные стили и сразу прописываю правила для стилизации кнопок в спокойном состоянии. Для этого возьму готовые картинки из одного учебного проекта.
К сожалению такой подход не позволяет менять цвет кнопок, но на следующем примере я покажу как это можно сделать и ещё добавить анимацию.
вид стилизованых кнопок, со всеми событиями.
Что мы получили? Две кнопки доступные с клавиатуры, с эффектами состояний для всех событий. А скомбинировав этот и следующий способ можно будет использовать красивые «плюшки».
Радиокнопки и чекбоксы на span.
Разметка практически такая же как и у первого варианта, но после каждой кнопки добавляется span для визуализации кнопки и класс .visually-hidden для доступного cкрытия кнопок. Он необходим для того, что бы пользователь мог попасть клавишей TAB по нашей кнопке и взаимодействовать с ней. Стили этого класса прописаны так, что бы его не было визуально видно, но при этом пользователям клавиатуры и программ чтения с экрана был виден элемент.
Так как я хочу анимировать цвет кнопок, и мне нужна обводка при фокусе, сам span не будет иметь никакого внешнего вида — визуализировать будут его псевдоэлементы. Для этого span необходимо подготовить:
Получилось много всего, но это только на первый взгляд:
content: ''; обязательное свойство для псевдоэлемента
position: absolute; и следующие два свойства — позиционируем внутри span псевдоэдементы
Ширина и высота — это понятно))
background-color: currentColor; что бы отображалась маска. Причём currentColor добавляет цвет текста. Если поменять значение свойства color, то и этот фон поменяется.
Ну и шесть три свойства добавляет маску и настройки этой маски.
Теперь нужно отметить выбранные кнопки, но для анимации нужно немного доработать псевдоэлементы у span
По сути дела я создал псевдоэлемент ::after такой же как и ::before, только добавил прозрачность. Ну и добавил анимацию прозрачности. Тут стоит добавить, что лучше указывать какие свойства нужно анимировать, и время анимации лучше не делать более чем 0.3 секунды.
Стили почти как у псевдоэлемента радиокнопки в первом случае, только я заменил значение цвета фона, сделал псевдоэлемент полностью прозрачным и добавил анимацию прозрачности. По аналогии с чекбоксом ставим точку у выбранной радиокнопки:
вид стилизованых кнопок, но отключенные кнопки выглядят как и включенные неотмеченные.
Осталось добавить состояния событий интерактивного элемента. Есть оговорка)) Судя по поведению кнопок при наведении на label в первом случае, необходимо добавлять эффект наведения кнопкам при попадании курсора на label и сейчас.
Усложнение :not(:disabled):not(:active)+ необходимо, что бы к отключенной кнопке и в состоянии [code :active] не применялись стили. Цвет меняется, но без анимации — поправим:
Я не стал показывать третий вариант: то же самое что и со span, но без него. Если вам первые два варианта не подходят — можете немного модифицировать второй. А этих двух хватает для большинства случаев.
Просто спросите у менеджера меня — наставника Зиновьева Александра. Обучение проходит в помесячном индивидуальном формате, и вы можете начать в любое удобное для вас время.
Кроме того, в HTML Academy вы получите профессию и даже сможете устроиться на работу с новой профессией.