【问题标题】:Extend Zepto.js with a jQuery method? scrollTop()使用 jQuery 方法扩展 Zepto.js?滚动顶部()
【发布时间】:2012-08-25 09:46:28
【问题描述】:

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

是否有可能扩展 Zepto 以与 scrollTop() 一起工作?

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

【问题讨论】:

    标签: javascript jquery extend zepto


    【解决方案1】:

    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 变量,它指定应该多久运行一次间隔。此值越低,动画越流畅,但可能会影响性能。

    EDIT2:我想我误读了这个问题。以下是新问题的答案:

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

    【讨论】:

      【解决方案2】:

      不想让任何人工作,所以这里是简短的答案 Porting from jQuery to Zepto

      【讨论】:

      【解决方案3】:

      使用 DOM 原生的 scrollTop 属性:

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

      【讨论】:

      • 嗯,谢谢。但是我不知道该怎么做。看看这个……jsfiddle.net/DVDLM……这是我自己构建的一个 jQuery 函数。然而,在我目前的项目中,我使用的是 Zepto 而不是 jQuery。请参阅此jsfiddle.net/DVDLM/1,我仅将框架更改为 Zepto。知道如何使该功能与 Zepto 一起使用吗?
      • 你的意思是可以使用 window.scrollTo(xpos, ypos) ...但它不会动画:( ...
      【解决方案4】:
      (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);
      

      【讨论】:

        【解决方案5】:

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

        HTML: 动画卷轴 你好你 ​

        CSS: #page { 高度:5000px;位置:相对; } #element { 位置:绝对;顶部:600 像素 }

        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();
        };
        ​
        

        【讨论】:

          【解决方案6】:

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

          【讨论】:

          • scrollTo() != scrollTop().
          • @mrgnou 是的,你的权利。我的意思是说“scrollTop()”。我正确链接到正确的函数,但在评论中遗漏了一个“p”。
          猜你喜欢
          • 2013-05-04
          • 1970-01-01
          • 2012-06-03
          • 2012-08-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-02-13
          • 2017-11-29
          相关资源
          最近更新 更多