CSS: Responsive menu

responsive_menu_12_4_15_1_miniДобрый день, уважаемые читатели!

Мне часто пишут отзывы типа: «Больше! Еще больше статей по адаптивной верстке!».

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

Перед тем, как приступить, рекомендую прочитать статью по media queries в CSS, так как в данной статье мы будем использовать данную конструкцию.

 

Итогом прочтения статьи будет следующее меню:

responsive_menu_12_4_15_3

 

Начнем с 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;
    }
}

 

На больших экранах меню выглядит так:

responsive_menu_12_4_15_1

 

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

responsive_menu_12_4_15_2

 

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

responsive_menu_12_4_15_3

 

 

Наглядный пример можно посмотреть здесь:

 

 

Оригинал статьи можно посмотреть здесь:

 

Спасибо за внимание!

Жду Вас в следующих статьях!

Автор статьи: Alex. Категория: CSS
Дата публикации: 12.04.2015