js 获取元素在页面上的偏移量的方法汇总


Posted in Javascript onApril 13, 2015

使用js制作效果时,我们常常要获取某个元素在页面上的偏移量(例如tip提示框功能)。而获取偏移量可以直接获取相对于document的偏移量,也可以获取相对与视口的偏移量(viewpoint)加上页面滚动量(scroll)获得。

1.获取相对与document的偏移量

function getOffsetSum(ele){
  var top= 0,left=0;
  while(ele){
    top+=ele.offsetTop;
    left+=ele.offsetLeft;
    ele=ele.offsetParent;
  }
  return {
    top:top,
    left:left
  }
}

通过向上迭代offsetParent,可以计算出相对于document的偏移量,也就是相对与页面的偏移量。

此方法的问题:

1)对于使用表格和内嵌框架布局的页面,由于不同浏览器实现元素方式的差异,得到的结果就不精确了。

2)每次都需要一级一级向上查找offsetParent,效率太低。

2.获取相对与视口的偏移量(viewpoint)加上页面的滚动量(scroll)

function getOffsetRect(ele){
      var box=ele.getBoundingClientRect();
      var body=document.body,
        docElem=document.documentElement;
      //获取页面的scrollTop,scrollLeft(兼容性写法)
      var scrollTop=window.pageYOffset||docElem.scrollTop||body.scrollTop,
        scrollLeft=window.pageXOffset||docElem.scrollLeft||body.scrollLeft;
      var clientTop=docElem.clientTop||body.clientTop,
        clientLeft=docElem.clientLeft||body.clientLeft;
      var top=box.top+scrollTop-clientTop,
        left=box.left+scrollLeft-clientLeft;
      return {
        //Math.round 兼容火狐浏览器bug
        top:Math.round(top),
        left:Math.round(left)
      }
    }

此方法直接通过getBoundingClientRect()方法获得相对于视口的偏移量,加上页面的滚动量,减去clientTop,clientLeft (IE8及更低版本浏览器将(2,2)作为起点坐标,所以要将值减去起点坐标,其他浏览器都是已(0,0)作为起点坐标)。

getBoundingClientRect()方法支持IE,ff3+,safari4+,Orear9,5,Chrome.

3.兼容性写法

//获取元素相对于页面的偏移
function getOffset(ele){
  if(ele.getBoundingClientRect){
    return getOffsetRect(ele);
  }else{
    return getOffsetSum(ele);
  }
}

对于支持getBoundingClientRect()方法的浏览器使用getOffsetRect()方法,不支持的则使用getOffsetSum()方法。

以上所述就是本文的全部内容了,希望能够对大家学习javascript有是帮助。

Javascript 相关文章推荐
JS 判断代码全收集
Apr 28 Javascript
jquery实现图片滚动效果的简单实例
Nov 23 Javascript
Javascript表单特效之十大常用原理性样例代码大总结
Jul 12 Javascript
从零学习node.js之express入门(六)
Feb 25 Javascript
MUI 解决动态列表页图片懒加载再次加载不成功的bug问题
Apr 13 Javascript
浅谈Vue.js中的v-on(事件处理)
Sep 05 Javascript
AngularJS实现的简单拖拽功能示例
Jan 02 Javascript
Vue下滚动到页面底部无限加载数据的示例代码
Apr 22 Javascript
Vue render渲染时间戳转时间,时间转时间戳及渲染进度条效果
Jul 27 Javascript
vue 中url 链接左边的小图标更改问题
Dec 30 Javascript
vue根据条件不同显示不同按钮的操作
Aug 04 Javascript
微信小程序input抖动问题的修复方法
Mar 03 Javascript
javascript中scrollTop详解
Apr 13 #Javascript
jQuery实现的在线答题功能
Apr 12 #Javascript
jQuery插件bxSlider实现响应式焦点图
Apr 12 #Javascript
jQuery插件Skippr实现焦点图幻灯片特效
Apr 12 #Javascript
jQuery插件pagination实现分页特效
Apr 12 #Javascript
jQuery插件multiScroll实现全屏鼠标滚动切换页面特效
Apr 12 #Javascript
jQuery插件slicebox实现3D动画图片轮播切换特效
Apr 12 #Javascript
You might like
php购物网站支付paypal使用方法
2010/11/28 PHP
PHP+JS实现大规模数据提交的方法
2015/07/02 PHP
PHP实现的进度条效果详解
2016/05/03 PHP
Jquery 高亮显示文本中重要的关键字
2009/12/24 Javascript
关于文本框的一些限制控制总结~~
2010/04/15 Javascript
使用js判断当前时区TimeZone是否是夏令时
2014/02/23 Javascript
javascript字符串函数汇总
2015/12/06 Javascript
EasyUI在表单提交之前进行验证的实例代码
2016/06/24 Javascript
JS实现的多张图片轮流播放幻灯片效果
2016/07/22 Javascript
20分钟打造属于你的Bootstrap站点
2016/07/27 Javascript
VUE实现日历组件功能
2017/03/13 Javascript
jQuery实现文章图片弹出放大效果
2017/04/06 jQuery
JS实现评价的星星功能
2017/08/20 Javascript
vue服务端渲染的实例代码
2017/08/28 Javascript
基于Vue制作组织架构树组件
2017/12/06 Javascript
详解JavaScript的数据类型以及数据类型的转换
2019/04/20 Javascript
Vue+Koa2 打包后进行线上部署的教程详解
2019/07/31 Javascript
原生js实现随机点名
2020/07/05 Javascript
微信小程序实现电影App导航和轮播
2020/11/30 Javascript
Python实现在Linux系统下更改当前进程运行用户
2015/02/04 Python
Python中类型关系和继承关系实例详解
2015/05/25 Python
Python MD5加密实例详解
2017/08/02 Python
python构建深度神经网络(续)
2018/03/10 Python
详解python实现小波变换的一个简单例子
2019/07/18 Python
Django CBV类的用法详解
2019/07/26 Python
python实现发送QQ邮件(可加附件)
2020/12/23 Python
Pandas之缺失数据的实现
2021/01/06 Python
英国蜡烛、蜡烛配件和家居香氛购买网站:Yankee Candle
2018/12/12 全球购物
营销与策划专业毕业生求职信
2013/11/01 职场文书
污水厂厂长岗位职责
2014/01/04 职场文书
学生会竞聘书范文
2014/03/31 职场文书
幼儿园教师节演讲稿
2014/09/03 职场文书
2014财务部年度工作总结
2014/12/08 职场文书
女性健康知识讲座主持词
2015/07/04 职场文书
Python函数中apply、map、applymap的区别
2021/11/27 Python
MySQL数据库实验之 触发器和存储过程
2022/06/21 MySQL