Я пытаюсь создать многослойное меню с классными эффектами скольжения/затухания. Прямо сейчас он работает с моего первого щелчка, но после этого он терпит неудачу.
HTML
<ul id="menu">
<li>
Development
<div>
<ul>
<li>Sub 1</li>
<li>Sub 2</li>
</ul>
</div>
</li>
<li>
Story
<div>
<ul>
<li>Sub 1</li>
<li>Sub 2</li>
</ul>
</div>
</li>
<li>
News
<div>
<ul>
<li>Sub 1</li>
<li>Sub 2</li>
</ul>
</div>
</li>
</ul>
JavaScript
var observeClicks = function(){
var lis = $('#menu').children('li');
lis.click(function(){
lis.unbind();
var $this = $(this);
var $div = $($this.children('div')[0]);
var $ul = $($div.children('ul')[0]);
var clone = $ul.clone(true, true)
.css({visibility: 'hidden', display: 'block'});
clone.attr('style', clone.attr('style').replace('block', 'block !important'))
.insertAfter($ul);
setTimeout(function(){
$ul.css({height: clone.css('height')});
$div.css({height: clone.css('height')});
clone.remove();
}, 0);
if(!lis.hasClass('current')){
$this.addClass('current');
$div.slideDown(350, function(){
$ul.fadeIn(350);
observeClicks();
});
}else{
if(!$this.hasClass('current')){
$current = $($('.current')[0]);
$cdiv = $($current.children('div')[0]);
$cul = $($cdiv.children('ul')[0]);
$cdiv.css({height: $cul.css('height')});
$this.addClass('current');
$current.removeClass('current');
$cul.fadeOut(350, function(){
$cdiv.slideUp(350, function(){
$div.slideDown(350, function(){
$ul.fadeIn(350);
observeClicks();
});
});
});
}else{
observeClicks();
}
}
});
}
observeClicks();
CSS
#menu {
cursor: pointer;
width: 150px;
}
#menu div {
display: none;
width: 100%;
}
#menu li ul {
display: none;
margin-left: 25px;
}
Первая интересная проблема, с которой я столкнулся, заключалась в том, что вместо скольжения мое меню просто «всплывало». Это было потому, что div не занимал места, пока не отображались элементы внутри него. Поэтому я преодолел это, задав ему фиксированную область. (Ширина задается в CSS, а высота задается в JavaScript). Я думаю, что проблема может заключаться в этом, я вставляю фиктивный элемент, читаю его высоту, назначаю это div, а затем удаляю элемент. Это схематично, я знаю, но я не мог найти лучшего способа.
В любом случае, когда я впервые нажимаю на пункт меню, он работает отлично. Но как только я пробую свой второй щелчок, кажется, что высота для div не устанавливается, и эффекта скольжения нет. Посмотрите здесь.
Вы также можете заметить, что вместо того, чтобы пытаться возиться с .stop()
для анимации, я просто отвязываю обработчик кликов, а затем повторно привязываю их после завершения всех анимаций. Это было преднамеренно, и у меня была эта проблема, прежде чем добавить это. Если бы кто-нибудь мог показать мне, что исправить, я был бы очень признателен.