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实现多域名不同文件的调用方法
Jan 12 Javascript
cookie的复制与使用记住用户名实现代码
Nov 04 Javascript
jquery 判断滚动条到达了底部和顶端的方法
Apr 02 Javascript
JavaScript获取一个范围内日期的方法
Apr 24 Javascript
3种js实现string的substring方法
Nov 09 Javascript
vue中渐进过渡效果实现
Oct 27 Javascript
js实现简单的手风琴效果
Feb 27 Javascript
JavaScript 中 JSON.parse 函数 和 JSON.stringify 函数
Dec 05 Javascript
Vue.js+cube-ui(Scroll组件)实现类似头条效果的横向滚动导航条
Jun 24 Javascript
layer弹出层倒计时关闭的实现方法
Sep 27 Javascript
vue中的双向数据绑定原理与常见操作技巧详解
Mar 16 Javascript
JavaScript中关于预编译、作用域链和闭包的理解
Mar 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
各种咖啡的英文名子是什么
2021/03/03 新手入门
PHP 创建标签云函数代码
2010/05/26 PHP
PHP对表单提交特殊字符的过滤和处理方法汇总
2014/02/18 PHP
PHP与MYSQL中UTF8编码的中文排序实例
2014/10/21 PHP
PHP面向对象程序设计实例分析
2016/01/26 PHP
PHP+JS三级菜单联动菜单实现方法
2016/02/24 PHP
Jquery下:nth-child(an+b)的使用注意
2011/05/28 Javascript
基于jquery实现一张图片点击鼠标放大再点缩小
2013/09/29 Javascript
ExtJS4中的requires使用方法示例介绍
2013/12/03 Javascript
jquery中each遍历对象和数组示例
2014/08/05 Javascript
Boostrap模态窗口的学习小结
2016/03/28 Javascript
Javascript实现跑马灯效果的简单实例
2016/05/31 Javascript
jQuery实现判断控件是否显示的方法
2017/01/11 Javascript
微信小程序 图片加载(本地,网路)实例详解
2017/03/10 Javascript
React Native验证码倒计时工具类分享
2017/10/24 Javascript
为什么使用koa2搭建微信第三方公众平台的原因
2018/05/16 Javascript
解决Mac下安装nmp的淘宝镜像失败问题
2018/05/16 Javascript
PHP魔术方法__ISSET、__UNSET使用实例
2014/11/25 Python
Python中datetime常用时间处理方法
2015/06/15 Python
Windows下Eclipse+PyDev配置Python+PyQt4开发环境
2016/05/17 Python
Python中set与frozenset方法和区别详解
2016/05/23 Python
浅谈python字符串方法的简单使用
2016/07/18 Python
Python3之简单搭建自带服务器的实例讲解
2018/06/04 Python
详谈Python 窗体(tkinter)表格数据(Treeview)
2018/10/11 Python
windows上彻底删除jupyter notebook的实现
2020/04/13 Python
python 模块导入问题汇总
2021/02/01 Python
利用HTML5 Canvas制作键盘及鼠标动画的实例分享
2016/03/15 HTML / CSS
英国在线房屋中介网站:Yopa
2018/01/09 全球购物
巴西宠物商店:Cobasi
2019/04/19 全球购物
自我鉴定标准格式
2014/03/19 职场文书
新春文艺演出主持词
2014/03/27 职场文书
公司委托书格式
2014/08/01 职场文书
文体活动总结
2015/02/04 职场文书
python基础入门之字典和集合
2021/06/13 Python
Python快速实现一键抠图功能的全过程
2021/06/29 Python
Win11如何查看显卡型号 Win11查看显卡型号的方法
2022/08/14 数码科技