Головна » Статті » WEB-дизайн(html5,css,php...)

Анимированное меню на CSS3

В этой небольшой заметке представлен перевод статьи с tutorialzine.com о создании цветастого анимированного меню, используя лишь CSS3 и пиктографический шрифт Font Awesome. Если кто не знает, пиктографический шрифт — это шрифт, в котором вместо алфавитно-цифровых символов используются пиктограммы (они же «иконки»). Для разработчиков это означает удобный способ работы с элементами, содержащими пиктограммы — кнопками, тулбарами и т. п. Всё что для этого нужно — это поддержка браузером CSS3-загрузки шрифтов, что на сегодня умеют почти все современные браузеры. Для того, чтобы добавить пиктограмму внутрь элемента, вам нужно всего лишь определить  нужный класс для элемента и — вуаля, используя селектор :before, Font Awesome лёгким движением руки превращает брюки в элегантные шорты. Поехали.

Вот HTMK-скелетик, на котором мы будем экспериментировать:

    
<nav id="colorNav">
<ul>
<li class="green">
<a href="#" class="icon-home"></a>
<ul>
<li><a href="#">Выпадающий элемент 1</a></li>
<li><a href="#">Выпадающий элемент 2</a></li>
<!-- Выпадающие элементы -->
</ul>
</li>

<!-- Элементы меню -->

</ul>
</nav>

Каждый элемент меню — это дочерний LI-элемент первого уровня UL-списка. Каждый такой LI- элемент содержит сначала ссылку и затем ещё один немаркированный список. Ссылка здесь выполняет роль кнопки с пиктограммой, являющейся контейнером для выпадающего меню. Пиктограмму кнопки можно определить, добавив соответствующий класс к ссылке: в примере выше — это icon-home, а полный список соответствия классов пикотграммам вы можете подсмотреть здесь. Выпадающее меню организовано простым одноуровневым немаркированным списком.

Возвращаясь к фрагменту кода выше, мы видим два вложенных друг в друга UL-списка, то бишь два элемента с одинаковым именем. Так что при написании CSS мы должны быть поаккуратней, чтобы не захватить каскадом лишних дочерних элементов. К счастью, у нас в распоряжении имеется селектор '>', который не даст обработчику CSS опускаться слишком глубоко там, где это не нужно.

Вооружившись вышеозначенным селектором, определим размеры и положение контейнера всего меню:

#colorNav > ul {
    width: 450px;
    margin: 0 auto;
}

    
#colorNav > ul {
width: 450px;
margin: 0 auto;
}

А затем и элементов верхнего уровня:

#colorNav > ul > li { /* Ограничиваемся LI-элементами только верхнего уровня */
    list-style: none;
    box-shadow: 0 0 10px rgba(100, 100, 100, 0.2) inset,1px 1px 1px #CCC;
    display: inline-block;
    line-height: 1;
    margin: 1px;
    border-radius: 3px;
    position: relative;
}
    
#colorNav > ul > li { /* Ограничиваемся LI-элементами только верхнего уровня */
list-style: none;
box-shadow: 0 0 10px rgba(100, 100, 100, 0.2) inset,1px 1px 1px #CCC;
display: inline-block;
line-height: 1;
margin: 1px;
border-radius: 3px;
position: relative;
}

display: inline-block здесь определён для того, чтобы блочные по своей природе элементы LI вели себя почти как инлайновые, выстраиваясь в одну строку, а position: relative обеспечивает корректное поведение выпадающих подменю. Как помним, A-элементы содержат в себе пиктограммы, выполненные при помощи текста, так что немного подкорректируем умолчания для A-элементов, убрав подчёркивание текста и приятный глазу синий цвет:

#colorNav > ul > li > a {
    color: inherit;
    text-decoration: none !important;
    font-size: 24px;
    padding: 25px;
}

    
#colorNav > ul > li > a {
color: inherit;
text-decoration: none !important;
font-size: 24px;
padding: 25px;
}

Поехали дальше. Теперь приступим к выпадающим меню. Здесь для реализации анимации мы воспользуемся CSS-атрибутом transition. Также, определим нулевое значение высоты элемента в обычном состоянии, таким образом скрыв его до того, как над ним не появится указатель мыши:

