Для упрощения навигации по сайту на мобильных устройствах часто используют адаптированное меню. Делается это по ясной причине, не всегда десктопная версия меню может быть так же удобна и в мобильной версии сайта. Для этих целей, на сегодняшний день существует множество плагинов, которые позволяют реализовать данный функционал. Однако, использование плагинов не всегда бывает необходимым. В частности, если можно решить подобную задачу элементарным способом.
В данном посту мы рассмотрим способ реализации мобильного меню для сайта на 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 в самой кнопки открытия, и изменение позиционирования самого блока меню.
Пример работы меню.
Доброго времени суток.
Подскажите, пожалуйста, как его сделать многоуровневым?
По сути можно добавить любое многоуровневое меню, вместо:
<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>Сделать блок вида:
И подправить стили.
Неплохо... Но как его сделать закрывающимся при клике в любую область экрана, а не только по кнопке крестика....
Нужно отслеживать клик вне элемента меню, посредством js кода и JQuery.
jQuery(function($){ $(document).mouseup(function (e){ // событие клика по веб-документу var menu= $(".hidden-menu"); // тут указываем ID элемента if (!menu.is(e.target) // если клик был не по нашему блоку && menu.has(e.target).length === 0) { // и не по его дочерним элементам $('#hmt').prop('checked', false); // снимаем флаг с чекбокса - скрываем меню } }); });Здравствуйте!
У меня есть контейнер с шириной 960px. Как сделать это меню, чтобы оно отображалось внутри контейнера?
А то значок меню внутри, но когда кликаешь на него, меню выпадает слева экрана, а не внутри контейнера.
И еще вопрос. Как сделать это меню с выравниванием справа?
С уважением, Максим