在safari ios中视差滚动跳跃

时间:2014-08-16 00:14:49

标签: javascript jquery ios safari parallax

我正在开发视差功能,除了safari之外,它在所有浏览器上都能正常工作。

我一直关注this article,看看我做错了什么,我认为我写错了javascript,因为我直接绑定到滚动事件。

这可能是一个愚蠢的问题,但我应该如何开始我的视差滚动事件而不绑定滚动事件。我希望当用户滚动时,图像以不同的速度以不同的速度移动。

我的JS

function onScroll() {

    window.requestAnimationFrame(parallax);
    function parallax(){
        var prlx_effect_1= +(window.pageYOffset *.55).toFixed(2); // .55 for slow | .7 good for fast
        var prlx_str_1 = "translate3d(0, "+prlx_effect_1+"px, 0)";
        jQ('.prlx-1').css({
            "transform":prlx_str_1,
            "-ms-transform":prlx_str_1,
            "-webkit-transform":prlx_str_1
        });

        var prlx_effect_2= -(window.pageYOffset *.25 ).toFixed(2); // .2 for slow | .4 good for fast
        var prlx_str_2 = "translate3d(0, "+prlx_effect_2+"px, 0)";
        jQ('.prlx-2').css({
            "transform":prlx_str_2,
            "-ms-transform":prlx_str_2,
            "-webkit-transform":prlx_str_2
        });
        window.requestAnimationFrame(parallax);
    }
}

window.addEventListener("scroll", onScroll, false); 

有什么建议吗?或者其他什么东西可能导致视差在徒步旅行中跳跃?

1 个答案:

答案 0 :(得分:2)

首先,从Underscore中添加此去抖功能

// debounce is taken from _underscore.js
function debounce(func, wait, immediate) {
    var timeout, args, context, timestamp, result;
    return function() {
        context = this;
        args = arguments;
        timestamp = new Date();
        var later = function() {
            var last = (new Date()) - timestamp;
            if (last < wait) {
                timeout = setTimeout(later, wait - last);
            } else {
                timeout = null;
                if (!immediate) result = func.apply(context, args);
            }
        };
        var callNow = immediate && !timeout;
        if (!timeout) {
            timeout = setTimeout(later, wait);
        }
        if (callNow) result = func.apply(context, args);
        return result;
    };
}

当用户开始滚动时启动requestAnimationFrame循环,并在使用标志的最后一个滚动事件后100毫秒将其终止。

var requesting = false;

var killRequesting = debounce(function () {
    requesting = false;
}, 100);

function onScroll() {
    if (!requesting) {
        requesting = true;
        requestAnimationFrame(parallax);
    }
    killRequesting();
}

现在在您的视差功能中,再次调用之前检查标志。

function parallax() {
    // your parallax code
    if (requesting) {
        requestAnimationFrame(parallax);
    }
}

其次,你应该总是缓存你的jQuery选择器。

var $prlx1 = jQ('.prlx-1');
var $prlx2 = jQ('.prlx-2');
function parallax(){
    var prlx_effect_1= +(window.pageYOffset *.55).toFixed(2); // .55 for slow | .7 good for fast
    var prlx_str_1 = "translate3d(0, "+prlx_effect_1+"px, 0)";
    $prlx1.css({
        "transform":prlx_str_1,
        "-ms-transform":prlx_str_1,
        "-webkit-transform":prlx_str_1
    });

    var prlx_effect_2= -(window.pageYOffset *.25 ).toFixed(2); // .2 for slow | .4 good for fast
    var prlx_str_2 = "translate3d(0, "+prlx_effect_2+"px, 0)";
    $prlx2.css({
        "transform":prlx_str_2,
        "-ms-transform":prlx_str_2,
        "-webkit-transform":prlx_str_2
    });
    if (requesting) {
        window.requestAnimationFrame(parallax);
    }
}