Search code examples
javascriptjquery-uislidetoggle

Get JavaScript slideToggle to close active div when opening another one?


Here's a demo of what I have so far: http://www.betafreshmedia.com/nathan/coffee.html

I know there are a lot of other questions like this, however, I cannot adapt their syntax to mine as everyone's is pretty different. Here's my jQuery:

$(".trigger").click(function() {
$(this).find('ul.coffeetype').slideToggle();
});

I want a minimal, straight-forward way to continue using the same class for each div and only allow one to be opened at a time. When you click on a div that's closed, I want the open one to slide out of sight and the new one to drop down in its respective position.

HTML:

<div class="trigger">
<img src="images/coffeetype1.png" />
<ul class="coffeetype">
    <li>International</li>
    <li>Regional</li>
    <li>International</li>
    <li>Regional</li>
    <li>International</li>
    <li>Regional</li>
    <li>International</li>
    <li>Regional</li>
    <li>International</li>
    <li>Regional</li>
    <li>International</li>
    <li>Regional</li>
</ul>
</div>
<div class="trigger">
<img src="images/coffeetype1.png" />
<ul class="coffeetype">
    <li>International</li>
    <li>Regional</li>
    <li>International</li>
    <li>Regional</li>
    <li>International</li>
    <li>Regional</li>
    <li>International</li>
    <li>Regional</li>
    <li>International</li>
    <li>Regional</li>
    <li>International</li>
    <li>Regional</li>
</ul>
</div>
<div class="trigger">
<img src="images/coffeetype1.png" />
<ul class="coffeetype">
    <li>International</li>
    <li>Regional</li>
    <li>International</li>
    <li>Regional</li>
    <li>International</li>
    <li>Regional</li>
    <li>International</li>
    <li>Regional</li>
    <li>International</li>
    <li>Regional</li>
    <li>International</li>
    <li>Regional</li>
</ul>
</div>

It's just the same thing three times in a row right now for demo purposes.


Solution

  • $(document).ready(function() {
        $(".trigger").click(function() {
            var $el = $(this).find('ul.coffeetype');
            var $opened = $('.toggledDown').not($el);
            $opened.toggleClass('toggledDown');
            $opened.slideToggle();
            $el.toggleClass('toggledDown');
            $el.slideToggle();
        });
    });
    

    Track the ones that are open and close them before you open the active one.

    EDIT Added the ".not($el)" so you can still toggle the same menu up and down.