所以这可能非常简单,但我还没有找到任何可以学习的例子,所以请耐心等待。 ;)
这基本上就是我想做的事情:
<div>Lots of content! Lots of content! Lots of content! ...</div>
....
$("div").html("Itsy-bitsy bit of content!");
我希望在div的维度之间平滑地制作动画,其中包含大量内容到div的维度,并且在注入新内容时很少。
思想?
答案 0 :(得分:47)
试试这个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指出,如果你在同一个元素上调用它两次会导致问题,第一个动画在第二个动画开始之前还没有完成。这是因为第二个动画将当前(动画中期)大小作为所需的“结束”值,并继续将它们固定为最终值(有效地停止动画的轨道而不是动画为“自然”大小)...
解决此问题的最简单方法是在调用showHtml()
之前调用stop()
,并为第二个( jumpToEnd )参数传递true
:
$(selector).showHtml("new HTML contents")
.stop(true, true)
.showHtml("even newer contents");
这将导致第一个动画立即完成(如果它仍在运行),然后再开始新动画。
答案 1 :(得分:42)
您可以使用animate method。
$("div").animate({width:"200px"},400);
答案 2 :(得分:6)
也许是这样的?
$(".testLink").click(function(event) {
event.preventDefault();
$(".testDiv").hide(400,function(event) {
$(this).html("Itsy-bitsy bit of content!").show(400);
});
});
接近我想你想要的,也可以尝试使用slideIn / slideOut或者查看UI / Effects插件。
答案 3 :(得分:6)
以下是我如何解决这个问题,希望这会有用! 动画100%流畅:)
HTML:
<div id="div-1"><div id="div-2">Some content here</div></div>
使用Javascript:
// cache selectors for better performance
var container = $('#div-1'),
wrapper = $('#div-2');
// temporarily fix the outer div's width
container.css({width: wrapper.width()});
// fade opacity of inner div - use opacity because we cannot get the width or height of an element with display set to none
wrapper.fadeTo('slow', 0, function(){
// change the div content
container.html("<div id=\"2\" style=\"display: none;\">new content (with a new width)</div>");
// give the outer div the same width as the inner div with a smooth animation
container.animate({width: wrapper.width()}, function(){
// show the inner div
wrapper.fadeTo('slow', 1);
});
});
我的代码可能有一个较短的版本,但我保持这样。
答案 4 :(得分:1)
这对我有用。您还可以为临时div添加宽度。
$('div#to-transition').wrap( '<div id="tmp"></div>' );
$('div#tmp').css( { height: $('div#to-transition').outerHeight() + 'px' } );
$('div#to-transition').fadeOut('fast', function() {
$(this).html(new_html);
$('div#tmp').animate( { height: $(this).outerHeight() + 'px' }, 'fast' );
$(this).fadeIn('fast', function() {
$(this).unwrap();
});
});
答案 5 :(得分:0)
你好meyahoocoma4c5ki0pprxr19sxhajsogo6jgks5dt。
您可以使用设置为绝对宽度值的“外部div”包装“content div”。使用“hide()”或“animate({width})”方法注入新内容,如其他答案所示。这样,页面之间不会重排,因为包装div保持稳定的宽度。
答案 6 :(得分:0)
您可以使用dequeue
平滑jQuery动画。在开始新动画之前测试是否存在类(在悬停时设置并在mouseOut动画回调中删除)。当新动画开始时,出列队列。
var space = ($(window).width() - 100);
$('.column').width(space/4);
$(".column").click(function(){
if (!$(this).hasClass('animated')) {
$('.column').not($(this).parent()).dequeue().stop().animate({width: 'toggle', opacity: '0.75'}, 1750,'linear', function () {});
}
$(this).addClass('animated');
$('.column').not($(this).parent()).dequeue().stop().animate({width: 'toggle', opacity: '0.75'}, 1750,'linear', function () {
$(this).removeClass('animated').dequeue();
});
$(this).dequeue().stop().animate({
width:(space/4)
}, 1400,'linear',function(){
$(this).html('AGAIN');
});
});
该演示设置为5个全高列,单击2到5中的任何一列将为其他3列设置切换宽度的动画,并将单击的元素移动到最左侧。
答案 7 :(得分:0)
捎带jquery插件解决方案(声誉太低,无法将其添加为注释)jQuery.html()将删除附加html上的任何事件处理程序。改变:
// Modify the element's contents. Element will resize.
el.html(html);
到
// Modify the element's contents. Element will resize.
el.append(html);
将保留“html”元素的事件处理程序