Люди часто используют JavaScript, чтобы сделать выпадающее меню. Но на самом деле это можно сделать на чистом CSS. И в этом уроке вы узнаете, как это сделать.
Содержание
Принцип работы
Для начала, чтобы вы поняли принцип работы выпадающих элементов, разберём простой пример. Возьмём простой html-код для работы:
1 | <div class="example_shown">Наведи на меня курсор > <div class="example_hidden">я - скрытая часть</div></div> |
и применим к этому коду такие стили:
.example_shown {
display:inline-block;
}
.example_hidden {
display:none;
}
.example_shown:hover .example_hidden {
display:inline-block;
}
В css мы скрыли нужную часть текста, изменив его отображение на display:none;. При наведении курсора (:hover) на родительский элемент .example_shown у дочернего элемента .example_hidden меняется тип отображения на видимый. По такому принципу и строятся выпадающие меню.
Создание выпадающего меню
Теперь займёмся реализацией самого меню. Для его организации воспользуемся тегами списков ul и li
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <ul id="menu"> <li><a href="#">Раздел1</a></li> <li><a href="#">Раздел2</a> <ul> <li><a href="#">Подраздел1</a></li> <li><a href="#">Подраздел2</a></li> <li><a href="#">Подраздел3</a></li> </ul> </li> <li><a href="#">Раздел2</a> <ul> <li><a href="#">Подраздел1</a></li> <li><a href="#">Подраздел2</a></li> <li><a href="#">Подраздел3</a></li> <li><a href="#">Подраздел4</a></li> <li><a href="#">Подраздел5</a></li> <li><a href="#">Подраздел6</a></li> <li><a href="#">Подраздел7</a></li> </ul> </li> </ul> |
Как видно из кода, основной список с id = «menu» у нас будет отвечать за видимые разделы меню. В разделы мы вкладываем ещё один список ul, содержащий в себе выпадающие ссылки при наведении на заголовок раздела меню. Теперь применим к этому набору элементов следующие стили:
/*Обнуляем отступы*/
ul, li {
margin:0;
padding:0;
list-style-type:none;
}
/*Задаём параметры блока, содержащего основное меню*/
#menu {
display:block;
position:absolute;
top:100px;
left:50px;
}
/*Задаём стили для разделов нашего меню*/
#menu > li {
display:inline-block;
height:20px;
position:relative;
}
/*Стили для скрытого выпадающего меню*/
#menu > li > ul {
position:absolute;
top:20px;
display:none;
}
/*Делаем скрытую часть видимой*/
#menu > li:hover > ul {
display:block;
}
В данных стилях я хочу акцентировать внимание на четырёх вещах:
1. Обратите внимание на этот символ #menu > li в стилях. Он обозначает, что стили будут применяться не ко всем элементам li, расположенным внутри ul#menu, а только к тем, кто является непосредственным потомком тега ul#menu.
2. У разделов меню позиционирование изменено на position:relative. Дело в том, что обычный тег с position:absolute ведёт отсчёт координат позиционирования от левого верхнего угла окна браузера. Но если такой тег вложить внутрь тега с position:relative, отсчёт будет вестись от угла этого тега.
Таким образом, мы сможем привязать выпадающие списки не к какой-то координате относительно окна, а к координате относительно раздела основного меню. Собственно top:20px и задаёт смещение по вертикали от верхней границы главного раздела.
3. Параметр top у #menu > li > ul должен равняться сумме параметров #menu > li таких как height + padding-top + padding-bottom. В данном случае последние два параметра не указаны, их значение наследуется из самого первого стиля и равно нулю. Значение height = 20. Значит отступ у нашего выпадающего списка будет равен 20 + 0 + 0 = 20px
4.Когда мы переведём курсор на пункты выпавшего списка (#menu > li > ul > li), каждый элемент li этого списка будет попадать под событие наведения курсора hover. При этом он является вложенным в список ul, который в свою очередь вложен в #menu > li. Событие hover при этом будет передаваться от #menu > li > ul > li всем родительским элементам, в том числе и #menu > li. Из-за этого список не будет схлопываться обратно несмотря на то, что мы не держим курсор непосредственно над #menu > li.
Результат
Каркас сделан. Как будут выглядеть кнопки — воля ваша.
В дополнение хочу сказать, что этот же способ годится для изготовления и выпадающего вверх меню. Единственное отличие в том, что параметр top меняется на параметр bottom.
Заключение
Выпадающие списки — довольно удобный способ разместить большое меню на маленьком пространстве. Но у этого способа есть колоссальный минус: он не будет работать на мобильных устройствах. Почему? Потому что у них в принципе нет понятия наведения курсора. У них есть клики, перетягивания. Но наведения курсора нет. Так что не забудьте об этих пользователях и сделайте для них отдельную реализацию меню.
Статья взята с сайта: https://scriptsite.ru/