Для упрощения навигации по сайту на мобильных устройствах часто используют адаптированное меню. Делается это по ясной причине, не всегда десктопная версия меню может быть так же удобна и в мобильной версии сайта. Для этих целей, на сегодняшний день существует множество плагинов, которые позволяют реализовать данный функционал. Однако, использование плагинов не всегда бывает необходимым. В частности, если можно решить подобную задачу элементарным способом.
В данном посту мы рассмотрим способ реализации мобильного меню для сайта на CSS. Таким образом, для его реализации не потребуется использования JS-кода. Всё делается через вёрстку и стили.
Всё что нам необходимо сделать, это создать некую структуру элементов html, которая будет выполнять роль меню. После чего, посредством CSS будет реализована анимация кнопки открытия, а также появление самого меню.
<input type="checkbox" id="hmt" class="hidden-menu-ticker"> <label class="btn-menu" for="hmt"> <span class="first"></span> <span class="second"></span> <span class="third"></span> </label> <ul class="hidden-menu"> <li><a href="">Главная</a></li> <li><a href="">О компании</a></li> <li><a href="">Услуги</a></li> <li><a href="">Контакты</a></li> </ul>
Сама структура добавляется в тело страницы между тегами body и состоит из простых элементов. Первый элемент input[type=checkbox] – элемент который будет хранить состояние меню – открыто/закрыто. Визуально элемент будет скрыть через CSS.
Далее следует элемент label.btn-menu который выполняет роль самой кнопки. Вложенные элементы span участвуют в визуализации открытия/закрытия меню.
Само меню располагается непосредственно в элементе ul.hidden-menu, по сути это обычный список который содержит ссылки. Далее рассмотрим CSS-код:
.hidden-menu-ticker { display: none; }
.btn-menu { color: #fff; border:1px solid #222; padding: 5px; position: fixed; top: 5px; left: 5px; cursor: pointer; transition: left .23s; z-index: 3; width: 25px; -webkit-transform: translateZ(0); -webkit-backface-visibility: hidden; -webkit-border-radius: 2px; -moz-border-radius: 2px; border-radius: 2px; } .btn-menu span { display: block; height: 5px; background-color: #222; margin: 5px 0 0; transition: all .1s linear .23s; position: relative; } .btn-menu span.first { margin-top: 0; }
.hidden-menu { display: block; position: fixed; list-style:none; padding: 50px 10px 10px; margin: 0; box-sizing: border-box; width: 200px; background-color: #fdf7f7; height: 100%; top: 0; left: -200px; transition: left .2s; z-index: 2; -webkit-transform: translateZ(0); -webkit-backface-visibility: hidden; } .hidden-menu li { padding:10px 0; } .hidden-menu li a { font-size:15px; color:#000; padding:6px 0px; }
Стилизовать меню вы можете по-своему, основное действие — это открытие блока с меню. Меню открывается посредством возможности проверки состояния чекбокса и комбинации стилей.
.hidden-menu-ticker:checked ~ .btn-menu { left: 160px; } .hidden-menu-ticker:checked ~ .hidden-menu { left: 0; } .hidden-menu-ticker:checked ~ .btn-menu span.first { -webkit-transform: rotate(45deg); top: 10px; } .hidden-menu-ticker:checked ~ .btn-menu span.second { opacity: 0; } .hidden-menu-ticker:checked ~ .btn-menu span.third { -webkit-transform: rotate(-45deg); top: -10px; }
В конечном итоге мы получаем элементарный механизм работы. Через элемент label мы воздействуем на input[type=checkbox], активируя его либо деактивируя. В то же время используя возможности CSS3, мы проверяем состояние того самого чекбокса, если он активирован, воздействуем на классы меню и кнопки открытия. По сути происходит простая анимация вращения элементов span в самой кнопки открытия, и изменение позиционирования самого блока меню.
Пример работы меню.
Доброго времени суток.
Подскажите, пожалуйста, как его сделать многоуровневым?
По сути можно добавить любое многоуровневое меню, вместо:
Сделать блок вида:
И подправить стили.
Неплохо... Но как его сделать закрывающимся при клике в любую область экрана, а не только по кнопке крестика....
Нужно отслеживать клик вне элемента меню, посредством js кода и JQuery.
Здравствуйте!
У меня есть контейнер с шириной 960px. Как сделать это меню, чтобы оно отображалось внутри контейнера?
А то значок меню внутри, но когда кликаешь на него, меню выпадает слева экрана, а не внутри контейнера.
И еще вопрос. Как сделать это меню с выравниванием справа?
С уважением, Максим