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 HTMLEncode HTMLDecode的完整实例(兼容ie和火狐)
Jun 02 Javascript
Javascript 中介者模式实例
Dec 16 Javascript
javascript同页面多次调用弹出层具体实例代码
Aug 16 Javascript
JavaScript DOM节点添加示例
Jul 16 Javascript
浅谈关于JavaScript API设计的一些建议和准则
Jun 24 Javascript
JavaScript中利用jQuery绑定事件的几种方式小结
Mar 06 Javascript
AngularJS $http模块POST请求实现
Apr 08 Javascript
Vue列表页渲染优化详解
Jul 24 Javascript
微信小程序scroll-view仿拼多多横向滑动滚动条
Apr 21 Javascript
微信小程序Getuserinfo解决方案图解
Aug 24 Javascript
详解微信小程序支付流程与梳理
Jul 16 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
整理的一些实用WordPress后台MySQL操作命令
2013/01/07 PHP
解析posix与perl标准的正则表达式区别
2013/06/17 PHP
phpmyadmin config.inc.php配置示例
2013/08/27 PHP
php中数字0和空值的区别分析
2014/06/05 PHP
整理php防注入和XSS攻击通用过滤
2015/09/13 PHP
CI框架(CodeIgniter)公共模型类定义与用法示例
2017/08/10 PHP
详解使用php-cs-fixer格式化代码
2020/09/16 PHP
js的延迟执行问题分析
2014/06/23 Javascript
node.js [superAgent] 请求使用示例
2015/03/13 Javascript
跟我学习javascript的undefined与null
2015/11/17 Javascript
JavaScript实现时间倒计时跳转(推荐)
2016/06/28 Javascript
微信小程序 获取微信OpenId详解及实例代码
2016/10/31 Javascript
JS实现禁止用户使用Ctrl+鼠标滚轮缩放网页的方法
2017/04/28 Javascript
vue.js template模板的使用(仿饿了么布局)
2018/08/13 Javascript
小程序中手机号识别的示例
2020/12/14 Javascript
在Angular项目使用socket.io实现通信的方法
2021/01/05 Javascript
Python数据分析之双色球统计两个红和蓝球哪组合比例高的方法
2018/02/03 Python
python 执行shell命令并将结果保存的实例
2018/05/11 Python
在python tkinter中Canvas实现进度条显示的方法
2019/06/14 Python
Django CBV与FBV原理及实例详解
2019/08/12 Python
python2 对excel表格操作完整示例
2020/02/23 Python
pandas中read_csv、rolling、expanding用法详解
2020/04/21 Python
Python实现UDP程序通信过程图解
2020/05/15 Python
pytorch加载自己的图像数据集实例
2020/07/07 Python
如何解决python多种版本冲突问题
2020/10/13 Python
css3实现垂直下拉动画菜单示例
2014/04/22 HTML / CSS
HTML5网页音乐播放器的示例代码
2017/11/09 HTML / CSS
香港草莓网土耳其网站:Strawberrynet TR
2017/03/02 全球购物
我们是伦敦女孩:WalG
2018/01/08 全球购物
策划总监岗位职责
2014/02/16 职场文书
教师考核评语
2014/04/28 职场文书
我们的节日清明节活动总结
2014/04/30 职场文书
干部作风整顿个人剖析材料
2014/10/06 职场文书
关于倡议书的范文
2015/04/29 职场文书
活动新闻稿范文
2015/07/17 职场文书
资深HR教你写好简历中的自我评价
2019/05/07 职场文书