用jQuery方法扩展Zepto.js? scrollTop的()

时间:2012-08-30 15:45:52

标签: javascript jquery extend zepto

我在当前项目中使用Zepto.js。 Zepto不支持jQuery中的scrollTop()方法。

是否有可能将Zepto扩展为与scrollTop()一起使用?

更新:我想要的就是创建我自己的小而简单的“动画滚动”功能,就像我以前用过jQuery一样。请参阅工作示例here。但是,如果没有Zepto.js中提供的scrollTop()函数,我不知道如何使相同的函数工作。

6 个答案:

答案 0 :(得分:6)

scrollTop无法使用Zepto的.animate方法制作动画,因为它使用CSS过渡。

尝试这样的事情:http://jsfiddle.net/DVDLM/5/

function scroll(scrollTo, time) {
    var scrollFrom = parseInt(document.body.scrollTop),
        i = 0,
        runEvery = 5; // run every 5ms

    scrollTo = parseInt(scrollTo);
    time /= runEvery;

    var interval = setInterval(function () {
        i++;

        document.body.scrollTop = (scrollTo - scrollFrom) / time * i + scrollFrom;

        if (i >= time) {
            clearInterval(interval);
        }
    }, runEvery);
}

$('#trigger').click(function () {
    scroll('600px', 500);
});

编辑:我添加了一个runEvery变量,它指定了应该运行间隔的频率。这个越低,动画就越平滑,但它可能会影响性能。

编辑2:我想我误解了这个问题。以下是新问题的答案:

$.zepto.scrollTop = function (pixels) {
    this[0].scrollTop = pixels;
};

答案 1 :(得分:4)

不想钢铁没人工作所以这里是简短的答案 Porting from jQuery to Zepto

答案 2 :(得分:1)

使用DOM本机scrollTop属性:

$('#el')[0] .scrollTop = 0;

答案 3 :(得分:1)

(function ($) {

    ['width', 'height'].forEach(function(dimension) {
        var offset, Dimension = dimension.replace(/./, function(m) { return m[0].toUpperCase() });
        $.fn['outer' + Dimension] = function(margin) {
            var elem = this;
            if (elem) {
                var size = elem[dimension]();
                var sides = {'width': ['left', 'right'], 'height': ['top', 'bottom']};
                sides[dimension].forEach(function(side) {
                    if (margin) size += parseInt(elem.css('margin-' + side), 10);
                });
                return size;
            }
            else {
                return null;
            }
        };
    });

    ["Left", "Top"].forEach(function(name, i) {
        var method = "scroll" + name;

        function isWindow( obj ) {
            return obj && typeof obj === "object" && "setInterval" in obj;
        }

        function getWindow( elem ) {
            return isWindow( elem ) ? elem : elem.nodeType === 9 ? elem.defaultView || elem.parentWindow : false;
        }

        $.fn[method] = function( val ) {
            var elem, win;
            if (val === undefined) {
                elem = this[0];
                if (!elem) {
                    return null;
                }
                win = getWindow(elem);
                // Return the scroll offset
                return win ? ("pageXOffset" in win) ? win[i ? "pageYOffset" : "pageXOffset"] :
                    win.document.documentElement[method] ||
                    win.document.body[method] :
                    elem[method];
            }

            // Set the scroll offset
            this.each(function() {
                win = getWindow(this);
                if (win) {
                    var xCoord = !i ? val : $(win).scrollLeft();
                    var yCoord = i ? val : $(win).scrollTop();
                    win.scrollTo(xCoord, yCoord);
                }
                else {
                    this[method] = val;
                }
            });
        }
    });

})(Zepto);

答案 4 :(得分:0)

答案很简单,Zepto不使用超时样式动画,它使用css3,所以这里是滚动函数的基本实现:

HTML:                           动画滚动              你好              

CSS:     #page {height:5000px;位置:相对; }     #element {position:absolute;顶部:600px}

JS:

function scroll(selector, animate, viewOffset) {
    $('body').scrollToBottom (600, '800');
}

$('#trigger').click(function(e) {
   e.preventDefault();
   scroll( $('#element'), true, 30 );
});
$.fn.scrollToBottom = function(scrollHeight ,duration) {
    var $el = this;
    var el  = $el[0];
    var startPosition = el.scrollTop;
    var delta = scrollHeight  - startPosition;

    var startTime = Date.now();

    function scroll() {
        var fraction = Math.min(1, (Date.now() - startTime) / duration);

        el.scrollTop = delta * fraction + startPosition;

        if(fraction < 1) {
            setTimeout(scroll, 10);
        }
    }
    scroll();
};
​

答案 5 :(得分:0)

请注意,Zeptos 1.0版现在支持scrollTop()。见文档: http://zeptojs.com/#scrollTop