Статьи

Создание переключателя стилей с помощью чистого CSS с использованием: проверено

Несколько лет назад веб-разработчики не могли реализовать и построить столько всего, используя только CSS и не полагаясь на JavaScript. Но сегодня CSS настолько зрел, что способен делать мощные вещи без написания ни одной строки JavaScript. Возможно, вы также прочитали несколько статей о «подходах только к CSS», которые демонстрируют мощь CSS.

Когда речь идет о подходах только для CSS, мы не можем игнорировать селектор псевдокласса :checked , который я собираюсь использовать в этом посте. Конечно, я не первый, кто пишет об этой технике, и были и другие более широкие дискуссии, касающиеся использования элементов формы в качестве замены JavaScript. Например, эта статья Adobe Луиса Лазариса и это великолепное слайд-шоу Райана Седдона .

Использование :checked

Короче говоря, селектор псевдокласса :checked представляет (выбирает) любой элемент радио или флажок, который отмечен или выбран. Пользователь может изменить состояние этих элементов, установив флажок или выбрав другое значение в наборе переключателей.

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

Теперь давайте начнем.

Построение окна настроек

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

 /* we don't want the input fields to appear, all we need is the labels */ input[type="checkbox"], input[type="radio"] { position: absolute; visibility: hidden; } .settings-box-element { z-index: 10; } 

Поскольку мы заинтересованы только в отображении меток, приведенный выше код используется для скрытия флажков и переключателей. Более того, все метки имеют класс settings-box-element со свойством z-index чтобы убедиться, что метки останутся поверх любых других элементов на странице.

Теперь мы можем разбить код, который составляет окно настроек. Начнем с кнопки передач. Вот HTML-код:

 <!-- the gear icon that opens the box when you click on it --> <input id="settings-btn" class="settings-btn" type="checkbox"> <label for="settings-btn" class="settings-box-element"></label> 

