Многоуровневое меню с CSS3 эффектом
Сегодня мы с вами создадим простое многоуровневое меню и прикрутим к нему CSS3 эффект при выводе подменю. Наша задача сделать реализацию, как можно более простой и понятной.
Многоуровневое меню. План действий
1. Мы создадим обычную html структуру многоуровневого меню. Состоять она будет из вложенных друг в друга ul.
2. Пропишем стили для многоуровневого меню.
3. Добавим стили CSS3 анимации, для эффектного появления подменю.
4. Напишем небольшой скрипт для работы CSS3 эффектов и вывода подменю.
1. Структура многоуровневого меню
Тут все просто, структура меню состоит из простых списков ul, вложенных друг в друга.
<ul id="menu" class="menu"> <li> <a href="#">Level 1</a> <ul class="sub-menu"> <li><a href="#">Level 2</a></li> <li><a href="#">Level 2</a></li> <li><a href="#">Level 2</a></li> </ul> </li> <li><a href="#">Level 1</a></li> <li> <a href="#">Level 1</a> <ul class="sub-menu"> <li> <a href="#">Level 2</a> <ul class="sub-menu"> <li><a href="#">Level 3</a></li> <li><a href="#">Level 3</a></li> <li><a href="#">Level 3</a></li> <li><a href="#">Level 3</a></li> <li><a href="#">Level 3</a></li> <li><a href="#">Level 3</a></li> </ul> </li> <li><a href="#">Level 2</a></li> <li><a href="#">Level 2</a></li> <li> <a href="#">Level 2</a> <ul class="sub-menu"> <li><a href="#">Level 3</a></li> <li><a href="#">Level 3</a></li> <li><a href="#">Level 3</a></li> </ul> </li> <li><a href="#">Level 2</a></li> </ul> </li> <li><a href="#">Level 1</a></li> <li> <a href="#">Level 1</a> <ul class="sub-menu"> <li><a href="#">Level 2</a></li> <li> <a href="#">Level 2</a> <ul class="sub-menu"> <li><a href="#">Level 3</a></li> <li><a href="#">Level 3</a></li> <li><a href="#">Level 3</a></li> <li><a href="#">Level 3</a></li> <li><a href="#">Level 3</a></li> </ul> </li> <li><a href="#">Level 2</a></li> <li> <a href="#">Level 2</a> <ul class="sub-menu"> <li><a href="#">Level 3</a></li> <li><a href="#">Level 3</a></li> <li><a href="#">Level 3</a></li> <li><a href="#">Level 3</a></li> </ul> </li> <li> <a href="#">Level 2</a> <ul class="sub-menu"> <li><a href="#">Level 3</a></li> <li><a href="#">Level 3</a></li> <li><a href="#">Level 3</a></li> <li><a href="#">Level 3</a></li> <li><a href="#">Level 3</a></li> <li><a href="#">Level 3</a></li> </ul> </li> </ul> </li> <li><a href="#">Level 1</a></li> </ul>
Наше меню имеет id=<menu>, прописал его для быстроты работы jQuery выборки и class=<menu>, все вложенные блоки ul имеют класс class=<sub-menu>.
2. Стили для многоуровневого меню
Тут пропишем все как можно просто. Первый уровень элементов имеет float:left, дабы выстроить элементы меню горизонтально, также у них прописан position:relative, для вывода подменю относительно их.
Все ссылки отображаются как блочные элементы display:block;. Вложенные списки имеют фиксированную ширину и отображаются с абсолютным позиционированием относительно родительского li.
.menu {display: block; width: 960px; margin: 0 auto;} .menu >li {position: relative; float: left; border-bottom: 2px solid #333; text-align: left;} .menu >li:hover {float: left; border-bottom: 2px solid #23DBDB;} .menu >li >a { text-transform: uppercase;} .menu li a {display: block; padding: 8px 16px; background: #333; color: #eee; text-decoration: none;} .menu li a:hover {color: #23DBDB;} .menu li:hover >.sub-menu {display: block;} .sub-menu {display: none; position: absolute; width: 210px;} .sub-menu li {display: block; position: relative;} .sub-menu li + li {border-top: 1px solid #555;} .sub-menu .sub-menu {left: 210px; top: 0; border-left: 3px solid #555; border-bottom: 3px solid #555}
3. Добавим стили CSS3 анимации, для эффектного появления подменю.
CSS3 эффекты возьмем с сервиса описанного в этом посте:
Вот та часть которая нами будет использована:
@charset "UTF-8"; /*! Animate.css - //daneden.me/animate Licensed under the MIT license - //opensource.org/licenses/MIT Copyright (c) 2013 Daniel Eden */ .animated { -webkit-animation-duration: .3s; animation-duration: .3s; -webkit-animation-fill-mode: both; animation-fill-mode: both; } @-webkit-keyframes fadeInUp { 0% { opacity: 0; -webkit-transform: translateY(20px); transform: translateY(20px); } 100% { opacity: 1; -webkit-transform: translateY(0); transform: translateY(0); } } @keyframes fadeInUp { 0% { opacity: 0; -webkit-transform: translateY(20px); -ms-transform: translateY(20px); transform: translateY(20px); } 100% { opacity: 1; -webkit-transform: translateY(0); -ms-transform: translateY(0); transform: translateY(0); } } .fadeInUp { -webkit-animation-name: fadeInUp; animation-name: fadeInUp; } @-webkit-keyframes fadeOutDown { 0% { opacity: 1; -webkit-transform: translateY(0); transform: translateY(0); } 100% { opacity: 0; -webkit-transform: translateY(20px); transform: translateY(20px); } } @keyframes fadeOutDown { 0% { opacity: 1; -webkit-transform: translateY(0); -ms-transform: translateY(0); transform: translateY(0); } 100% { opacity: 0; -webkit-transform: translateY(20px); -ms-transform: translateY(20px); transform: translateY(20px); } } .fadeOutDown { -webkit-animation-name: fadeOutDown; animation-name: fadeOutDown; }
4. Напишем небольшой скрипт для работы CSS3 эффектов и вывода подменю.
Суть скрипта состоит в том чтобы при наведении на элемент меню, добавить к блоку подменю классы animated fadeInUp, а при уводе курсора с пункта меню,
нам нужно отобразить наше подменю (т.к. в css оно имеет свойство display:none), по-этому делаем show(0),
удаляем класс fadeInUp, добавляем класс fadeOutDown - он отобразит эффект исчезновения меню
и параллельно проводим задержку .delay(300) для того чтобы отобразить анимацию, время задержки равно времени анимации 300 мс, после чего прячем подменю.
Вот так это смотрится в коде:
$(document).ready(function(){ var menu = $("#menu"); $('li', menu).hover( function(){ $('>ul',this).attr('style','') //удалим стили оставшиеся после hide()/show() .removeClass('fadeOutDown') .addClass('animated fadeInUp'); }, function(){ $('>ul',this).show(0) .removeClass('fadeInUp') .addClass('fadeOutDown') .delay(300).hide(0); } ); });
На этом создание эффектов для вывода пунктов многоуровневого меню закончено. Посмотреть демо пример и скачать исходники вы можете по ссылка ниже.
Если у вас остались ко мне вопросы, пишите их в комментариях к этому посту с радостью отвечу 🙂
Добрый день! Спасибо за статью, весьма красивое меню, я его немного видоизменила под свои потребности, но есть одно большое – НО, он так сказать “телипается” при наведении, я изначально не заметила этого недостатка в демо версии, и вписала в сайт, а теперь не могу устранить эту проблему, а переделывать весь сайт ой как не хочется. Посмотрите пожалуйста!