我有一个关于背景图片滚动不断自我重复的问题。
我遇到的问题是开始速度很快,但是很快变得越来越慢(口吃等)。这是代码:

var panoramaTimeOutId = null;
var panoramaPosition = null;
$('.panorama-left').mousedown(function() {
    panoramaTimeOutId = setInterval(function(){
        panoramaMove(8, 1)
    }, 50);
}).bind('mouseup mouseleave', function() {
       clearInterval(panoramaTimeOutId);
});
$('.panorama-right').mousedown(function() {
    panoramaTimeOutId = setInterval(function(){
        panoramaMove(8, 2)
    }, 50);
}).bind('mouseup mouseleave', function() {
        clearInterval(panoramaTimeOutId);
});
function panoramaMove(amount, direction)
{
    var panorama = document.getElementsByClassName('panorama_foto')[0];
    if(panoramaPosition == null)
    {
        panoramaPosition = panorama.style.backgroundPosition;
        panoramaPosition = parseInt(panoramaPosition[0].replace("px",""));
    }
    if(direction == 1)
    {
        panoramaPosition = panoramaPosition + amount;
        panorama.style.backgroundPosition = panoramaPosition+"px";
    }
    else
    {
        panoramaPosition = panoramaPosition - amount;
        panorama.style.backgroundPosition = panoramaPosition+"px";
    }
}

而且我已经尝试了一些优化的方法。就像使用标准javascript编写函数一样。仅通过仅包含一个简单int的变量对其进行递增计数之前,仅计算一次全景全景位置。然而它仍然结结巴巴。

我还尝试更改了间隔时间和px的数量,但是在某些计算机上仍会结结巴巴。例如,该网站是专为平板电脑上的平板电脑而设计的,它在我不对其进行编程的PC上口吃。并且必须在平板电脑上正常工作。

这是一个JSbin示例:
http://jsbin.com/upociv/1/edit

希望有人可以提供有关如何优化此技巧的提示,或者是我将如何改进它的一般建议。

快速说明:所有银河系平板电脑都必须由Ipad(1/2/3)和8+ firefox chrome等支持。

最佳答案

而不是通过不断增加的像素数来移动PanoramaPosition,请尝试通过panoramaPosition % (image width)来移动它。

这样,您就不会让浏览器尝试从左向左10,000像素处不可见地平铺背景图像-而是,它再也不必平铺两次以上。 (您还将避免整数溢出错误的可能性很小,但非零)。

if(direction == 1)
{
    panoramaPosition = panoramaPosition + amount;
    panorama.style.backgroundPosition = (panoramaPosition%1277)+"px";
}
else
{
    panoramaPosition = panoramaPosition - amount;
    panorama.style.backgroundPosition = (panoramaPosition%1277)+"px";
}

http://jsbin.com/upociv/2/edit

但是,如果可以在CSS3中实现此功能,则应该-Modernizr可让您在JavaScript中检测浏览器是否支持CSS3转换和转换。

09-29 20:11