В продолжение примеров различных UI-элементов сайтов, которые можно сделать без Javascript, сегодня распишу как можно сделать выезжающее меню на чистом CSS.
И снова ДЕМО, для начала.
Начнем пожалуй со HTML-структуры:
<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="">Link 1</a></li>
<li><a href="">Link 2</a></li>
<li><a href="">Link 3</a></li>
</ul>
input
нам необходим для определения видимости меню: то есть если он выбран, то меню видно и наоборот.
label
– это наша кнопка-бургер, которая привязана к инпуту.
ul
– сам блок меню.
Теперь CSS (писал только для WebKit
-браузеров: Opera 16+, Safari, Chrome).
Наше меню:
.hidden-menu {
display: block;
position: fixed;
list-style:none;
padding: 10px;
margin: 0;
box-sizing: border-box;
width: 200px;
background-color: #eee;
height: 100%;
top: 0;
left: -200px;
transition: left .2s;
z-index: 2;
-webkit-transform: translateZ(0);
-webkit-backface-visibility: hidden;
}
Здесь много раздолья для креативных людей, но главные параметры – это width
и left
. Он должны иметь одинаковое значение, но left
при этом является отрицательным. Тем самым мы прячем нашу меню слева от экрана. Также добавил анимацию transition: left .2s
для красоты процесса выезда из-за пределов экрана.
Наш чекбокс:
.hidden-menu-ticker {
display: none;
}
Его просто делаем невидимым.
Кнопка-бургер:
.btn-menu {
color: #fff;
background-color: #666;
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;
}
.btn-menu span {
display: block;
height: 5px;
background-color: #fff;
margin: 5px 0 0;
transition: all .1s linear .23s;
position: relative;
}
.btn-menu span.first {
margin-top: 0;
}
Оформлять также можно как угодно. Я сделал просто серую кнопку с белыми полосками в левом верхнем углу. Сюда тоже добавил анимации для самой кнопки и для полосок (просто для красоты).
Теперь, так называемая «магия»:
.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;
}
CSS3-селекторы позволяют нам определять состояние чекбокса и применять, в зависимости от этого те или иные свойства для соседних элементов :checked ~
. В данном примере мы при «чекнутом» инпуте сдвигаем кнопку меню .hidden-menu-ticker:checked ~ .btn-menu
влево на 160 пикселей, меню до левого края .hidden-menu-ticker:checked ~ .hidden-menu
. Остальные стили написаны для полосок кнопки меню, чтобы они при нажатии превращались в крестик и наоборот.
И снова ДЕМО.