为什么这张幻灯片闪烁?
我在我的博客上发布了一个示例 jQuery 幻灯片: robertmarkbramprogrammer.blogspot.com/2010/09/jquery-slideshow.html
在 Chrome 中,它在每张图片上闪烁。在 IE 和 Firefox 中看起来不错,在独立版本中看起来也不错(即使在 Chrome 上): http://robertmarkbram.appspot.com/content/javascript/jQuery/example_slideshow。 html
这是有问题的 jQuery:
<script type="text/javascript">
// ------
// ###### Edit these.
// Assumes you have images in path named 1.jpg, 2.jpg etc.
var imagePath = "images"; // Relative to this HTML file.
var lastImage = 5; // How many images do you have?
var fadeTime = 4000; // Time between image fadeouts.
// ------
// ###### Don't edit beyond this point.
var index = 1;
function slideShow() {
$('#slideShowFront').show();
$('#slideShowBack').show();
$('#slideShowFront').fadeOut("slow")
.attr("src", $("#slideShowBack").attr("src"));
index = (index == lastImage) ? 1 : index + 1;
$("#slideShowBack").attr("src", imagePath + "/" + index + ".jpg")
setTimeout('slideShow()', fadeTime);
}
$(document).ready(function() {
slideShow();
});
</script>
任何帮助将不胜感激!
抢 :)
I have posted a sample jQuery slideshow on my blog here:
robertmarkbramprogrammer.blogspot.com/2010/09/jquery-slideshow.html
In Chrome, it is flickering on each picture. In IE and Firefox it looks fine, and in the standalone version it seems ok too (even on Chrome):
http://robertmarkbram.appspot.com/content/javascript/jQuery/example_slideshow.html
This is the jQuery in question:
<script type="text/javascript">
// ------
// ###### Edit these.
// Assumes you have images in path named 1.jpg, 2.jpg etc.
var imagePath = "images"; // Relative to this HTML file.
var lastImage = 5; // How many images do you have?
var fadeTime = 4000; // Time between image fadeouts.
// ------
// ###### Don't edit beyond this point.
var index = 1;
function slideShow() {
$('#slideShowFront').show();
$('#slideShowBack').show();
$('#slideShowFront').fadeOut("slow")
.attr("src", $("#slideShowBack").attr("src"));
index = (index == lastImage) ? 1 : index + 1;
$("#slideShowBack").attr("src", imagePath + "/" + index + ".jpg")
setTimeout('slideShow()', fadeTime);
}
$(document).ready(function() {
slideShow();
});
</script>
Any assistance would be greatly appreciated!
Rob
:)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
造成闪烁的可能原因有 2 个。
第一个来自
$('#slideShowBack').show();
行。只需删除该行即可,因为它什么也不做,因为
#slideShowBack
的可见性永远不会改变。第二个是当您
.show()
正面图像覆盖背面图像。尽管现在正面图像与背面图像相同,但它可能会导致短暂的闪烁。我会稍微不同地处理这个问题。
我还将把所有变量和函数封装在一个自调用匿名函数中,这样就不会弄乱全局命名空间:
(function() { /* Everything在这里 */ })();
。代码中最重要的变化是我不会突然将一个图像
.show()
放在另一个图像之上,因此不存在可能的闪烁源。我还使用了.fadeOut()
< 中的回调函数/a>。这只是淡入淡出完成后调用的函数:HTML:
Javascript:
jsFiddle
调用下一张幻灯片函数:
而不是
index = (index == lastImage) ? 1 : index + 1;
您可以使用模运算符%
来获取除法的余数,而不是使用循环变量,您必须在slideShow( )
函数,只需传递您想要显示的照片作为参数...然后您可以使用slideShow(current+1)
调用 setTimeout 中的下一个 showImage。实际上,slideShow((index % lastImage) + 1)
。最好使用匿名函数或带有setTimeout
的引用而不是 eval。There are 2 possible causes of the flicker.
The first is from the line
$('#slideShowBack').show();
.Just remove that line, since it does nothing, since the visibility of
#slideShowBack
is never changed.The second is when you
.show()
the front image over the back image. Even though the front image is now the same as the back image, it could be causing a momentary flicker.I would approach the problem slightly differently.
I would also enclose all your variables and functions in a self calling anonymous function, so that you don't clutter the global namespace:
(function() { /* Everything in here */ })();
.The most important change in the code is that I don't suddenly
.show()
an image on top of another image, so there's no possible source of flicker. I also make use of the call back function in.fadeOut()
. This is just a function that is called after the fade is done:The HTML:
The Javascript:
jsFiddle
Calling the next slideshow function:
Instead of
index = (index == lastImage) ? 1 : index + 1;
you can use the modulus operator%
to get the remainder from a division, and instead of using a looping variable you have to set outside theslideShow()
function, just pass which photo you want to show in as an argument... Then you can call the next showImage in your setTimeout withslideShow(current+1)
. Actually,slideShow((index % lastImage) + 1)
. It's better to use an anonymous function or a reference withsetTimeout
instead of an eval.