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 相关文章推荐
ext读取两种结构的xml的代码
Nov 05 Javascript
JS 精确统计网站访问量的实例代码
Jul 05 Javascript
jquery选择器之基本过滤选择器详解
Jan 27 Javascript
控制台报错object is not a function的解决方法
Aug 24 Javascript
javascript合并表格单元格实例代码
Jan 03 Javascript
jQuery给div,Span, a ,button, radio 赋值与取值
Jun 24 Javascript
JavaScript学习笔记整理_简单实现枚举类型,扑克牌应用
Sep 19 Javascript
JavaScript实现页面无操作倒计时退出
Oct 22 Javascript
[原创]JS基于FileSaver.js插件实现文件保存功能示例
Dec 08 Javascript
JavaScript使用readAsDataURL读取图像文件
May 10 Javascript
vue webuploader 文件上传组件开发
Sep 23 Javascript
vue父子组件的通信方法(实例详解)
Nov 10 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
实用函数8
2007/11/08 PHP
PHP备份/还原MySQL数据库的代码
2011/01/06 PHP
解析php安全性问题中的:Null 字符问题
2013/06/21 PHP
PHP 实现代码复用的一个方法 traits新特性
2015/02/22 PHP
PHP运行模式汇总
2016/11/06 PHP
phpStudy中升级MySQL版本到5.7.17的方法步骤
2017/08/03 PHP
用jquery实现自定义风格的滑动条实现代码
2011/04/26 Javascript
JS cookie中文乱码解决方法
2014/01/28 Javascript
Js获取下拉框选定项的值和文本的实现代码
2014/02/26 Javascript
在JavaScript应用中使用RequireJS来实现延迟加载
2015/07/01 Javascript
Jquery插件easyUi实现表单验证示例
2015/12/15 Javascript
nodeJS删除文件方法示例
2016/12/25 NodeJs
three.js实现3D影院的原理的代码分析
2017/12/18 Javascript
ES6 fetch函数与后台交互实现
2018/11/14 Javascript
使用js在layui中实现上传图片压缩
2019/06/18 Javascript
0基础学习前端开发的一些建议
2020/07/14 Javascript
解决vue项目 build之后资源文件找不到的问题
2020/09/12 Javascript
[36:37]2014 DOTA2华西杯精英邀请赛5 24 VG VS iG
2014/05/25 DOTA
python写的ARP攻击代码实例
2014/06/04 Python
零基础写python爬虫之使用Scrapy框架编写爬虫
2014/11/07 Python
Python中几种属性访问的区别与用法详解
2018/10/10 Python
详解Python下Flask-ApScheduler快速指南
2018/11/04 Python
python 实现提取某个索引中某个时间段的数据方法
2019/02/01 Python
python 进程的几种创建方式详解
2019/08/29 Python
django实现模型字段动态choice的操作
2020/04/01 Python
Html+Css+Jquery实现左侧滑动拉伸导航菜单栏的示例代码
2020/03/17 HTML / CSS
LookFantastic丹麦:英国美容护肤精品在线商城
2016/08/18 全球购物
美国马匹用品和骑马配件购物网站:Horse.com
2018/01/08 全球购物
师范教师毕业鉴定
2014/01/13 职场文书
服务生自我鉴定
2014/01/22 职场文书
个人能力自我鉴赏
2014/01/25 职场文书
2014年情人节活动方案
2014/02/16 职场文书
安全生产中长期规划实施方案
2014/02/21 职场文书
十八届三中全会感言
2014/03/10 职场文书
倡议书的写法
2014/08/30 职场文书
2016参观监狱警示教育活动心得体会
2016/01/15 职场文书