У меня есть список, где некоторые элементы имеют суб-навигацию:
<ul role="menu">
<li role="menuitem">
<a href="#" class="clearfix">Top Level</a>
</li>
<li class="slidedown open" role="menuitem">
<a href="#" class="clearfix">Top Level</a>
<span class="slidedown-toggle">Show Sub Menu</span>
<!-- Subnav -->
<ul class="list-reset nav-sub" role="menu">
<li role="menuitem">
<a href="#">Second Level</a>
</li>
<li role="menuitem">
<a href="#">Second Level</a>
</li>
<li role="menuitem">
<a href="#">Second Level</a>
</li>
</ul>
</li>
</ul>
У меня есть этот скрипт, который вычисляет высоту subnav <ul>
при нажатии на .slidedown-toggle
а затем меняет его на 0 в зависимости от родительского <li>
имеющего открытый класс.
$(document).ready( function(){
var $slidedownToggle = $('.nav-sidebar .slidedown-toggle');
$slidedownToggle.click(function () {
var $slidedown = $(this).parent('.slidedown'); // Get the container item
var $subnav = $(this).siblings('.nav-sub'); // Get the ul that needs to slide up/down
var totalHeight = 0; // Calculate the height required (in px) to show all <li>'s
$subnav.find('li').each(function() {
totalHeight += $(this).outerHeight(true);
});
// Toggle 'open' class on the parent <li>
$slidedown.toggleClass('open');
// Set the appropriate height
if ($slidedown.hasClass('open')) {
$subnav.css({height: totalHeight + 'px'});
} else {
$subnav.css({height: '0px'});
}
});
});
Проблема в том, что иногда класс 'open' уже был добавлен <li class="slidedown">
потому что, когда вы находитесь на странице subnav, я хочу, чтобы меню было израсходовано, чтобы показать, где вы находитесь. Поскольку я устанавливал height: auto
в CSS для .slidedown.open
, высота не анимирована (я знаю весь слайдунг с использованием max-height, и я не хочу этого), когда вы сначала нажимаете переключатель slidedown-toggle "открытых" предметов.
Самый простой способ увидеть, что я делаю, это посмотреть на JSBIN. Нажмите второе "шоу-меню", и оно будет хорошо скользить вверх и вниз. Нажмите первый, и первый клик не будет скользить (из-за автоматической высоты). Как я могу это исправить? Может быть, сначала установите высоту щелчка, а затем установите значение 0?
Это неприятный взлом, который работает... на готовом обработчике присваивает высоту открытому subnav
$('.nav-sidebar .slidedown.open .nav-sub').height(function(){
return $(this).height();
})
Демо: скрипка
Другое решение обсуждается в нижеследующих сообщениях
Вы можете попробовать список меню на основе наведения - выглядит супер сексуально.
HMTL
> <!DOCTYPE html> <html> <head> <script
> src="http://code.jquery.com/jquery-1.9.1.min.js"></script> <ul
> id="nav"> <li><a href="#">Parent 01</a></li> <li><a href="#"
> class="selected">Parent 02</a> <ul> <li><a href="#">Item
> 01</a></li> <li><a href="#" class="selected">Item 02</a></li>
> <li><a href="#">Item 03</a></li> </ul> <div
> class="clear"></div> </li> <li><a href="#">Parent 03</a> <ul>
> <li><a href="#">Item 04</a></li> <li><a href="#">Item 05</a></li>
> <li><a href="#">Item 06</a></li> <li><a href="#">Item 07</a></li>
> </ul> <div class="clear"></div> </li> <li><a href="#">Parent
> 04</a></li> </ul> </body> </html>
Ява
$(document).ready(function () {
$('#nav li').hover(
function () {
//show its submenu
$('ul', this).stop().slideDown();
},
function () {
//hide its submenu
$('ul', this).stop().slideUp();
}
);
});
.show() and .hide()
, но я обнаружил, что анимация порой прерывистая по сравнению с CSS-анимацией.