18

I have a button and a div with inside some text:

<h2>Click me</h2>
<div class="expand">Lot of text here....</div>

I want to show just 2 rows of the text as default, so I put height to 30px and overflow Hidden.

When I click on the H2 element I want animate the text to slideDown and if i click another time it will slideUp to the default height (30px).

I'm trying many things with jQuery, but it doesn't work.

EDIT:

I also have more than one "expand" and more than one "H2" and text is different into div, so the height is not fix... I would like to slide to the "auto" height or 100%.

Can someone help me? Thanks!

Andrea Turri
  • 6,480
  • 7
  • 37
  • 63

3 Answers3

29

You can store the height just before slimming it down to 30px on page load, for example:

$(".expand").each(function() {
  $.data(this, "realHeight", $(this).height());
}).css({ overflow: "hidden", height: "30px" });

Then in your click handler:

$("h2").toggle(function() {
  var div = $(this).next(".expand")
  div.animate({ height: div.data("realHeight") }, 600);
}, function() {
  $(this).next(".expand").animate({ height: 30 }, 600);
});

So what this does is get the .height() (run this in document.ready) before the overflow: hidden it set, and stores it via $.data(), then in the click handlers (via .toggle() to alternate), we use that value (or 30) every other click to .animate() to.

Nick Craver
  • 623,446
  • 136
  • 1,297
  • 1,155
5

The scrollHeight property of the DOM element could also give you the height you need.

$(".expand").animate({
    height : $(".expand")[0].scrollHeight
},2000);

Working example can be found at http://jsfiddle.net/af3xy/4/

Torin Finnemann
  • 771
  • 9
  • 11
  • can you animate with increasing speed? like letting the drop pick up speed? – SamAko Nov 07 '15 at 13:13
  • 1
    Yes, that is defined by the "easing" (third) parameter of the animate function. jQuery has some easings build in, more as part of the ui library, or you can write your own. See more at: https://api.jquery.com/animate/#easing – Torin Finnemann Nov 08 '15 at 14:40
2

This thread is not the newest, but here's another approach.

I have been dealing with the very same issue today and could not get it to work properly. Even with the correct height calculated with height: auto applied, the animation would not give me the correct results. I tried putting it in $(window).load instead of $(document).ready, which helped a little, but still cut off my last line of text.

Instead of animating the height itself, I was able to resolve the issue by adding and removing a hidden class to my div dynamically. If you use jQuery-UI, you can apply a duration to these effects. This seems to work in all browsers, too.

Here's a working exampe.

Wilk
  • 7,873
  • 9
  • 46
  • 70
Jules
  • 25
  • 4