基本的jQuery slideUp和slideDown让我发疯!

我的jQuery技能通常很好,但这让我很生气!

这是一个相当简单的手风琴我从头开始编码。 使用jQuery 1.3.2所以不应该有任何跳跃错误,但基本上如果你看一下这个例子:

http://www.mizudesign.com/jquery/accordian/basic.html

我正在显示右侧目标div的高度 – 如果它包含文本,它认为它比它更短并且跳跃。 如果它是一个图像,没有问题。

我无法弄清楚我哪里出错 – 显然在CSS的某个地方,但我已经尝试了所有常见的嫌疑人,如display:block

任何想法都会感激不尽!

你的,克里斯

PS请原谅源代码的性质,我已经把我正在处理的整个项目撕掉了,所以它确实包含了一些不需要在那里的div。

您需要内容的宽度或高度才能平滑地制作动画。

我必须承认我现在已经找到了自己的动态解决方案。

http://www.mizudesign.com/jquery/accordian/basic.html应该修复。

它真的非常简单 – 只需在隐藏div之前使用.css添加高度。 有效的待遇:)

$("#PlayerButtonsContent div").each (function() { $(this).css("height", $(this).height()); }); $("#PlayerButtonsContent div").hide(); 

我认为问题是,当添加填充或边距然后它跳跃时,我就是这种情况。 你必须在回调中设置边距的动画

另外“请记住”表格使用slideDown slideUp表现错误,而是使用fadeIn fadeOut

div从回调中完成动画后获取高度。 你可能在div被动画时获得了高度,并且你获得了一个过渡值。

如果您的动画是跳跃的,请尝试使用回调。 不要打开div并同时隐藏div。 相反,隐藏你的第一个div,并在回调中显示你的下一个div。

 $(".someDiv").slideUp("normal", function(){ /* This animation won't start until the first has finished */ $(".someOtherDiv").slideDown(); }); 

更新(来自评论):

redsquare: http : //jqueryfordesigners.com/slidedown-animation-jump-revisited/

我在Safari上也遇到了令人讨厌的slideUp()跳转问题,但没有Chrome或IE。 事实certificate,我隐藏/显示的div标签位于另一个包含float:left divs的div标签的正下方。 在向上滑动期间,浮动的div将暂时重新渲染,从而导致跳跃。

修复只是添加clear:both隐藏/显示div的样式。

我的问题是,由于我有一个响应式设计,我不知道我的元素的宽度或高度是多少。 在阅读了这篇博客文章http://www.bennadel.com/blog/2263-Use-jQuery-s-SlideDown-With-Fixed-Width-Elements-To-Prevent-Jumping.htm后,我意识到jQuery正在改变立场我的元素修复和搞乱元素的布局。 我将以下内容添加到我的CSS元素中,并没有注意到IE7 +,firefox,chrome和safari中的任何不良副作用。

 display: none; overflow: hidden; position: relative !important; 

用padding-top和padding-bottom值替换margin-top和margin-bottom值对我来说是个窍门。 此后不要忘记将边距值设置为0。

这对我有用:

 $(this).pathtoslidingelementhere.width($(this).parent().width()); 

问题是由于IE(怪癖模式)试图渲染“height:0px”。

修复:将高度设置为1(不为0),然后隐藏并重置高度:

 // slideUp for all browsers $("div").animate({ height:1 },{ complete:function(){ // hide last pixel and reset height $(this).hide().css({ height:"" }); } }); 

对我来说,问题是使用幻灯片显示/隐藏div上的边距(或填充),但我需要为该div提供边距(或填充)。 我解决了这个伎俩:

  .slide-div:before{ content: " "; display: block; margin-top: 15px; }