Иногда заказчики просят сделать горизонтальное меню, которое отодвигает контент, при раскрытии. Раньше я перемещал выпадающую часть за меню и показывал его таким образом. Все работало отлично, но минус этого способа в том, что для вроде бы простой реализации нужно было написать много javascript кода.
Появилась идея реализовать это эффект по-другому.
1. HTML
Ничего не меняем, обычное меню:
<ul class="nav">
<li><a href="/">Lorem</a></li>
<li>
<a href="/">Lorem</a>
<ul>
<li><a href="/">Lorem ipsum</a></li>
<li><a href="/">Lorem ipsum</a></li>
<li><a href="/">Lorem ipsum</a></li>
</ul>
</li>
...
</ul>
2. CSS
Ставим контейнеру высоту и “overflow:hidden”.
.nav{
overflow:hidden;
height:24px;
position:relative;
}
Подменю вешаем на “position:absolute” и скрываем с помощью “visibility:hidden”.
.nav ul{
position:absolute;
left:0;
right:0;
top:24px;
visibility:hidden;
}
3. Javascript
Перебираем элементы первого уровня и узнаем высоты их подменю.
$nav.children('li').each(function(){
var $this = $(this),
height = $this.children('ul').outerHeight();
...
});
На hover по элементу ставим меню нижний padding в размере высоты нужного нам подменю, которое показываем.
...
$this.hover(function(){
$this.addClass('over');
$nav.css({paddingBottom:height});
}, function(){
$this.removeClass('over');
$nav.css({paddingBottom:0});
});
...
Вот собственно и все. Готовый результат можно посмотреть тут. Жду критику и Ваши варианты.
Почитав комментарии решил сделать еще два примера:
в первом добавил плавности jsbin.com/amowup/1,
второй сделал на чистом CSS jsbin.com/ekuput/37 (в этом случае плавность и прочую «красоту» добавить сложнее).
От критиков адекватного примера так и не увидел.