Whirling CSS3 dropdown menu с открытием вверх

Есть очень красивое меню Whirling CSS3 dropdown menu на css3 , которое можно скачать по этой ссылке. Но в нем есть один недостаток – подменю раскрывается исключительно вниз. Мне же необходимо было сделать так, чтобы это меню находилось внизу страницы, а подменю раскрывалось вверх. Решение этой задачи я решил описать ниже.

Итак, для начала нам нужно немного подправить стили в файле main.css. На 86 строке находим следующие стили:

.submenu {
 left: 0;
 max-height: 0;
 position: absolute;
 top: 100%;
 z-index: 0;

 -webkit-perspective: 400px;
 -moz-perspective: 400px;
 -ms-perspective: 400px;
 -o-perspective: 400px;
 perspective: 400px;
}

И заменяем свойство top: 100% на bottom: 58px; где 58px – это высота основного пункта меню с учетом бордеров:

.submenu {
 left: 0;
 max-height: 0;
 position: absolute;
 bottom: 58px;
 z-index: 0;

 -webkit-perspective: 400px;
 -moz-perspective: 400px;
 -ms-perspective: 400px;
 -o-perspective: 400px;
 perspective: 400px;
}

Далее ищем на 133 строке следующие стили:

/* CSS3 delays for transition effects */
.menu li:hover .submenu li:nth-child(1) {
 -webkit-transition-delay: 0s;
 -moz-transition-delay: 0s;
 -ms-transition-delay: 0s;
 -o-transition-delay: 0s;
 transition-delay: 0s;
}
.menu li:hover .submenu li:nth-child(2) {
 -webkit-transition-delay: 50ms;
 -moz-transition-delay: 50ms;
 -ms-transition-delay: 50ms;
 -o-transition-delay: 50ms;
 transition-delay: 50ms;
}
.menu li:hover .submenu li:nth-child(3) {
 -webkit-transition-delay: 100ms;
 -moz-transition-delay: 100ms;
 -ms-transition-delay: 100ms;
 -o-transition-delay: 100ms;
 transition-delay: 100ms;
}
.menu li:hover .submenu li:nth-child(4) {
 -webkit-transition-delay: 150ms;
 -moz-transition-delay: 150ms;
 -ms-transition-delay: 150ms;
 -o-transition-delay: 150ms;
 transition-delay: 150ms;
}
.menu li:hover .submenu li:nth-child(5) {
 -webkit-transition-delay: 200ms;
 -moz-transition-delay: 200ms;
 -ms-transition-delay: 200ms;
 -o-transition-delay: 200ms;
 transition-delay: 200ms;
}
.menu li:hover .submenu li:nth-child(6) {
 -webkit-transition-delay: 250ms;
 -moz-transition-delay: 250ms;
 -ms-transition-delay: 250ms;
 -o-transition-delay: 250ms;
 transition-delay: 250ms;
}
.menu li:hover .submenu li:nth-child(7) {
 -webkit-transition-delay: 300ms;
 -moz-transition-delay: 300ms;
 -ms-transition-delay: 300ms;
 -o-transition-delay: 300ms;
 transition-delay: 300ms;
}
.menu li:hover .submenu li:nth-child(8) {
 -webkit-transition-delay: 350ms;
 -moz-transition-delay: 350ms;
 -ms-transition-delay: 350ms;
 -o-transition-delay: 350ms;
 transition-delay: 350ms;
}

.submenu li:nth-child(1) {
 -webkit-transition-delay: 350ms;
 -moz-transition-delay: 350ms;
 -ms-transition-delay: 350ms;
 -o-transition-delay: 350ms;
 transition-delay: 350ms;
}
.submenu li:nth-child(2) {
 -webkit-transition-delay: 300ms;
 -moz-transition-delay: 300ms;
 -ms-transition-delay: 300ms;
 -o-transition-delay: 300ms;
 transition-delay: 300ms;
}
.submenu li:nth-child(3) {
 -webkit-transition-delay: 250ms;
 -moz-transition-delay: 250ms;
 -ms-transition-delay: 250ms;
 -o-transition-delay: 250ms;
 transition-delay: 250ms;
}
.submenu li:nth-child(4) {
 -webkit-transition-delay: 200ms;
 -moz-transition-delay: 200ms;
 -ms-transition-delay: 200ms;
 -o-transition-delay: 200ms;
 transition-delay: 200ms;
}
.submenu li:nth-child(5) {
 -webkit-transition-delay: 150ms;
 -moz-transition-delay: 150ms;
 -ms-transition-delay: 150ms;
 -o-transition-delay: 150ms;
 transition-delay: 150ms;
}
.submenu li:nth-child(6) {
 -webkit-transition-delay: 100ms;
 -moz-transition-delay: 100ms;
 -ms-transition-delay: 100ms;
 -o-transition-delay: 100ms;
 transition-delay: 100ms;
}
.submenu li:nth-child(7) {
 -webkit-transition-delay: 50ms;
 -moz-transition-delay: 50ms;
 -ms-transition-delay: 50ms;
 -o-transition-delay: 50ms;
 transition-delay: 50ms;
}
.submenu li:nth-child(8) {
 -webkit-transition-delay: 0s;
 -moz-transition-delay: 0s;
 -ms-transition-delay: 0s;
 -o-transition-delay: 0s;
 transition-delay: 0s;
}

