實現滾動定位的三種方法


 

    Web頁面的定位,據我所知,有三種:一、錨點定位;二、通過js的window.scroll(x,y)或window.scrollTo(x,y);三、通過js的window.scrollBy(x,y)。

    錨點定位,缺點: 定位不准確,而且有兼容性問題。

    所以,大多數情況下用第二種或第三種方法。

 注:以下兩種方法的代碼均可以直接使用,不依賴於任何第三方庫或框架。

下面分析下第二種方法的實現原理:

    核心:window對象的兩個屬性:scrollTop, offsetTop。

看下這兩個屬性的區別:

該圖片引自:http://blog.csdn.net/fswan/article/details/17238933

scrollTop: 對象的最頂部到對象在當前窗口顯示的局限內的頂邊的間隔(對象被卷去的高度)。

document.body.scrollTop:網頁被卷去的高

offsetTop:當前對象到其上級層頂部的間隔。

/* 此段代碼是從NEJ框架的源碼中抽取出來,並經過稍加修改得到的 */

/*注: NEJ框架 是網易公司的前端基礎框架,作者:蔡劍飛,網易前端資深工程師,網易前端專家委員會主任*/


    _$offset = (function(){
        var _isRoot = function(_element){
            return _element==document.body||
                   _element==document.documentElement;
        };
        return function(_from,_to){
            _from = document.getElementById(_from);
            if (!_from){
                return null;
            }
            _to = document.getElementById (_to)||null;
            var _node = _from,
                _result = {x:0,y:0},
                _isroot,_delta,_border;

            _$getStyle = function(_element,_name){
                _element = _p._$get(_element);
                return !_element ? '' :
                    _h.__getStyleValue(
                        _element,_name
                    );
            };
            while(!!_node&&_node!=_to){
                _isroot = _isRoot(_node)||_node==_from;
                _delta = _isroot?0:_node.scrollLeft;
                _border = parseInt(_p._$getStyle(_node,'borderLeftWidth'))||0;
                _result.x += _node.offsetLeft+_border-_delta;
                _delta = _isroot?0:_node.scrollTop;
                _border = parseInt(_p._$getStyle(_node,'borderTopWidth'))||0;
                _result.y += _node.offsetTop+_border-_delta;
                _node = _node.offsetParent;
            }
            return _result;
        };
    })();

 

 

第三種方法:

代碼

/* 此段代碼是 我同學從網上找來的,如果作者看到這篇文章,請聯系我,我會把作者的博客地址 加在這里。 */


function elementPosition(obj) {
      var curleft = 0, curtop = 0;

      if (obj.offsetParent) {
          curleft = obj.offsetLeft;
          curtop = obj.offsetTop;

          while (obj = obj.offsetParent) {
              curleft += obj.offsetLeft;
              curtop += obj.offsetTop;
          }
      }

      return { x: curleft, y: curtop };
  }

  function ScrollToControl(id){
      var elem =  document.getElementById(id);
      var scrollPos = elementPosition(elem).y;
      scrollPos = scrollPos - document.documentElement.scrollTop;
      var remainder = scrollPos % 50;
      var repeatTimes = (scrollPos - remainder) / 50;
      ScrollSmoothly(scrollPos,repeatTimes);
      window.scrollBy(0,remainder);
  }

  var repeatCount = 0;
  var cTimeout;
  var timeoutIntervals = new Array();
  var timeoutIntervalSpeed;

  function ScrollSmoothly(scrollPos,repeatTimes){
      if(repeatCount < repeatTimes){
        window.scrollBy(0,50);
      }
      else{
        repeatCount = 0;
        clearTimeout(cTimeout);
      return;
      }

      repeatCount++;
      cTimeout = setTimeout("ScrollSmoothly('" + scrollPos + "','"+ repeatTimes +"')",25);
  }

 

ps: 運行 window.scroll(0,0); 即可實現返回頁首的功能。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM