js 获取元素在页面上的偏移量的方法汇总

 更新时间:2015年04月13日 09:01:06   投稿:hebedich  
javascript可以通过四个属性可以获得元素的偏移量,分别是1、offsetHeight,2、offsetWidth,3、offsetLeft,4、offsetTop,今天我们就来具体谈一下获取页面元素偏移量的最佳方法。

使用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有是帮助。

相关文章

  • 详解bootstrap导航栏.nav与.navbar区别

    详解bootstrap导航栏.nav与.navbar区别

    本篇文章主要介绍了详解bootstrap导航栏.nav与.navbar区别,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • Express代理转发服务器实现

    Express代理转发服务器实现

    这篇文章主要为大家介绍了Express代理转发服务器实现技巧详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • js实现字符串的16进制编码不加密

    js实现字符串的16进制编码不加密

    关于十六进制编码的问题在很多情况下都会用到,所以使用JS写了个小程序转换一下
    2014-04-04
  • 使用defer和async实现高效加载JavaScript

    使用defer和async实现高效加载JavaScript

    async和defer都是异步加载脚本,但async是加载完脚本后立即执行,而defer是在HTML解析完成后再执行脚本,本文给大家介绍了如何使用defer和async高效加载JavaScript,文中通过代码和图文讲解的非常详细,需要的朋友可以参考下
    2024-06-06
  • 关于加快微信小程序开发的一些小建议

    关于加快微信小程序开发的一些小建议

    微信小程序是一种全新的连接用户与服务的方式,下面这篇文章主要给大家介绍了关于加快微信小程序开发的一些小建议,需要的朋友可以参考下
    2021-05-05
  • 利用纯JS实现像素逐渐显示的方法示例

    利用纯JS实现像素逐渐显示的方法示例

    这篇文章主要给大家介绍了利用纯JS实现像素逐渐显示的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面跟着小编来一起学习学习吧。
    2017-08-08
  • JavaScript 高性能数组去重的方法

    JavaScript 高性能数组去重的方法

    这篇文章主要介绍了JavaScript 高性能数组去重的方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-09-09
  • JavaScript实现扫雷小游戏

    JavaScript实现扫雷小游戏

    这篇文章主要为大家详细介绍了JavaScript实现扫雷小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • 模拟一个类似百度google的模糊搜索下拉列表

    模拟一个类似百度google的模糊搜索下拉列表

    这篇文章主要介绍使用js模拟一个类似百度google的模糊搜索下拉列表,需要的朋友可以参考下
    2014-04-04
  • Webpack打包过程中处理ES6模块的循环依赖问题小结

    Webpack打包过程中处理ES6模块的循环依赖问题小结

    Webpack通过“暂时性引用”特性处理ES6模块的循环依赖,即在模块加载时创建占位符,确保模块能够正确加载,本文介绍Webpack打包过程中如何处理ES6模块的循环依赖,感兴趣的朋友一起看看吧
    2025-02-02

最新评论