Javascript jQuery幻灯片有点神经质
我尝试使用jQuery的toggle函数滑入和滑出一个DIV,但结果总是在动画的开始和/或结束时跳跃。以下是我使用的js代码:Javascript jQuery幻灯片有点神经质,javascript,jquery,Javascript,Jquery,我尝试使用jQuery的toggle函数滑入和滑出一个DIV,但结果总是在动画的开始和/或结束时跳跃。以下是我使用的js代码: $(document).ready(function(){ $('#link1').click( function() { $('#note_1').parent().slideToggle(5000); } ); 以及HTML: <div class="notice"> <p&
$(document).ready(function(){
$('#link1').click(
function() {
$('#note_1').parent().slideToggle(5000);
}
);
以及HTML:
<div class="notice">
<p>Here's some text. And more text. <span id="link1">Test1</span></p>
<div class="wrapper">
<div id="note_1">
<p>Some content</p>
<p>More blalba</p>
</div>
</div>
</div>
但这也不起作用,因为jQuery总是在动画结束时将溢出设置为可见。因此,DIV在动画结束时重新显示,但覆盖在其余内容上
我还尝试了UI.Slide(以及比例和大小)。它可以工作,但DIV下面的内容不会随动画移动。它仅在动画的结束/开始处跳跃以填充间隙。我不想那样
更新:
解决方案的一部分是在任何操作之前动态设置容器DIV的高度。这解决了一个跳跃问题。但这并不是边际崩溃的唯一原因。代码如下:
var parent_div = $("#note_1").parent();
parent_div.css("height", parent_div.height()+"px");
parent_div.hide();
第二次更新:
您可以在此页面上看到jQuery自己的站点上的bug(示例B):
第三次更新:
使用jQuery 1.4进行了尝试,没有更多机会:-(尝试从所有元素中删除所有CSS边距。通常,动画框架不考虑边距会产生不稳定的动画。您可以使用animate方法编写自定义动画。这将使您能够绝对控制所有细节。如果没有doctype,您可以尝试添加doctype在我发现这个建议后,他在IE8上为我辩护:。他建议了一个严格的DTD,但我只是使用了google.com使用的doctype:
,它解决了我的问题。你只需修改effects.js中的向上和向下效果,让它们考虑可能存在的边距或填充,然后调整它们认为是t的内容元素的总大小,以适应这些值…沿这些线的某个值
Effect.BlindDown = function(element) {
element = $(element);
var elementDimensions = element.getDimensions();
//below*
var paddingtop = parseInt(element.getStyle('padding-top'));
var paddingbottom = parseInt(element.getStyle('padding-bottom'));
var totalPadding = paddingtop + paddingbottom;
if(totalPadding > 0)
{
elementDimensions.height = (elementDimensions.height - totalPadding);
}
//above*
return new Effect.Scale(element, 100, Object.extend({
scaleContent: false,
scaleX: false,
scaleFrom: 0,
scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
restoreAfterFinish: true,
afterSetup: function(effect) {
effect.element.makeClipping().setStyle({height: '0px'}).show();
},
afterFinishInternal: function(effect) {
effect.element.undoClipping();
}
}, arguments[1] || { }));
};
解决方案是滑动div必须以像素为单位设置宽度。不要使用“auto”或“%”。这样会有很好的结果!问题在于滑动div中的内联元素
但是,如果它们在px中有宽度,那么高度将是相同的。试试看。我注意到,如果在容器
之后有一个
,动画也会不稳定。删除此项解决了我的问题。我花了几天时间才找到解决方案。问题是当元素被隐藏时,jquery得到了t他选择了错误的高度。top fix它你必须在隐藏之前获得该高度,并使用自定义动画达到该高度。这很棘手。我的导航标签中的div也存在“jerkynes”问题-我的目标是在div悬停时显示无序列表(如果存在)。我的列表是动态创建的,因此它们没有固定值
解决办法如下:
$("nav div").hover(
function() { // i.e. onmouseover function
/****simple lines to fix a % based height to a px based height****/
var h = jQuery(this).find("ul").height(); //find the height
jQuery(this).find("ul").css("height", h);
//set the css height value to this fixed value
/*****************************************************************/
jQuery(this).find("ul").slideDown("500");
},
function(){ // i.e. onmouseout function
jQuery(this).find("ul").slideUp("500");
});
});
我发现始终有效的方法是设置一个不可见的1px边框:
边框:1px实心透明;
无需固定宽度、高度或其他任何内容,动画不会跳转。万岁!尝试将容器的“位置”属性(在本例中为.notice div)设置为“相对” 为我工作。
来源:在我的例子中,我通过添加
style=“空白:nowrap;”解决了这个问题
添加到元素以防止jQuery函数计算错误;除非需要换行,否则无需设置固定宽度。确保没有在全局或容器或任何包含的元素上设置CSS转换规则。这也会导致抖动。我今天遇到了这个问题。但是我注意到禁用所有CSS解决了这个问题。我也知道它以前工作得很好,所以一定是最近的变化导致了这个问题
事实证明,我使用CSS中的转换来轻松地进出悬停
一旦从元素中删除了这些转换,我添加的所有内容都很好
因此,如果存在相同的问题,只需将以下行添加到要添加的元素中:
-webkit-transition: none;
-moz-transition: none;
-o-transition: none;
-ms-transition: none;
transition: none;
(我可能有点滥用转换,不仅仅是将它们添加到我想要转换的元素中,而是将它们用于整个网站。)今天遇到了这个问题,看到了这个问题,并开始根据我在这里看到的内容进行修补。我通过从包含div的CSS中删除position:relative解决了我们的棘手问题。之后就不再奇怪了。我的2美分。我发现animate()是在jQuery中制作任何动画最可靠的方法(至少是跨浏览器) 这将动态地将内容包装到一个div中,然后使用该div包装的内部内容的高度来设置该div包装高度的动画
$('a')。单击(函数(事件){
event.preventDefault();
xToggleHeight($(this.next());
});
//对于每个可折叠元素。
$('.collapsable')。每个(函数(){
//环绕一个div并设置为隐藏。
$(此).wrap(“”);
});
函数xToggleHeight(el){
//获取内容的高度,包括任何边距。
var contentHeight=el.children('.collapsable').outerHeight(true);
//如果元素当前已展开。
如果(el.hasClass(“扩展”)){
//崩溃
el.removeClass(“扩展”)
.stop().animate({height:0},5000,
函数(){
//完全崩溃
//设置为“隐藏”,使内容不可见。
$(this.css({'overflow':'hidden','visibility':'hidden');
}
);
}否则{
//扩展
el.addClass(“扩展”).css({'overflow':''visibility':'visibility'})
.stop().animate({height:contentHeight},5000,
函数(){
//关于扩展完备
//将“高度”设置为“自动”,以防随后调整浏览器/内容的大小。
$(this.css('height','');
}
-webkit-transition: none;
-moz-transition: none;
-o-transition: none;
-ms-transition: none;
transition: none;
$('a').click(function(event) {
event.preventDefault();
xToggleHeight($(this).next());
});
//For each collapsible element.
$('.collapsible').each(function() {
//Wrap a div around and set to hidden.
$(this).wrap('<div style="height:0;overflow:hidden;visibility:hidden;"/>');
});
function xToggleHeight(el){
//Get the height of the content including any margins.
var contentHeight = el.children('.collapsible').outerHeight(true);
//If the element is currently expanded.
if(el.hasClass("expanded")){
//Collapse
el.removeClass("expanded")
.stop().animate({height:0},5000,
function(){
//on collapse complete
//Set to hidden so content is invisible.
$(this).css({'overflow':'hidden', 'visibility':'hidden'});
}
);
}else{
//Expand
el.addClass("expanded").css({'overflow':'', 'visibility':'visible'})
.stop().animate({height: contentHeight},5000,
function(){
//on expanded complete
//Set height to auto incase browser/content is resized afterwards.
$(this).css('height','');
}
);
}
}
$('#content').hide().delay(500).slideDown(500);
<div>
<p>Text</p>
</div>
<div class="hidden">
<p></p>
</div>
<ul id="foo">
<li>
<h2>Click Me 1</h2>
<div class="bar">Content To Toggle Here 1</div>
</li>
<li>
<h2>Click Me 2</h2>
<div class="bar">Content To Toggle Here 2</div>
</li>
</ul>
#foo>li>div.bar {transition: all 0.5s;
overflow: hidden;}
$('#foo h2').each(function(){
var bar = $(this).siblings('.bar');
bar.attr('data-height', bar.height()); //figure out the height first
bar.css('max-height', '0px'); //then close vertically
});
$('#foo h2').click(function(){
var bar = $(this).siblings('.bar');
if ( bar .css('max-height') == '0px' ){ //if closed (then open)
bar.css('max-height', bar.data('height') + 'px');
} else { //must be open (so close)
bar.css('max-height', '0px');
}
});
<div class="notice">
<p>Here's some text. And more text. <span id="link1">Test1</span></p>
<div class="wrapper" style="padding: 0">
<div id="note_1" style="padding: 20px">
<p>Some content</p>
<p>More blalba</p>
</div>
</div>
</div>
* {
transition: all .3s;
}