И CSS:

 .settings-btn + label { position: fixed; top: 130px; right: 0; display: block; width: 35px; color: #e83737; text-align: center; background: #fff; cursor: pointer; } 

Если вы читали одну или две статьи об использовании элементов формы в качестве замены JavaScript, то вы уже должны знать, что нам нужно использовать элементы input и label вместе, чтобы в случае удаления одного из двух элементов ничего не работало. Таким образом, у нас есть флажок ввода с id="settings-btn" и метка с атрибутом for который соответствует значению id . Я также добавил класс settings-btn для использования в нашем хуке CSS.

В CSS метке присваивается position: fixed объявление с соответствующими свойствами / значениями направления (сверху и справа).

Далее идет белая коробка, которая будет практически содержать кнопки:

HTML первый:

 <!-- the white box that contains the buttons --> <div class="buttons-wrapper settings-box-element"></div> 

И CSS:

 .buttons-wrapper { position: fixed; top: 130px; right: -200px; /* should match element width */ width: 200px; height: 240px; background: #fff; } 

Box представляет собой отдельный элемент div с классами «buttons-wrapper» и «settings-box-element». Как я уже говорил ранее, последний класс в основном используется для придания элементам значения z-index . «Кнопки-обертки» используются для div элемента div . И, как вы можете видеть, div получил ширину 200px и высоту 240px для размещения 5 кнопок, которые вы видите в демоверсии. Кроме того, div получает fixed значение position и соответствующие свойства right и top . Единственное, что вам нужно иметь в виду, это то, что right свойство должно иметь то же значение, что и ширина, но в отрицательном значении (чтобы оно исчезло из области просмотра).

Теперь давайте посмотрим на код оставшейся разметки, то есть 5 кнопок. Комментарии обозначают стили фона, которыми они управляют:

 <!-- background styles --> <!-- light background (#eaeaea) --> <input id="light-layout" class="light-layout" type="radio" name="layout" checked> <label for="light-layout" class="layout-buttons settings-box-element"> Light Background</label> <!-- dark background (#494949) --> <input id="dark-layout" class="dark-layout" type="radio" name="layout"> <label for="dark-layout" class="layout-buttons settings-box-element"> Dark Background </label> <!-- image background --> <input id="image-layout" class="image-layout" type="radio" name="layout"> <label for="image-layout" class="layout-buttons settings-box-element"> Image Background</label> <!-- pattern background --> <input id="pattern-layout" class="pattern-layout" type="radio" name="layout"> <label for="pattern-layout" class="layout-buttons settings-box-element"> Pattern Background</label> <!-- hide/show content --> <input id="hide-show-content" class="hide-show-content" type="checkbox"> <label for="hide-show-content" class="layout-buttons settings-box-element"> Hide/Show content</label> 

А вот и CSS:

 .layout-buttons { display: block; width: 150px; padding: 10px 0; text-align: center; border: 2px solid black; box-sizing: border-box; font-size: 0.875em; cursor: pointer; } .light-layout + label { position: fixed; top: 140px; right: -150px; } .dark-layout + label { position: fixed; top: 185px; right: -150px; } .image-layout + label { position: fixed; top: 230px; right: -150px; } .pattern-layout + label { position: fixed; top: 275px; right: -150px; } .hide-show-content + label { position: fixed; top: 320px; right: -150px; } 

Обратите внимание, что первому флажку был присвоен атрибут «флажок». Это потому, что мы хотим, чтобы он был выделен по умолчанию.

Каждое поле ввода имеет id а каждая метка имеет атрибут for который соответствует id одного из полей ввода. И, как вы можете знать, а может и не знать, секрет такой техники заключается в атрибуте for , потому что при щелчке по метке с атрибутом for выбирается / проверяется элемент, связанный с этой конкретной меткой, что позволяет нам использовать :checked селектор.

Все вышеперечисленные метки имеют класс «макет-кнопок». Этот класс используется для задания кнопок по умолчанию и общих стилей, таких как ширина, отступы, границы и т. Д. Другие классы используются для добавления уникальных стилей к каждому из них. И как вы видели для значка шестеренки и белого поля, свойство position используется с fixed значением и соответствующими свойствами top и right . Обратите внимание, что top значение для каждой метки на 45px больше, чем предыдущее; это сделано для того, чтобы кнопки складывались друг над другом красиво и без наложений. Также обратите внимание, что right значение свойства такое же, как ширина кнопок, но отрицательное.

Теперь взглянем на последнюю часть нашего кода CSS:

 input[type="radio"]:checked + label { background: #e83737; color: #fff; border-color: #e83737; } 

Приведенный выше CSS используется для изменения стилей по умолчанию для ярлыка, связанного с выбранным переключателем (у нас есть 4 переключателя). Я использовал соседний селектор брата для нацеливания на каждую метку, которой предшествует поле ввода типа «радио». Итак, как вы можете видеть, свойствам background и border было присвоено значение #e83737 (красноватый цвет), а свойству color — значение #fff . Ничего особенного или сложного.

Остальные элементы в HTML будут заключены в div :

 <div class="main-wrapper"> <div class="content"> <h1>Cool stuff with CSS only!</h1> <p>Lorem ipsum dolor sit amet...</p> </div> </div> 

Обратите внимание, что в приведенном выше коде я расположил каждый элемент окна настроек независимо, где я мог бы просто обернуть их все в элемент div или section и расположить этот единственный элемент, что упростило задачу. Это сделано просто потому, что вы не можете выбрать родительский элемент, только родного брата.

Таким образом, в этом случае весь основной контент заключен в div с class="main-wrapper" . И как вы увидите позже, чтобы иметь возможность изменить стили для этого div , нам нужно выбрать этот div , написав что-то похожее на это:

 input[type="checkbox"]:checked ~ main-wrapper { /* some styles here */ } 

Здесь я использую общий селектор братьев и сестер, чтобы выбрать основной div , который является единственным способом сделать это.

Нажав на значок шестеренки

При нажатии на значок шестеренки должно появиться окно настроек. Вот код, чтобы это произошло:

 .settings-btn:checked + label { right: 200px; /* match width of .buttons-wrapper */ } .settings-btn:checked ~ .buttons-wrapper { right: 0; } .settings-btn:checked ~ .layout-buttons { right: 30px; } 

Когда пользователь нажимает на значок шестеренки, будет установлен флажок с id="settings-btn" , и тут придет волшебство. После нажатия на значок шестеренки произойдет следующее:

  1. Используя соседний селектор ( + ), метка, которая появляется сразу после этого флажка, будет выбрана, а затем перемещена на 200 пикселей справа от области просмотра.

  2. Используя общий селектор брата ~ , элементы с классами «button-wrapper» и «layout-button» будут выделены, а затем перемещены так, чтобы они были 0 пикселей и 30 пикселей, соответственно, справа от области просмотра.

И соседний селектор брата, и общий селектор брата здесь необходимы, так как этот метод не будет работать без них.

Смена фона

Позвольте напомнить вам код HTML для переключателей:

 <!-- background styles --> <!-- light background (#eaeaea) --> <input id="light-layout" class="light-layout" type="radio" name="layout" checked> <label for="light-layout" class="layout-buttons settings-box-element"> Light Background</label> <!-- Plus 3 other radio buttons/labels... --> 

Фон, который мы будем изменять, это фон элемента .main-wrapper . Вот CSS:

 .light-layout:checked ~ .main-wrapper { background: #eaeaea; } .dark-layout:checked ~ .main-wrapper { background: #494949; } .image-layout:checked ~ .main-wrapper { background: url(image url) no-repeat center 0 fixed; } .pattern-layout:checked ~ .main-wrapper { background: url(images/pattern1.png) repeat; } 

Вы можете видеть, что в HTML у нас есть 4 элемента ввода type="radio" и 4 метки. При щелчке по любой из меток вход, связанный с этой конкретной меткой, будет выбран и, следовательно, сопоставлен псевдоклассом :checked . Затем, в зависимости от того, какая метка нажата, один из четырех вышеуказанных стилей будет применен к основной оболочке.

Скрытие / Отображение контента

Для элемента show / hide я использую флажок:

 <!-- hide/show content --> <input id="hide-show-content" class="hide-show-content" type="checkbox"> <label for="hide-show-content" class="layout-buttons settings-box-element"> Hide/Show content</label> 

А вот и CSS:

 .hide-show-content:checked ~ .main-wrapper .content { display: none; } 

В этом случае мы сообщаем браузеру выбрать элемент с class="content" и выставить его на display: none », когда пользователь нажимает на соответствующую метку, поэтому ставит флажок.

Вывод

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

Ниже вы найдете готовую демонстрацию: