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程序来实现动画功能
Mar 06 Javascript
从父页面读取和操作iframe中内容方法
Jul 25 Javascript
jQuery UI 应用不同Theme的办法
Sep 12 Javascript
JavaScript 原型链学习总结
Oct 29 Javascript
单击和双击事件的冲突处理示例代码
Apr 03 Javascript
举例讲解Node.js中的Writable对象
Jul 29 Javascript
微信小程序 火车票查询实例讲解
Oct 17 Javascript
浅谈jQuery中的eq()与DOM中element.[]的区别
Oct 28 Javascript
详解EasyUi控件中的Datagrid
Aug 23 Javascript
PHP实现基于Redis的MessageQueue队列封装操作示例
Feb 02 Javascript
通过GASP让vue实现动态效果实例代码详解
Nov 24 Javascript
深入了解Vue.js 混入(mixins)
Jul 23 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开发中常用的三个表单验证函数使用小结
2010/03/03 PHP
JavaScript 节点操作 以及DOMDocument属性和方法
2007/12/06 Javascript
利用谷歌地图API获取点与点的距离的js代码
2012/10/11 Javascript
jquery全选checkBox功能实现代码(取消全选功能)
2013/12/10 Javascript
JavaScript内存管理介绍
2015/03/13 Javascript
JavaScript中的对象与JSON
2015/07/03 Javascript
js小数计算小数点后显示多位小数的实现方法
2016/05/30 Javascript
javascript url几种编码方式详解
2016/06/06 Javascript
JS简单实现点击复制链接的方法
2016/08/03 Javascript
Javascript中apply、call、bind的巧妙使用
2016/08/18 Javascript
AnjularJS中$scope和$rootScope的区别小结
2016/09/18 Javascript
vue.js中toast用法及使用toast弹框的实例代码
2018/08/27 Javascript
详解vue项目打包步骤
2019/03/29 Javascript
Vue初始化中的选项合并之initInternalComponent详解
2020/06/11 Javascript
深度剖析使用python抓取网页正文的源码
2014/06/11 Python
Python中用于去除空格的三个函数的使用小结
2015/04/07 Python
用Python的Django框架来制作一个RSS阅读器
2015/07/22 Python
在 Python 应用中使用 MongoDB的方法
2017/01/05 Python
SQLite3中文编码 Python的实现
2017/01/11 Python
python 第三方库的安装及pip的使用详解
2017/05/11 Python
Python 操作文件的基本方法总结
2017/08/10 Python
学习python可以干什么
2019/02/26 Python
对Django中内置的User模型实例详解
2019/08/16 Python
django 链接多个数据库 并使用原生sql实现
2020/03/28 Python
python asyncio 协程库的使用
2021/01/21 Python
如何用 Python 制作 GitHub 消息助手
2021/02/20 Python
澳大利亚相机之家:Camera House
2017/11/30 全球购物
Charlotte Tilbury澳大利亚官网:英国美妆品牌
2018/10/05 全球购物
美国时尚假发购物网站:Wigsbuy
2019/04/06 全球购物
英国在线药房和在线医生:LloydsPharmacy
2019/10/21 全球购物
Armor Lux法国官方网站:水手服装、成衣和内衣
2020/05/26 全球购物
银行先进个人事迹材料
2014/05/11 职场文书
个人工作表现评价材料
2014/09/21 职场文书
全陪导游词开场白
2015/05/29 职场文书
《夸父追日》教学反思
2016/02/20 职场文书
Redis延迟队列和分布式延迟队列的简答实现
2021/05/13 Redis