Добрый день, уважаемые читатели!
Мне часто пишут отзывы типа: «Больше! Еще больше статей по адаптивной верстке!».
Так вот, сегодня будет именно такая статья. И сегодня мы разберем, как сделать несложное адаптивное меню.
Перед тем, как приступить, рекомендую прочитать статью по media queries в CSS, так как в данной статье мы будем использовать данную конструкцию.
Итогом прочтения статьи будет следующее меню:

Начнем с HTML
<input type="checkbox" id="menu">
<label for="menu" onclick></label> <!-- иконка для маленьких экранов -->
<nav role="off-canvas"> <!-- наше меню -->
<ul>
<li><a href="#">Главная</a></li>
<li><a href="#">Статьи</a></li>
<li><a href="#">Проекты</a></li>
<li><a href="#">О нас</a></li>
<li><a href="#">Контакты</a></li>
</ul>
</nav>
<div class="content-text">
...
</div>
По сути ничего сложного. Label будет отображаться при маленьком разрешении экрана. Первый checkbox нужен для применения нужных стилей. При щелчке по label будет происходить переключение checkbox, так как у label указан for=menu.
На больших экранах мы скроем label:
label {
position: absolute;
left: 0;
display: none;
}
На маленьких экранах мы скроем основное меню и покажем label / input.
Стили для небольших экранов
Для определения маленьких экранов мы воспользуемся media queries:
@media screen and (max-width: 44em) {
...
}
Чтобы спрятать меню мы добавим ему ширину и добавим отрицательное смещение влево.
nav {
position: absolute;
top: 23em;
left: -20em; /* сдвинули */
width: 20em; /* задали ширину */
opacity: 0;
}
Чтобы пользователь понял, что label — это иконка, добавим для нее псевдо-элемент с text «≡» (\2261)
label:after {
content: "\2261";
}
Когда пользователь кликает по иконке — меню выдвигается слева, а контент смещается вправо.
/* как раз вот для этого нам и понадобился input */
input:checked ~ nav {
opacity: 1;
left: 0;
box-shadow: -30em 0 0 30em rgba(0, 0, 0, 0.3);
}
input:checked ~ .content-text {
margin-left: 20.5em;
margin-right: -20.5em;
}
Ниже представлен общий код для небольших экранов
/* маленькие экраны */
@media screen and (max-width: 44em) {
html,
body {
margin: 0;
overflow-x: hidden;
}
.content-text {
margin: 2.5em .5em 0 .5em;
}
nav {
position: absolute;
top: 23em;
left: -20em;
width: 20em;
opacity: 0;
}
nav ul > li {
height: 100%;
width: 100%;
text-align: left;
margin: 0;
}
label {
display: block;
}
label:after {
content: "\2261";
font-size: 1.8em;
}
label:hover,
input:checked ~ label {
color: #000;
}
input:checked ~ nav {
opacity: 1;
left: 0;
box-shadow: -30em 0 0 30em rgba(0, 0, 0, 0.3);
}
input:checked ~ nav ul > li {
padding: .55em .55em .55em 1.5em;
}
input:checked ~ nav ul > li:hover {
padding-left: 3.5em;
}
input:checked ~ nav ul > li:after {
position: absolute;
right: .25em;
content: "\203A";
font: bold 1.4em sans-serif;
color: inherit;
}
input:checked ~ .content-text {
margin-left: 20.5em;
margin-right: -20.5em;
}
}
На больших экранах меню выглядит так:

Скрытое меню на маленьких так:

А развернутое так:

Наглядный пример можно посмотреть здесь:
Оригинал статьи можно посмотреть здесь:
Спасибо за внимание!
Жду Вас в следующих статьях!