falbar Аккордеон меню на CSS

Аккордеон меню на CSS

20 апреля 2015 3515 0

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

Реклама

Начнем, как всегда, 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 закончено.

Реклама
Комментариев еще не оставлено
no_avatar