我my site有问题,或者至少我认为有问题。我使用一个非常简单的几乎递归的Javascript函数来移动两张图片。但是,在我四岁的计算机上,这并不是一个平稳的动作。我缩小了图片的尺寸,但是...
该代码不是递归的,因为我在两次调用之间使用setTimeout。
代码如下:
(负载)
sImgArray = ["imgLaVera", "imgAlmanzor", "imgRosarito", "imgBaile"];
iImg = sImgArray.length - 1;
setTimeout('playShow(0,' + iImg + ')', 4000);
function playShow(iVisible, iImgs)
{
if( iVisible < iImgs )
iLeft = iVisible + 1;
else
iLeft = 0;
imgLeft = document.getElementById(sImgArray[iLeft]);
imgLeft.style.left = "-" + imgLeft.width + "px";
playMove(-imgLeft.width, iVisible, iImgs);
}
function playMove(i, iVisible, iImgs)
{
if( iVisible < iImgs )
iLeft = iVisible + 1;
else
iLeft = 0;
imgLeft = document.getElementById(sImgArray[iLeft]);
imgRight = document.getElementById(sImgArray[iVisible]);
if( i < 0 )
{
i = i + 5;
imgLeft.style.left = (i - 2) + "px";
imgRight.style.left = (i + imgLeft.width) + "px";
setTimeout('playMove(' + i + ', ' + iVisible + ',' + iImgs + ')', 75);
}
else
{
if( iVisible < iImgs )
iVisible = iVisible + 1;
else
iVisible = 0;
setTimeout('playShow(' + iVisible + ',' + iImgs + ')', 4000)
}
}
有什么建议?
最佳答案
playMove
中的以下设置将为您提供所需的内容:
i = i + 1;
setTimeout('playMove( ... )', 15);
您的动画似乎呆滞,因为您很少更改图像位置并且跳得很大。如果希望它更平滑,则应更频繁地更改位置,但每一步中的像素要少一些。
Old: 5 px / 75 ms
New: 1 px / 15 ms
旁注
如果您真的在乎速度,请不要在每次调用渲染函数(
playMove
)时都选择元素。在调用
show
之前,在setTimeout
末尾执行以下操作:// select elements by their id and replace them in the array
for (var i = sImgArray.length; i--;) {
sImgArray[i] = document.getElementById( sImgArray[i] );
}
现在您可以简单地写
sImgArray[iLeft]
代替
document.getElementById(sImgArray[iLeft])
在playMove和playShow中。
其次,您应该避免将函数作为文本参数传递,因为它们需要分别规避。
// GOOD
setTimeout(function() {
playShow(iVisible, iImgs);
}, 4000);
// BAD
setTimeout('playShow(' + iVisible + ',' + iImgs + ')', 4000)
第三,这就像我一生中看到的最丑陋的东西:
setTimeout('show.call(\'index\');', 6000);
不要使用
this
引用将参数传递给函数。这就是普通参数列表的用途。setTimeout(function() {
show('index');
}, 4000);
然后,您的函数
show
变成这样:function show( page ) // pass string as an argument
{
if ( page == "index" )
{
// ...