このjQueryプラグインを試してください:
// 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);
コメント投稿者の RonLugge は、最初のアニメーションが 2 番目のアニメーションが始まる前に終了していない同じ要素で 2 回呼び出すと、問題が発生する可能性があると指摘しています。これは、2 番目のアニメーションが現在の (アニメーションの途中の) サイズを目的の「終了」値として取得し、それらを最終値として修正するためです (「自然な」サイズに向かってアニメーション化するのではなく、アニメーションをそのトラックで効果的に停止します)。 )...
これを解決する最も簡単な方法は、 を呼び出すstop()
前に を呼び出し、 2 番目の ( jumpToEnd ) パラメータshowHtml()
を渡すことです。true
$(selector).showHtml("new HTML contents")
.stop(true, true)
.showHtml("even newer contents");
これにより、新しいアニメーションを開始する前に、最初のアニメーションがすぐに完了します (まだ実行中の場合)。