Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

jQuery Animation - Smooth Size Transition

So this might be really simple, but I haven't been able to find any examples to learn off of yet, so please bear with me. ;)

Here's basically what I want to do:

<div>Lots of content! Lots of content! Lots of content! ...</div>  ....   $("div").html("Itsy-bitsy bit of content!"); 

I want to smoothly animate between the dimensions of the div with lots of content to the dimensions of the div with very little when the new content is injected.

Thoughts?

like image 581
neezer Avatar asked Oct 28 '08 20:10

neezer


2 Answers

Try this jQuery plugin:

// Animates the dimensional changes resulting from altering element contents // Usage examples:  //    $("#myElement").showHtml("new HTML contents"); //    $("div").showHtml("new HTML contents", 400); //    $(".className").showHtml("new HTML contents", 400,  //                    function() {/* on completion */}); (function($) {    $.fn.showHtml = function(html, speed, callback)    {       return this.each(function()       {          // The element to be modified          var el = $(this);           // Preserve the original values of width and height - they'll need           // to be modified during the animation, but can be restored once          // the animation has completed.          var finish = {width: this.style.width, height: this.style.height};           // The original width and height represented as pixel values.          // These will only be the same as `finish` if this element had its          // dimensions specified explicitly and in pixels. Of course, if that           // was done then this entire routine is pointless, as the dimensions           // won't change when the content is changed.          var cur = {width: el.width()+'px', height: el.height()+'px'};           // Modify the element's contents. Element will resize.          el.html(html);           // Capture the final dimensions of the element           // (with initial style settings still in effect)          var next = {width: el.width()+'px', height: el.height()+'px'};           el .css(cur) // restore initial dimensions             .animate(next, speed, function()  // animate to final dimensions             {                el.css(finish); // restore initial style settings                if ( $.isFunction(callback) ) callback();             });       });    };   })(jQuery); 

Commenter RonLugge points out that this can cause problems if you call it twice on the same element(s), where the first animation hasn't finished before the second begins. This is because the second animation will take the current (mid-animation) sizes as the desired "ending" values, and proceed to fix them as the final values (effectively stopping the animation in its tracks rather than animating toward the "natural" size)...

The easiest way to resolve this is to call stop() before calling showHtml(), and passing true for the second (jumpToEnd) parameter:

$(selector).showHtml("new HTML contents")            .stop(true, true)            .showHtml("even newer contents"); 

This will cause the first animation to complete immediately (if it is still running), before beginning a new one.

like image 173
Shog9 Avatar answered Nov 04 '22 23:11

Shog9


You can use the animate method.

$("div").animate({width:"200px"},400); 
like image 44
Josh Bush Avatar answered Nov 05 '22 00:11

Josh Bush