И заменяем их, так сказать, инверсионными стилями, чтобы скручивание подменю шло в обратную сторону:

/* CSS3 delays for transition effects */
.menu li:hover .submenu li:nth-child(1) {
 -webkit-transition-delay: 350ms;
 -moz-transition-delay: 350ms;
 -ms-transition-delay: 350ms;
 -o-transition-delay: 350ms;
 transition-delay: 350ms;
}
.menu li:hover .submenu li:nth-child(2) {
 -webkit-transition-delay: 300ms;
 -moz-transition-delay: 300ms;
 -ms-transition-delay: 300ms;
 -o-transition-delay: 300ms;
 transition-delay: 300ms;
}
.menu li:hover .submenu li:nth-child(3) {
 -webkit-transition-delay: 250ms;
 -moz-transition-delay: 250ms;
 -ms-transition-delay: 250ms;
 -o-transition-delay: 250ms;
 transition-delay: 250ms;
}
.menu li:hover .submenu li:nth-child(4) {
 -webkit-transition-delay: 200ms;
 -moz-transition-delay: 200ms;
 -ms-transition-delay: 200ms;
 -o-transition-delay: 200ms;
 transition-delay: 200ms;
}
.menu li:hover .submenu li:nth-child(5) {
 -webkit-transition-delay: 150ms;
 -moz-transition-delay: 150ms;
 -ms-transition-delay: 150ms;
 -o-transition-delay: 150ms;
 transition-delay: 150ms;
}
.menu li:hover .submenu li:nth-child(6) {
 -webkit-transition-delay: 100ms;
 -moz-transition-delay: 100ms;
 -ms-transition-delay: 100ms;
 -o-transition-delay: 100ms;
 transition-delay: 100ms;
}
.menu li:hover .submenu li:nth-child(7) {
 -webkit-transition-delay: 50ms;
 -moz-transition-delay: 50ms;
 -ms-transition-delay: 50ms;
 -o-transition-delay: 50ms;
 transition-delay: 50ms;
}
.menu li:hover .submenu li:nth-child(8) {
 -webkit-transition-delay: 0s;
 -moz-transition-delay: 0s;
 -ms-transition-delay: 0s;
 -o-transition-delay: 0s;
 transition-delay: 0s;
}

.submenu li:nth-child(8) {
 -webkit-transition-delay: 350ms;
 -moz-transition-delay: 350ms;
 -ms-transition-delay: 350ms;
 -o-transition-delay: 350ms;
 transition-delay: 350ms;
}
.submenu li:nth-child(7) {
 -webkit-transition-delay: 300ms;
 -moz-transition-delay: 300ms;
 -ms-transition-delay: 300ms;
 -o-transition-delay: 300ms;
 transition-delay: 300ms;
}
.submenu li:nth-child(6) {
 -webkit-transition-delay: 250ms;
 -moz-transition-delay: 250ms;
 -ms-transition-delay: 250ms;
 -o-transition-delay: 250ms;
 transition-delay: 250ms;
}
.submenu li:nth-child(5) {
 -webkit-transition-delay: 200ms;
 -moz-transition-delay: 200ms;
 -ms-transition-delay: 200ms;
 -o-transition-delay: 200ms;
 transition-delay: 200ms;
}
.submenu li:nth-child(4) {
 -webkit-transition-delay: 150ms;
 -moz-transition-delay: 150ms;
 -ms-transition-delay: 150ms;
 -o-transition-delay: 150ms;
 transition-delay: 150ms;
}
.submenu li:nth-child(3) {
 -webkit-transition-delay: 100ms;
 -moz-transition-delay: 100ms;
 -ms-transition-delay: 100ms;
 -o-transition-delay: 100ms;
 transition-delay: 100ms;
}
.submenu li:nth-child(2) {
 -webkit-transition-delay: 50ms;
 -moz-transition-delay: 50ms;
 -ms-transition-delay: 50ms;
 -o-transition-delay: 50ms;
 transition-delay: 50ms;
}
.submenu li:nth-child(1) {
 -webkit-transition-delay: 0s;
 -moz-transition-delay: 0s;
 -ms-transition-delay: 0s;
 -o-transition-delay: 0s;
 transition-delay: 0s;
}

И в самом конце стилей добавляем:

.menu li:hover .submenu{
 bottom: 58px !important;
}

При таких изменениях подменю будет открываться вверх, но будет происходить один некрасивый баг – когда убираешь курсор с пункта меню, свертывающееся подменю будет резко падать вниз. Чтобы этого избежать, нужно написать небольшой скрипт. Подключаем jQuery и пишем следующее:

<script type="text/javascript">
$(window).load(function() {

   $('.menu .submenu').each(function(){
     var subHeight = $(this).height(); //считаем высоту всего подменю
     var countLi = $(this).find('li').length; // считаем количество пунктов меню в подменю
     var full_height=0;
     $(this).find('li').each(function(){
       full_height+=$(this).height()+2; // считаем суммарную высоту всех пунктов меню + запас для бордера пунктов меню
     });
     $(this).css('bottom',full_height+countLi*2+58); // Просчитываем позиционирование подменю, где 58px - высота основного пункта меню
  });

});
</script>

Вот, собственно, и все.

Демо | Скачать исходник

😡
☹️
😐
☺️
😍
Comments (0)
Добавить комментарий

Ваш e-mail не будет опубликован.