实现滚动定位的三种方法

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

时间: 2024-10-10 20:38:33

实现滚动定位的三种方法的相关文章

Android 记录和恢复ListView滚动的位置的三种方法

本文主要介绍记录和恢复listView滚动位置的3种方法(1)记录listView滚动到的位置的坐标(推荐)(2)记录listView显示在屏幕上的第一个item的位置(3)通知适配器数据改变. 有时在view切换时,需要恢复listView之前滚动到的位置,鉴于网上已有资料说的都是第二种方法,而第二种方法本身在精确度上较差,自己找到了第一种方法分享下. 1.记录listView滚动到的位置的坐标,然后利用listView.scrollTo精确的进行恢复 listView.setOnScroll

让一个元素垂直水平居中的三种方法

第一种方法: div.box{ weight:200px; height:400px; <!--把元素变成定位元素--> position:absolute; <!--设置元素的定位位置,距离上.左都为50%--> left:50%; top:50%; <!--设置元素的左外边距.上外边距为宽高的负1/2--> margin-left:-100px; margin-top:-200px; } *兼容性好;缺点:必须知道元素的宽高 ------------- 第二种方法:

应对加密js的三种方法

经常遇到网页在登录后会对用户输入的帐号和密码通过js进行加密,导致模拟登录这类网站时受到阻碍 这里小记一下当前解决该问题的三种方法 1.利用python实现js同等加密. 2.利用selenium模拟登录. 3.利用pyexecjs来执行js文件 测试站点:http://bbs.125.la/ 登录时通过浏览器F12发现该网站对密码进行了加密 进一步分析和查找,发现是名为md5.js?RFI文件进行了加密 尝试用第一种方法,但是发现此文件内容较多,通过python转换相应程序较为复杂,因此放弃

让一个元素垂直水平居中的三种方法【转】

第一种方法: div.box{ weight:200px; height:400px; <!--把元素变成定位元素--> position:absolute; <!--设置元素的定位位置,距离上.左都为50%--> left:50%; top:50%; <!--设置元素的左外边距.上外边距为宽高的负1/2--> margin-left:-100px; margin-top:-200px; } *兼容性好;缺点:必须知道元素的宽高 ------------- 第二种方法:

Tomcat项目部署的三种方法

第一种方法如下:直接把我们的项目文件夹放到tomcat里面,在这里我自己做的是一个测试项目oa,如图 启动tomcat,打开浏览器,输入localhost/oa  即可打开你的文件,注意 :访问的时候,如果我们没有定位到具体的页面,会自动去找一个叫做index.html的页面,如图,这里我是改了80默认的端口.所以浏览器中就直接不输入 第二种方法如下:在server.xml里面进行配置首先将之前的项目文件oa移动到随便的磁盘里,我是把它移动到了E盘中, Path这个名字就是你要在刘浏览器中进行输

MySQL数据库的备份与恢复的三种方法

MySQL数据库的备份与恢复的三种方法 1.利用mysqldump实现从逻辑角度完全备份mysql,配合二进制日志备份实现增量备份 2.利用lvs快照从物理角度实现几乎热备的完全备份,配合二进制日志备份实现增量备份 3.利用percona公司的xrabackup实现完全热备份与增量热备份 实验环境:RHEL5.8 ,SElinux关闭,MySQL是tar包初始化安装版本5.5.28 一.测试环境准备 1.1 mysql的安装就不说了,见http://laoguang.blog.51cto.com

IOS_视图实现圆角效果的三种方法及比较

通过代码,至少有三种方法可以为视图加上圆角效果.附例子:https://github.com/weipin/RoundedCorner 方法一.layer.cornerRadius 第一种方法最简单,通过层对象的cornerRadius属性实现圆角效果,代码如下: view.layer.cornerRadius = 8.0;view.layer.masksToBounds = YES; 缺点是会有2次rending passes.首先off-screen画出带圆角的图,然后在视图上画第二次. 方

WPF中三种方法得到当前屏幕的宽和高

原文:WPF中三种方法得到当前屏幕的宽和高 WPF程序中的单位是与设备无关的单位,每个单位是1/96英寸,如果电脑的DPI设置为96(每个英寸96个像素),那么此时每个WPF单位对应一个像素,不过如果电脑的DPI设备为120(每个英寸120个像素),那此时每个WPF单位对应应该是120/96=1.25个像素 一般在程序中我们常常需要得到当前屏幕的宽和高,常见做法有: 1.这两个方法可以返回当前屏幕选择的分辨率,该分辨率是以像素为单位,在DPI为96的情况下我们可以利用它们来做一些控件的定位,因为

分区自动挂载的三种方法

一.修改/etc/rc.local配置文件追加类似命令:mount /dev/sda1  /sda1 到配置文件最后一行 二,修改/etc/fstab配置文件追加类似命令:/dev/sda1   /sda1  ext4   defaults   0  0 到配置文件中 三,安装autofs服务yum install autofs 追加类似命令:sda1   -fstype=ext4  :/dev/sda1 到配置/etc/autofs.misc文件中重启服务: service autofs re