Яндекс.Метрика

Дизайн-журнал №1. Актуальная информация для дизайнеров, веб дизайнеров, программистов и разработчиков сайтов.

Выпадающее меню с использованием только CSS и недокументированных возможностей элемента флажка

3 ноября 2016 | Опубликовано в css | 6 Комментариев »

В этом уроке мы рассмотрим создание выпадающего меню на чистом CSS. Этот способ основан на применении элемента HTML флажка и интересном использовании классов и селекторов CSS без единой строки JavaScript. Демонстрацию работы этого способа и весь нужный код можно увидеть ниже. Также можно скачать полный исходный код по ссылке в конце урока.

 

 


Разметка

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

 

<div class="dropdown">
    <input type="checkbox" id="checkbox_toggle">
    <label for="checkbox_toggle">Click to Expand</label>
    <ul>
        <li><a href="#">Link One</a></li>
        <li><a href="#">Link Two</a></li>
        <li><a href="#">Link Three</a></li>
        <li><a href="#">Link Four</a></li>
    </ul>
</div>

Как Вы видите, здесь нет ничего сложного, все элементы HTML обычные, широко используемые:

  • В блочном элементе находится все остальное.
  • Элемент ввода типа флажок нужен из-за его возможности быть установленным или неустановленным. Он будет спрятан все время.
  • Элемент подписи будет использоваться для переключения состояния элемента ввода и вызова выпадающего меню.
  • Элемент ненумерованного списка — это просто список, который нужно сделать видимым, когда развернуто выпадающее меню. Это может быть и любой другой элемент.

Недокументированные возможности элемента флажка

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

 

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

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

 

ul{
    display: none;
}

А вот и недокументированная возможность. Если объединить псевдокласс :checked с родственным селектором ~, можно изменять свойства CSS элементов, следующих за элементом флажка. Это причина, по которой нужно, чтобы элемент флажка располагался выше других элементов в дереве объектов документа.

 

input[type=checkbox]:checked ~ ul {
    display: block
}

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

Надеемся, вам понравился этот урок.

Автор урока Danny Markov

Перевод — Дежурка

Смотрите также:




Комментарии

  1. Looler
    Thumb up Thumb down -4

    Комментарий скрыт из-за рейтинга

  2. Вася
    Thumb up Thumb down +3

    Недокументированные? Методу сто лет в обед

  3. Иван
    Thumb up Thumb down 0

    Здравствуйте! Спасибо за подробное разъяснение метода. Заметил баг: если в ширина текста меньше, чем в, то обрезается по ширине а. Еще не понятно зачем здесь свойство box-shadow. Объясните плиз. Хочу дополнить, в тоже желательно ставить свойство user-select: none;, чтоб при щелчке на него он не выделялся.

    Иван Ответ:

    Thumb up Thumb down 0

    Здравствуйте! Спасибо за подробное разъяснение метода. Заметил баг: если в label ширина текста меньше, чем в li, то li обрезается по ширине label. Еще не понятно зачем здесь свойство box-shadow. Объясните плиз. Хочу дополнить, в li тоже желательно ставить свойство user-select: none;, чтоб при щелчке на него он не выделялся.