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 相关文章推荐
[原创]站长必须要知道的javascript广告代码
May 30 Javascript
Javascript 类与静态类的实现(续)
Apr 02 Javascript
jquery 操作css样式、位置、尺寸方法汇总
Nov 28 Javascript
js 中文汉字转Unicode、Unicode转中文汉字、ASCII转换Unicode、Unicode转换ASCII、中文转换
Dec 06 Javascript
js实现弹窗暗层效果
Jan 16 Javascript
移动端刮刮乐的实现方式(js+HTML5)
Mar 23 Javascript
Vue.js实现实例搜索应用功能详细代码
Aug 24 Javascript
Vue与Node.js通过socket.io通信的示例代码
Jul 25 Javascript
Vue Promise的axios请求封装详解
Aug 13 Javascript
开发用到的js封装方法(20种)
Oct 12 Javascript
使用p5.js临摹动态图片
Nov 04 Javascript
基于JavaScript实现轮播图效果
Jan 02 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
使用淘宝IP库获取用户ip地理位置
2013/10/27 PHP
PHP OPP机制和模式简介(抽象类、接口和契约式编程)
2014/06/09 PHP
PHP实现文件下载断点续传详解
2014/10/15 PHP
WordPress中访客登陆实现邮件提醒的PHP脚本实例分享
2015/12/14 PHP
windows环境下使用Composer安装ThinkPHP5
2018/05/18 PHP
php ajax数据传输和响应方法
2018/08/21 PHP
取键盘键位ASCII码的网页
2007/07/30 Javascript
基于jquery的checkbox下拉框插件代码
2010/06/25 Javascript
js正则表达exec与match的区别说明
2014/01/29 Javascript
jQuery插件Slider Revolution实现响应动画滑动图片切换效果
2015/06/05 Javascript
详解JavaScript中双等号引起的隐性类型转换
2016/05/30 Javascript
Node.js Streams文件读写操作详解
2016/07/04 Javascript
Vue.js学习笔记之 helloworld
2016/08/14 Javascript
JS获取IE版本号与HTML设置IE文档模式的方法
2016/10/09 Javascript
jQuery 实现ajax传入参数含有特殊字符的方法总结
2016/10/17 Javascript
jQuery中 $ 符号的冲突问题及解决方案
2016/11/04 Javascript
使用puppeteer破解极验的滑动验证码
2018/02/24 Javascript
解决Mac下安装nmp的淘宝镜像失败问题
2018/05/16 Javascript
微信小程序实现天气预报功能
2018/07/18 Javascript
layer.open关闭父窗口 以及调用父页面的方法
2018/08/17 Javascript
js canvas实现画图、滤镜效果
2018/11/27 Javascript
Angular6 用户自定义标签开发的实现方法
2019/01/08 Javascript
vue实现codemirror代码编辑器中的SQL代码格式化功能
2019/08/27 Javascript
[02:40]DOTA2英雄基础教程 炼金术士
2013/12/23 DOTA
[00:14]护身甲盾
2019/03/06 DOTA
python中__slots__用法实例
2015/06/04 Python
一篇文章入门Python生态系统(Python新手入门指导)
2015/12/11 Python
Python实现的插入排序算法原理与用法实例分析
2017/11/22 Python
selenium+python自动化测试之环境搭建
2019/01/23 Python
Pandas之DataFrame对象的列和索引之间的转化
2019/06/25 Python
Python要求O(n)复杂度求无序列表中第K的大元素实例
2020/04/02 Python
自学python用什么系统好
2020/06/23 Python
Python pip安装第三方库实现过程解析
2020/07/09 Python
viagogo英国票务平台:演唱会、体育比赛、戏剧门票
2017/03/24 全球购物
缓刑人员的思想汇报
2014/01/11 职场文书
法律专业求职信
2014/05/24 职场文书