JQuery.animate()在某些浏览器上以不同的速度移动div
我最近开始使用JQuery,并创建了一个小滑块来显示网站赞助商的徽标等。我使用Firefox时,它似乎工作正常。我决定用Chrome加载这个网站,它的行为相当奇怪。直到第一个div(滑块被分割为两个div,以便第一个可以在完成通过遮罩div后移动到末尾)进入第二个(以及每个并发)过程的屏幕之前,动画看起来很好。第一个分区似乎移动得更快,超过了第二个分区。你知道这是什么原因吗?这似乎只发生在Chrome和Safari中。他甚至还工作JQuery.animate()在某些浏览器上以不同的速度移动div,jquery,google-chrome,jquery-animate,Jquery,Google Chrome,Jquery Animate,我最近开始使用JQuery,并创建了一个小滑块来显示网站赞助商的徽标等。我使用Firefox时,它似乎工作正常。我决定用Chrome加载这个网站,它的行为相当奇怪。直到第一个div(滑块被分割为两个div,以便第一个可以在完成通过遮罩div后移动到末尾)进入第二个(以及每个并发)过程的屏幕之前,动画看起来很好。第一个分区似乎移动得更快,超过了第二个分区。你知道这是什么原因吗?这似乎只发生在Chrome和Safari中。他甚至还工作 $(document).ready(function () {
$(document).ready(function () {
var s1 = $("div[name=s1]");
var s2 = $("div[name=s2]");
var release = 0;
var speed = 75; //px per sec
var interval = 100; //milliseconds per animation
var origSpeed = speed;
function slide() {
release = 1 - release;
if (release == 0) {
return;
}
distance = "+=" + (parseInt(s1.width(), 10) + parseInt(s2.width(), 10)) + "px";
if ((-1 * parseInt(s1.css("left"), 10)) > parseInt(s1.width(), 10)) {
s1.css({left: distance});
}
if ((-1 * parseInt(s2.css("left"), 10)) > (parseInt(s1.width(), 10) + parseInt(s2.width(), 10))) {
s2.css({left: distance});
}
slide_again();
}
function slide_again() {
$("div[id=slider]").animate({left: "-=" + interval * (speed / 1000) + "px"}, interval, "linear", slide);
}
$("div[id=slider]").hover(function() {
speed = 0;
}, function() {
speed = origSpeed;
});
slide();
});
您可以在动作中看到它动画取决于定时中断。无法保证精确计时,因此根据具体实现,两个滑块的计时可能会出现偏差 如果只使用一个滑块元素,则不会遇到该问题。它还大大简化了代码。方法是复制滑块元素(使用jQuery),然后设置一半宽度(预复制宽度)的动画,然后重新开始:
$(window).load(function() {
var speed = 75; //px per sec
// Get the width of the slider before you duplicate it
var width = $('#slider').outerWidth();
// Repeat the inner content by cloning and appending it to the end
$('#slider').append($('#slider').children().clone());
function slide() {
// The duration takes into account the current position
// in case you are starting from a hover-pause
var curleft = $('#slider').position().left;
var duration = (width+curleft) * 1000 / speed;
$("#slider").animate({
// Animate until original width slides off to left
left: "-" + width + "px"
}, duration, "linear", function() {
// Reset to original position and start over
$(this).css("left", "0px");
slide();
});
}
$("#slider").hover(function() {
$('#slider').stop();
}, function() {
slide();
});
slide();
});
您还可以将鼠标悬停改为只执行.stop()
和slide()
操作,只要您在slide()
调用中做一些额外的数学运算,就可以查看您当前的位置
演示:动画取决于定时中断。无法保证精确计时,因此根据具体实现,两个滑块的计时可能会出现偏差 如果只使用一个滑块元素,则不会遇到该问题。它还大大简化了代码。方法是复制滑块元素(使用jQuery),然后设置一半宽度(预复制宽度)的动画,然后重新开始:
$(window).load(function() {
var speed = 75; //px per sec
// Get the width of the slider before you duplicate it
var width = $('#slider').outerWidth();
// Repeat the inner content by cloning and appending it to the end
$('#slider').append($('#slider').children().clone());
function slide() {
// The duration takes into account the current position
// in case you are starting from a hover-pause
var curleft = $('#slider').position().left;
var duration = (width+curleft) * 1000 / speed;
$("#slider").animate({
// Animate until original width slides off to left
left: "-" + width + "px"
}, duration, "linear", function() {
// Reset to original position and start over
$(this).css("left", "0px");
slide();
});
}
$("#slider").hover(function() {
$('#slider').stop();
}, function() {
slide();
});
slide();
});
您还可以将鼠标悬停改为只执行.stop()
和slide()
操作,只要您在slide()
调用中做一些额外的数学运算,就可以查看您当前的位置
演示:您不应该让两个元素具有相同的
id
。这不是有效的标记。感谢提供信息。我将它改为class而不是id。不幸的是,性能没有变化。您不应该有两个元素具有相同的id
。这不是有效的标记。感谢提供信息。我把它改为class而不是id。不幸的是,性能没有变化。谢谢杰夫,这就是我要找的!不幸的是,现在我遇到了一个Chrome计算outerWidth()错误的问题。似乎是在胡闹。我读到Chrome中有一个bug,当获取外径时,加载css和javascript的顺序很重要。尝试先加载CSS,然后再加载脚本。如果宽度变化不大,可以将其硬编码作为临时解决方案。我想是2164。谢谢你的帮助。宽度仅在添加/删除图像时更改。或者如果高度改变了。Chrome似乎只是在计算“#slider”的第一个子项的宽度,而不是整个div的宽度。换个角度看。chrome似乎不会计算图像的宽度。我尝试分别添加图像的宽度,得到了200像素和10个图像。每个图像都有20px的边距,因此Chrome仅使用外径(true)计算边距。如果不是直接设置,Chrome可能无法计算图像的宽度吗?你更新了html吗?因为我正在查看您的示例页面,您更新了javascript,但您的html仍然是一样的。您需要将两个slider
div合并为一个div,并将其更改回id=“slider”
。另外,您的脚本仍然是$('div[id=slider]')
,而它应该是$('.\slider')
。谢谢杰夫,这就是我要找的!不幸的是,现在我遇到了一个Chrome计算outerWidth()错误的问题。似乎是在胡闹。我读到Chrome中有一个bug,当获取外径时,加载css和javascript的顺序很重要。尝试先加载CSS,然后再加载脚本。如果宽度变化不大,可以将其硬编码作为临时解决方案。我想是2164。谢谢你的帮助。宽度仅在添加/删除图像时更改。或者如果高度改变了。Chrome似乎只是在计算“#slider”的第一个子项的宽度,而不是整个div的宽度。换个角度看。chrome似乎不会计算图像的宽度。我尝试分别添加图像的宽度,得到了200像素和10个图像。每个图像都有20px的边距,因此Chrome仅使用外径(true)计算边距。如果不是直接设置,Chrome可能无法计算图像的宽度吗?你更新了html吗?因为我正在查看您的示例页面,您更新了javascript,但您的html仍然是一样的。您需要将两个slider
div合并为一个div,并将其更改回id=“slider”
。此外,您的脚本仍然显示$('div[id=slider]')
,而它应该显示$('#slider')
。