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 相关文章推荐
获取URL地址中的文件名和参数的javascript代码
Sep 02 Javascript
javascript高级学习笔记整理
Aug 14 Javascript
Javascript实现div的toggle效果实例分析
Jun 09 Javascript
easyui Draggable组件实现拖动效果
Aug 19 Javascript
JavaScript中的对象和原型(一)
Aug 12 Javascript
JS实现自动阅读单词(有道单词本添加功能)
Nov 14 Javascript
JavaScript实现简单的星星评分效果
May 18 Javascript
基于vue2实现左滑删除功能
Nov 28 Javascript
Gulp实现静态网页模块化的方法详解
Jan 09 Javascript
JavaScript中七种流行的开源机器学习框架
Oct 11 Javascript
vue2.x 对象劫持的原理实现
Apr 19 Javascript
基于vue--key值的特殊用处详解
Jul 31 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 SEO优化之URL优化方法
2011/04/21 PHP
PHP线程的内存回收问题
2016/07/08 PHP
使用PHP连接多种数据库的实现代码(mysql,access,sqlserver,Oracle)
2016/12/21 PHP
Laravel 5.5 的自定义验证对象/类示例代码详解
2017/08/29 PHP
微信公众号实现扫码获取微信用户信息(网页授权)
2019/04/09 PHP
微信支付之JSAPI公众号支付详解
2019/05/15 PHP
[原创]PHP global全局变量经典应用与注意事项分析【附$GLOBALS用法对比】
2019/07/12 PHP
JS TextArea字符串长度限制代码集合
2012/10/31 Javascript
基于JavaScript实现瀑布流效果(循环渐近)
2016/01/27 Javascript
Node.js开发者必须了解的4个JS要点
2016/02/21 Javascript
Bootstrap Fileinput文件上传组件用法详解
2016/05/10 Javascript
微信小程序 使用picker封装省市区三级联动实例代码
2016/10/28 Javascript
Vue.Draggable实现拖拽效果
2020/07/29 Javascript
vue.js 底部导航栏 一级路由显示 子路由不显示的解决方法
2018/03/09 Javascript
AngularJS模态框模板ngDialog的使用详解
2018/05/11 Javascript
Vue中插入HTML代码的方法
2018/09/21 Javascript
vue中引入第三方字体文件的方法示例
2018/12/17 Javascript
JavaScript链式调用实例浅析
2018/12/19 Javascript
使用vue-cli脚手架工具搭建vue-webpack项目
2019/01/14 Javascript
Vue函数式组件的应用实例详解
2019/08/30 Javascript
js实现贪吃蛇游戏(简易版)
2020/09/29 Javascript
Python用GET方法上传文件
2015/03/10 Python
Python中内建函数的简单用法说明
2016/05/05 Python
Python简单实现自动删除目录下空文件夹的方法
2017/08/29 Python
python爬虫的数据库连接问题【推荐】
2018/06/25 Python
Django+python服务器部署与环境部署教程详解
2020/03/30 Python
英国最好的温室之家:Greenhouses Direct
2019/07/13 全球购物
Ooni英国官网:披萨烤箱
2020/05/31 全球购物
面向对象编程的优势是什么
2015/12/17 面试题
企事业单位求职者的自我评价
2013/12/28 职场文书
档案接收函范文
2014/01/10 职场文书
个人对照检查材料
2014/02/12 职场文书
人力资源部经理的岗位职责
2014/03/04 职场文书
百日安全活动总结
2014/05/04 职场文书
导游欢送词
2015/01/31 职场文书
一文搞清楚MySQL count(*)、count(1)、count(col)区别
2022/03/03 MySQL