Javascript expand / collapse button

I am trying to create a toggle button that loads with content already hidden. This is the code I'm using, but I'm not sure how to make the content show hidden (which makes the toggle button function more useful for expanding content).

$(function() {
  var b = $("#button");
  var w = $("#wrapper");
  var l = $("#list");
  
  w.height(l.outerHeight(true));

  b.click(function() {
  
    if(w.hasClass('open')) {
      w.removeClass('open');
      w.height(0);
    } else {
      w.addClass('open');
      w.height(l.outerHeight(true));
    }
  
  });
});
      

#wrapper {
  background: #ccc;
  overflow: hidden;
  transition: height 200ms;
}
      

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button id="button">Toggle Expand/Collapse</button>
<div id="wrapper" class="open">
  <ul id="list">
    <li>Item</li>
    <li>Item</li>
    <li>Item</li>
    <li>Item</li>
  </ul>
</div>
      

Run codeHide result


+3


source to share


5 answers


Option 1: Simplified code

You can actually simplify a fair amount by relying on CSS to define the show / hide style, and the transition to max-height

, then you just switch the add, for example. a open

to expand the height of the content.

It also maintains a strong separation of concerns while keeping functionality with Javascript and CSS styling.

$(function() {
  var b = $("#button");
  var w = $("#wrapper");
  var l = $("#list");
  b.click(function() {
    w.toggleClass('open'); /* <-- toggle the application of the open class on click */
  });
});
      

#wrapper {
  background: #ccc;
  overflow: hidden;
  transition: max-height 300ms;
  max-height: 0; /* <---hide by default */
}
#wrapper.open {
  max-height: 100px; /* <---when open, allow content to expand to take up as much height as it needs, up to e.g. 100px */
}
      

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button id="button">Toggle Expand/Collapse</button>
<div id="wrapper">
  <ul id="list">
    <li>Item</li>
    <li>Item</li>
    <li>Item</li>
    <li>Item</li>
  </ul>
</div>
      

Run codeHide result




Option 2: Revised code

Alternatively, if you want to use your existing code, you need to change it to the default state hidden

. Do this by setting height

to zero in your CSS, removing the class open

from your HTML, and removing the initial height setting from your Javascript:

$(function() {
  var b = $("#button");
  var w = $("#wrapper");
  var l = $("#list");

  // w.height(l.outerHeight(true)); REMOVE THIS 

  b.click(function() {

    if (w.hasClass('open')) {
      w.removeClass('open');
      w.height(0);
    } else {
      w.addClass('open');
      w.height(l.outerHeight(true));
    }

  });
});
      

#wrapper {
  background: #ccc;
  overflow: hidden;
  transition: height 200ms;
  height: 0; /* <-- set this */
}
      

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button id="button">Toggle Expand/Collapse</button>
<!-- <div id="wrapper" class="open"> REMOVE THIS  -->
<div id="wrapper">
  <ul id="list">
    <li>Item</li>
    <li>Item</li>
    <li>Item</li>
    <li>Item</li>
  </ul>
</div>
      

Run codeHide result


+3


source


using CSS

You can accomplish this with just CSS:

div#wrapper {
  transition: max-height 1000ms;
  overflow: hidden;
}
#toggle:not(:checked) ~ div#wrapper {
  max-height: 0;
}
#toggle:checked ~ div#wrapper {
  max-height: 200px;
}
#toggle:checked ~ label:after {
  content: "hide"
}
#toggle:not(checked) ~ label:after {
  content: "show"
}
      

<input type="checkbox" id="toggle">
<label for="toggle"></label>

<div id="wrapper" class="open">
  <ul id="list">
    <li>Item</li>
    <li>Item</li>
    <li>Item</li>
    <li>Item</li>
  </ul>
</div>
      

Run codeHide result





using JavaScript

You're pretty much there. Just use $.hide

and $.show

instead $.height

.

More concise method would be $.toggle

, but he does the same thing as the code below.

$(function() {
  var b = $("#button");
  var w = $("#wrapper");
  var l = $("#list");
  
  w.height(l.outerHeight(true));

  b.click(function() {
    if(w.hasClass("open")) {
      w.hide();
    } else {
      w.show()
    }
    w.toggleClass("open");
  });
});
      

#wrapper {
  background: #ccc;
  overflow: hidden;
  transition: height 200ms;
}
      

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<button id="button">Toggle Expand/Collapse</button>
<div id="wrapper" class="open">
  <ul id="list">
    <li>Item</li>
    <li>Item</li>
    <li>Item</li>
    <li>Item</li>
  </ul>
</div>
      

Run codeHide result


+1


source


you can use jquery method .toggle()

<button id="button">Toggle Expand/Collapse</button>
<div id="wrapper" class="open">
  <ul id="list">
    <li>Item</li>
    <li>Item</li>
    <li>Item</li>
    <li>Item</li>
  </ul>
</div>  


$('#button').click(function(){
    $('#wrapper').toggle();
});  

      

DEMO

updated
you can add the following.css

#wrapper {
  background: #ccc;
  display:none
}  

      

DEMO

+1


source


JQuert's toggle method will help you, if you want it to be hidden the first time, apply a style like this → style = "display: none" If you want it to be visible, do not add this style

Basically, what a toggle function is, if your component is visible, then hides it, and if hidden, it shows it ...

$('#button').click(function(){
    $('#wrapper').toggle();
})

      

below code will explain to you better http://jsfiddle.net/31zfvm2u/

+1


source


<button id="button" onclick=sample();>Toggle Expand/Collapse</button>
<div id="wrapper" class="open">
  <ul id="list">
    <li>Item</li>
    <li>Item</li>
    <li>Item</li>
    <li>Item</li>
  </ul>
</div>

function sample()
{
$(#wrapper).toogle();
}

      

0


source







All Articles