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字符串拼接的效率问题
Dec 25 Javascript
常见JS效果之图片减速度滚动实现代码
Dec 08 Javascript
JS实现多物体缓冲运动实例代码
Nov 29 Javascript
JS应用正则表达式转换大小写示例
Sep 18 Javascript
jQuery实现简单的日期输入格式化控件
Mar 12 Javascript
Js 获取当前函数参数对象的实现代码
Jun 20 Javascript
angular实现form验证实例代码
Jan 17 Javascript
JavaScript初学者必看“new”
Jun 12 Javascript
JavaScript实现打印星型金字塔功能实例分析
Sep 27 Javascript
解决vue js IOS H5focus无法自动弹出键盘的问题
Aug 30 Javascript
vue canvas绘制矩形并解决由clearRec带来的闪屏问题
Sep 02 Javascript
vue-cli3配置favicon.ico和title的流程
Oct 27 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之OpCode原理详解
2016/06/01 PHP
PHP使用new StdClass()创建空对象的方法分析
2017/06/06 PHP
thinkphp查询,3.X 5.0方法(亲试可行)
2017/06/17 PHP
jquery清空textarea等输入框实现代码
2013/04/22 Javascript
from表单多个按钮提交用onclick跳转不同action
2014/04/24 Javascript
实例代码讲解jquery easyui动态tab页
2015/11/17 Javascript
jquery实现定时自动轮播特效
2015/12/10 Javascript
js实现小窗口拖拽效果
2016/12/03 Javascript
微信小程序 图片宽高自适应详解
2017/05/11 Javascript
vue的for循环使用方法
2019/02/12 Javascript
微信小程序常见页面跳转操作简单示例
2019/05/01 Javascript
jQuery操作cookie的示例代码
2019/06/05 jQuery
vue项目中锚点定位替代方式
2019/11/13 Javascript
Vue.directive 实现元素scroll逻辑复用
2019/11/29 Javascript
Bootstrap简单实用的表单验证插件BootstrapValidator用法实例详解
2020/03/29 Javascript
JS如何判断对象是否包含某个属性
2020/08/29 Javascript
vue使用openlayers实现移动点动画
2020/09/24 Javascript
[06:35]2014DOTA2国际邀请赛 老男孩梦圆西雅图中国军团世界最强
2014/07/22 DOTA
python使用calendar输出指定年份全年日历的方法
2015/04/04 Python
Python Socket编程详细介绍
2017/03/23 Python
Python中格式化format()方法详解
2017/04/01 Python
Python返回数组/List长度的实例
2018/06/23 Python
对Python 窗体(tkinter)树状数据(Treeview)详解
2018/10/11 Python
Python 绘制酷炫的三维图步骤详解
2019/07/12 Python
如何清空python的变量
2020/07/05 Python
CSS3制作Dropdown下拉菜单的方法
2015/07/18 HTML / CSS
详解HTML5中的picture元素响应式处理图片
2018/01/03 HTML / CSS
HTML5页面直接调用百度地图API获取当前位置直接导航目的地的实现代码
2018/03/02 HTML / CSS
Fox Racing官方网站:越野摩托车和山地自行车装备和服装
2019/12/23 全球购物
AURALog面试题软件测试方面
2013/10/22 面试题
早餐连锁店计划书
2014/01/08 职场文书
教师一岗双责责任书
2014/04/16 职场文书
动物科学专业求职信
2014/07/27 职场文书
一份没有按时交货失信于客户的检讨书
2014/09/19 职场文书
市级三好生竞选稿
2015/11/21 职场文书
postman中form-data、x-www-form-urlencoded、raw、binary的区别介绍
2022/01/18 HTML / CSS