Верстка адаптивного меню
14.02.2017

Верстка адаптивного меню

Адаптивные меню, сворачивающиеся в гамбургер на мобильных устройствах, сейчас можно видеть практически на любом сайте. В этом уроке мы научимся верстать такие меню. В конце мы должны получить результат, показанный ниже:

See the Pen QdYOGX by Ekaterina Nazarova (@katienazarova) on CodePen.

Меню для больших экранов

Для начала сверстаем обычное меню для «большого» разрешения (в нашем случае это будет разрешение экрана 1000px и больше). Для этого создадим следующую структуру HTML:


<div class="menu">
    <div class="menu__links">
        <a class="menu__links-item" href="/">Item 1</a>
        <a class="menu__links-item" href="/">Item 2</a>
    </div>
</div>

И добавим необходимые стили:


.menu {
    text-align: right;
}

.menu__links-item {
    display: inline-block;
    color: #333333;
    font-family: Arial;
    font-size: 14px;
    line-height: 30px;
    padding: 0 10px;
    text-transform: uppercase;
    text-decoration: none;
}

.menu__links-item:hover {
    text-decoration: underline;
}

Пока все просто. Мы добавили два пункта меню и стилизовали их так, как нам нужно.

Адаптация для мобильных устройств

На втором шаге нам нужно добавить иконку гамбургера и сделать так, чтобы на мобильных устройствах меню открывалось по клику на эту иконку. На экранах шириной более 1000px должно отображаться обычное меню.

В HTML структуру добавим иконку:


<div class="menu__icon">
      <span></span>
      <span></span>
      <span></span>
      <span></span>
</div>

И напишем для нее стили:


.menu__icon {
    display: none;
    width: 45px;
    height: 35px;
    position: relative;
    cursor: pointer;
}

.menu__icon span {
    display: block;
    position: absolute;
    height: 9px;
    width: 100%;
    background: #333333;
    border-radius: 9px;
    opacity: 1;
    left: 0;
    transform: rotate(0deg);
    transition: .25s ease-in-out;
}

.menu__icon span:nth-child(1) {
    top: 0px;
}

.menu__icon span:nth-child(2), .menu__icon span:nth-child(3) {
    top: 13px;
}

.menu__icon span:nth-child(4) {
    top: 26px;
}

Обратите внимание на правило display: none; для класса .menu__icon — по умолчанию иконка должна быть не видна.

Для маленьких экранов добавим дополнительные правила: во-первых, нам нужно показать иконку, во-вторых — доработать стили и скрыть меню, в-третьих, добавить стили для элементов меню:


@media screen and (max-width: 999px) {
  .menu__icon{
    display: inline-block;
  }
  
  .menu__links {
    position: fixed;
    display: block;
    top: 0;
    right: 0;
    left: 0;
    margin-top: 52px;
    background-color: rgba(0, 0, 0, 0.8);
    z-index: 1000;
    overflow: auto;
    opacity: 0;
  }
  
  .menu__links-item {
    display: block;
    padding: 10px 0;
    text-align: center;
    color: #ffffff;
  }
}

Теперь верстка меню работает как нужно, остался последний шаг — показывать меню при клике на иконку.

Реализация логики меню

Чтобы показать меню при клике на иконку, добавим немного JavaScript’а.


(function($){
  $(function() {
    $('.menu__icon').on('click', function() {
      $(this).closest('.menu').toggleClass('menu_state_open');
    });
  });
})(jQuery);

Для простоты мы использовали jQuery, вы же, если захотите, можете реализовать ту же логику на своем фреймворке или на чистом JavaScript. В коде выше мы всего лишь переключаем класс .menu_state_open у элемента .menu при нажатии на иконку.

И наконец, добавим стили для открытого состояния меню:


.menu.menu_state_open .menu__icon span:nth-child(1) {
    top: 18px;
    width: 0%;
    left: 50%;
}

.menu.menu_state_open .menu__icon span:nth-child(2) {
    transform: rotate(45deg);
}

.menu.menu_state_open .menu__icon span:nth-child(3) {
    transform: rotate(-45deg);
}

.menu.menu_state_open .menu__icon span:nth-child(4) {
    top: 18px;
    width: 0%;
    left: 50%;
}

.menu.menu_state_open .menu__links {
    opacity: 1;  
}

Для открытого состояния меню мы задаем нулевую ширину верхней и нижней полоске гамбургера, а две средние поворачиваем на 45 градусов так, чтобы они образовывали крестик (именно поэтому центральную полоску образуют два элемента span, расположенные друг над другом).

Заключение

В этом уроке мы сверстали адаптивное меню, сворачивающее в гамбургер на маленьких экранах. В зависимости от требований дизайна вы можете стилизовать его по своему усмотрению, но общий принцип останется тем же. Работающий пример вы можете посмотреть в демо в самом начале статьи или по ссылке.