Аккордеон меню – лучший вариант решения вертикального меню для сайта, он идеально подойдет для страниц с обширной навигацией. Главное достоинство аккордеон меню в том, что оно очень компактно, при условии того, что внутренних вкладок может быть очень много. С точки зрения пользователя, вертикальное меню намного удобнее горизонтального, т.к. физиологически человеческая кисть устроена так, что нам проще проводить мышью вертикальные, а не горизонтальные линии. Используя аккордеон меню, мы заботимся и о наших пользователях, и украшаем наш сайт динамическими эффектами, делая его ярче и привлекательнее.
Начнем, как всегда, c HTML структуры. Сразу отмечу, решение нестандартное и для его реализации мы будем использовать элементы HTML5 и некоторые свойства CSS3, что самое необычное, стилизованные чекбоксы. Чекбоксы нам необходимы для того, чтобы отследить при помощи псевдо-класса checked пункт, который выбрал пользователь.
Чтобы не усложнять конструкцию внутренними пунктами, в примере я ограничусь скрытыми блоками с простым текстом, вы же можете вложить внутрь любые теги (ссылки, дивы, списки и т.д.). Если будете использовать изображения, то не забудьте следить за размерами, чтобы картинка не растянула аккордеон в нечто невообразимое.
HTML структура:
<div class="conntainer">
<section class="acc-conntainer">
<!-- 1 пункт -->
<div>
<input id="acc-1" name="accordion-1" type="checkbox" />
<label for="acc-1">Название первого пункта</label>
<article class="acc-small">
Контент первого пункта
</article>
</div>
<!-- 2 пункт -->
<div>
<input id="acc-2" name="accordion-1" type="checkbox" />
<label for="acc-2">Название второго пункта</label>
<article class="acc-medium">
Контент второго пункта
</article>
</div>
</section>
</div>
Назначаем стили для нашего аккордеона:
.acc-conntainer{
width: 400px;
margin: 50px auto 30px;
text-align: left;
}
.acc-conntainer label{
font-family: Arial, sans-serif;
padding: 5px 20px;
position: relative;
z-index: 20;
display: block;
height: 30px;
cursor: pointer;
color: #777;
text-shadow: 1px 1px 1px rgba(255, 255, 255, 0.8);
line-height: 33px;
font-size: 19px;
background: #ffffff;
background: -moz-linear-gradient(top, #ffffff 1%, #eaeaea 100%);
background: -webkit-gradient(linear, left top, left bottom, color-stop(1%, #ffffff), color-stop(100%, #eaeaea));
background: -webkit-linear-gradient(top, #ffffff 1%, #eaeaea 100%);
background: -o-linear-gradient(top, #ffffff 1%, #eaeaea 100%);
background: -ms-linear-gradient(top, #ffffff 1%, #eaeaea 100%);
background: linear-gradient(top, #ffffff 1%, #eaeaea 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr="#ffffff", endColorstr="#eaeaea",GradientType=0);
box-shadow:
0px 0px 0px 1px rgba(155, 155, 155, 0.3),
1px 0px 0px 0px rgba(255, 255, 255, 0.9) inset,
0px 2px 2px rgba(0, 0, 0, 0.1);
}
Подсвечиваем вкладку, на которую пользователь навел курсор:
.acc-conntainer label:hover{
background-color: #fff;
}
Изменяем стили вкладки открытого блока:
.acc-conntainer input:checked + label,
.acc-conntainer input:checked + label:hover{
background-color: #c6e1ec;
color: #3d7489;
text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.6);
box-shadow:
0px 0px 0px 1px rgba(155, 155, 155, 0.3),
0px 2px 2px rgba(0, 0, 0, 0.1);
}
Отрисовываем стрелочку при наведении на закрытую вкладку:
.acc-conntainer label:hover:after,
.acc-conntainer input:checked + label:hover:after{
content: "";
background: transparent url(../img/arrow_down.png) no-repeat center center;
position: absolute;
right: 13px;
top: 7px;
width: 24px;
height: 24px;
}
Отрисовываем стрелочку при наведении на открытую вкладку:
.acc-conntainer input:checked + label:hover:after{
background-image: url(../img/arrow_up.png);
}
Прячем input по которому мы отслеживает выбор пользователя:
.acc-conntainer input{
display: none;
}
Задаем стили раскрывающегося блока:
.acc-conntainer article{
background-color: rgba(255, 255, 255, 0.5);
margin-top: -1px;
overflow: hidden;
height: 0px;
position: relative;
z-index: 10;
transition: height 0.3s ease-in-out, box-shadow 0.6s linear; /* Добавляем свойство с префиксами */
}
.acc-conntainer article p{
font-style: italic;
color: #777;
line-height: 23px;
font-size: 14px;
padding: 20px;
text-shadow: 1px 1px 1px rgba(255, 255, 255, 0.8);
}
Создаем плавную механику открытия скрытых блоков:
.acc-conntainer input:checked ~ article{
transition: height 0.5s ease-in-out, box-shadow 0.1s linear; /* Учитываем более старые браузеры, не забываем про префиксы */
box-shadow: 0px 0px 0px 1px rgba(155, 155, 155, 0.3);
}
Значение высоты открывающегося блока прячем в несколько классов, во избежание ошибок построения блоков. Приходится задавать фиксированную высоту потому, как для данного аккордеона мы не используем JavaScript и ограничены только возможностями CSS:
.acc-conntainer input:checked ~ article.acc-small{
height: 140px;
}
.acc-conntainer input:checked ~ article.acc-medium{
height: 180px;
}
.acc-conntainer input:checked ~ article.acc-large{
height: 230px;
}
На этом реализация меню в виде аккордеона на CSS закончено.