Мой подход заключается в использовании метода .each()
и привязке (одной) click
к каждой кнопке с одинаковым class
и в зависимости от того, на какую кнопку вы нажали (в зависимости от ее индекса ) затем выберите удивительный контейнер для отображения.
В этом сценарии оба удивительных контейнера тоже будут иметь одинаковый class
и будут скрыты от видимости с помощьюотрицательная маржа при том же значении их width
, почему?потому что таким образом они не будут показывать странный эффект, создаваемый при анимации width
(элементы внутри контейнера будут выглядеть как плавающие и упорядоченные во время анимации) ... так что используйте этот html:
<div id="containers">
<div id="container_1" class="awesome">awesome container 1 content</div>
<div id="container_1_button" class="buttonsContainer"><a class="button" href="javascript:;">open 1</a></div>
<div class="clear"></div><!--used in my example to separate floating containers-->
<div id="container_2" class="awesome">awesome container 2 content</div>
<div id="container_2_button" class="buttonsContainer"><a class="button" href="javascript:;">open 2</a></div>
</div>
css для обоих контейнеров и родительского элемента
#containers {
position: relative;
}
#containers .awesome {
width: 300px; /* or whatever */
margin-left: -300px; /* negative value of the width */
overflow: hidden;
float: left; /* to illustrate my example */
display: block; /* if needed */
/* etc other container properties */
}
затем jQuery, в котором мы присваиваем один click
одному и тому же селектору (общий class
обеих кнопок)
$(document).ready(function(){
$(".button").each(function(i){
var selector = $(this); // useful to refer to 'this' inside of any nested function
selector.on("click", function(){
if($(".awesome").eq(i).hasClass('visible')){
$(".awesome").eq(i).animate({'marginLeft':-300},{ queue:false, duration: 200}).removeClass('visible');
} else {
// collapse all if any
$(".awesome").animate({'marginLeft': -300},{ queue:false, duration:200, complete: function(){
// remove to all the class "visible" if any
$(".awesome")
.removeClass('visible')
// animate the corresponding (i) container and add class="visible"
.eq(i).animate({'marginLeft':0},{ queue:false, duration:600})
.addClass('visible');
} // complete
}); // animate
} // if else
}); //on
}); //each
}); //ready
Обратите внимание, что мы используем опцию complete
обратного вызова .animate()
, поэтому следующая анимация будет выполняться до тех пор, пока не будет завершена первая, в этом случае второй контейнер будет отображаться только до тех пор, пока не свернется первый.
Вы можете увидеть это здесь для лучшего понимания эффекта.