#colorNav li ul {
    position: absolute;
    list-style: none;
    text-align: center;
    width: 180px;
    left: 50%;
    margin-left: -90px;
    top: 70px;
    font: bold 12px 'Open Sans Condensed', sans-serif;

    /* CSS-анимация */
    max-height: 0px;
    overflow: hidden;
    transition: max-height 0.4s linear;
    -webkit-transition: max-height 0.4s linear;
    -moz-transition: max-height 0.4s linear;
}
    
#colorNav li ul {
position: absolute;
list-style: none;
text-align: center;
width: 180px;
left: 50%;
margin-left: -90px;
top: 70px;
font: bold 12px 'Open Sans Condensed', sans-serif;

/* CSS-анимация */
max-height: 0px;
overflow: hidden;
transition: max-height 0.4s linear;
-webkit-transition: max-height 0.4s linear;
-moz-transition: max-height 0.4s linear;
}

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

#colorNav li:hover ul {
    max-height: 200px;
}
    
#colorNav li:hover ul {
max-height: 200px;
}

Значение высоты указано жёстко, поскольку, к сожалению, на данный момент автору не известно способов определить её автоматически при помощи одних лишь CSS.

Следующим шагом необходимо определить стили для непосредственно элементов выпадающего меню:

#colorNav li ul li {
    background-color: #313131;
}

#colorNav li ul li a {
    padding: 12px;
    color: #fff !important;
    text-decoration: none !important;
    display: block;
}

/* Зебра */
#colorNav li ul li:nth-child(odd) {
    background-color: #363636;
}

#colorNav li ul li:hover {
    background-color: #444;
}

#colorNav li ul li:first-child {
    border-radius: 3px 3px 0 0;
    margin-top: 25px;
    position: relative;
}

/* Указатель на текущий родительский элемент */
#colorNav li ul li:first-child:before {
    content: '';
    position: absolute;
    width: 1px;
    height: 1px;
    border: 5px solid transparent;
    border-bottom-color: #313131;
    left: 50%;
    top: -10px;
    margin-left: -5px;
}

#colorNav li ul li:last-child {
    border-bottom-left-radius: 3px;
    border-bottom-right-radius: 3px;
}
    
#colorNav li ul li {
background-color: #313131;
}

#colorNav li ul li a {
padding: 12px;
color: #fff !important;
text-decoration: none !important;
display: block;
}

/* Зебра */
#colorNav li ul li:nth-child(odd) {
background-color: #363636;
}

#colorNav li ul li:hover {
background-color: #444;
}

#colorNav li ul li:first-child {
border-radius: 3px 3px 0 0;
margin-top: 25px;
position: relative;
}

/* Указатель на текущий родительский элемент */
#colorNav li ul li:first-child:before {
content: '';
position: absolute;
width: 1px;
height: 1px;
border: 5px solid transparent;
border-bottom-color: #313131;
left: 50%;
top: -10px;
margin-left: -5px;
}

#colorNav li ul li:last-child {
border-bottom-left-radius: 3px;
border-bottom-right-radius: 3px;
}

Ну и, конечно же, куда мы без цвета. Раскрасим каждый элемент по-своему:

#colorNav li.green {
    /* Фон элемента */
    background-color: #00c08b;

    /* Пиктограмма */
    color: #127a5d;
}

#colorNav li.red { background-color:#ea5080;color:#aa2a52; }
#colorNav li.blue { background-color:#53bfe2;color:#2884a2; }
#colorNav li.yellow { background-color:#f8c54d;color:#ab8426; }
#colorNav li.purple { background-color:#df6dc2;color:#9f3c85; }

    
#colorNav li.green {
/* Фон элемента */
background-color: #00c08b;

/* Пиктограмма */
color: #127a5d;
}

#colorNav li.red { background-color:#ea5080;color:#aa2a52; }
#colorNav li.blue { background-color:#53bfe2;color:#2884a2; }
#colorNav li.yellow { background-color:#f8c54d;color:#ab8426; }
#colorNav li.purple { background-color:#df6dc2;color:#9f3c85; }

 

Категорія: WEB-дизайн(html5,css,php...) | Додав: zverius (12.10.2016)
Переглядів: 438 | Рейтинг: 0.0/0
Всього коментарів: 0
avatar