Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

jQuery animate height

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!

like image 475
Andrea Turri Avatar asked Jan 05 '11 11:01

Andrea Turri


3 Answers

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.

like image 189
Nick Craver Avatar answered Nov 17 '22 22:11

Nick Craver


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/

like image 24
Torin Finnemann Avatar answered Nov 17 '22 21:11

Torin Finnemann


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.

like image 2
Jules Avatar answered Nov 17 '22 23:11

Jules