js getBoundingClientRect使用方法详解


Posted in Javascript onJuly 17, 2019

主要介绍getBoundingClientRect的基本属性,以及具体的使用场景和一些需要注意的问题。

getBoundingClientRect

Element.getBoundingClientRect()

含义:

方法返回元素的大小及其相对于视口的位置。

值:

返回值是一个 DOMRect 对象,这个对象是由该元素的 getClientRects() 方法返回的一组矩形的集合, 即:是与该元素相关的CSS 边框集合。

属性值:

  • top: 元素上边距离页面上边的距离
  • left: 元素右边距离页面左边的距离
  • right: 元素右边距离页面左边的距离
  • bottom: 元素下边距离页面上边的距离
  • width: 元素宽度
  • height: 元素高度

js getBoundingClientRect使用方法详解

注意:

如果所有的元素边框都是空边框,那么这个矩形给该元素返回的 width、height 值为0,left、top值为第一个css盒子(按内容顺序)的top-left值。

当计算边界矩形时,会考虑视口区域(或其他可滚动元素)内的滚动操作,也就是说,当滚动位置发生了改变,top和left属性值就会随之立即发生变化(因此,它们的值是相对于视口的,而不是绝对的)。

如果你需要获得相对于整个网页左上角定位的属性值,那么只要给top、left属性值加上当前的滚动位置(通过window.scrollX和window.scrollY),这样就可以获取与当前的滚动位置无关的值。

js getBoundingClientRect使用方法详解

如图所示:

当页面的元素在浏览器的左上角时,得到的top和left值为负值,right和bottom值为正值。

应用场景一

1、获取dom元素相对于网页左上角定位的距离

以前的写法是通过offsetParent找到元素到定位父级元素,直至递归到顶级元素body或html。

// 获取dom元素相对于网页左上角定位的距离
function offset(el) {
  var top = 0;
  var left = 0;
  // 获取元素的位置还有getBoundingClientRect的方法
  // 从网上得知offset的兼容较差而且设置translate3D的y轴值给元素定位了y轴的距离后
  //会出现offsetTop为0
  do {
    top += el.offsetTop;
    left += el.offsetLeft;
  }
  while(el = el.offsetParent);// 存在兼容性问题,需要兼容
  
  
  return {
    top: top,
    left: left
  }
}

测试代码如下:

var odiv = document.getElementsByClassName('markdown-body');
offset(a[0]); // {top: 271, left: 136}

现在根据getBoundingClientRect这个api,可以写成这样:

var positionX = this.getBoundingClientRect().left + document.documentElement.scrollLeft;
var positionY = this.getBoundingClientRect().top + document.documentElement.scrollLeft;

应用场景二

2、判断元素是否在可视区域内

function isElView(el) {
  var top = el.getBoundingClientRect().top; // 元素顶端到可见区域顶端的距离
  var bottom = el.getBoundingClientRect().bottom; // 元素底部端到可见区域顶端的距离
  var se = document.documentElement.clientHeight; // 浏览器可见区域高度。
  
  if (top < se && bottom > 0) {
    return true;
  }
  else if (top >= se || bottom <= 0) {
    // 不可见
  }
  return false;
}

缺点

这个属性频繁计算会引发页面的重绘,可能会对页面的性能造成影响。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Packer 3.0 JS压缩及混淆工具 下载
May 03 Javascript
ExtJS 下拉多选框lovcombo
May 19 Javascript
JS实现多物体缓冲运动实例代码
Nov 29 Javascript
JS与C#编码解码
Dec 03 Javascript
解决jquery中美元符号命名冲突问题
Jan 08 Javascript
利用Keydown事件阻止用户输入实现代码
Mar 11 Javascript
json字符串之间的相互转换示例代码
Aug 21 Javascript
基于JavaScript实现瀑布流效果
Mar 29 Javascript
基于Vue 2.0的模块化前端 UI 组件库小结
Dec 21 Javascript
通过微信公众平台获取公众号文章的方法示例
Dec 25 Javascript
原生JS利用transform实现banner的无限滚动示例代码
Jun 15 Javascript
vant 自定义 van-dropdown-item的用法
Aug 05 Javascript
深入了解Hybrid App技术的相关知识
Jul 17 #Javascript
Vue发布项目实例讲解
Jul 17 #Javascript
Vue项目实现简单的权限控制管理功能
Jul 17 #Javascript
百度小程序自定义通用toast组件
Jul 17 #Javascript
微信小程序自定义弹窗滚动与页面滚动冲突的解决方法
Jul 16 #Javascript
JS实现返回上一页并刷新页面的方法分析
Jul 16 #Javascript
js+HTML5 canvas 实现简单的加载条(进度条)功能示例
Jul 16 #Javascript
You might like
php将时间差转换为字符串提示
2011/09/07 PHP
PHP 自动加载的简单实现(推荐)
2016/08/12 PHP
基于yaf框架和uploadify插件,做的一个导入excel文件,查看并保存数据的功能
2017/01/24 PHP
PHP实现下载远程图片保存到本地的方法
2017/06/19 PHP
PHP程序员简单的开展服务治理架构操作详解(三)
2020/05/14 PHP
FireFox与IE 下js兼容触发click事件的代码
2008/11/20 Javascript
JS 巧妙获取剪贴板数据 Excel数据的粘贴
2009/07/09 Javascript
解决jquery中美元符号命名冲突问题
2014/01/08 Javascript
NodeJS学习笔记之Connect中间件模块(二)
2015/01/27 NodeJs
基于zepto.js实现仿手机QQ空间的大图查看组件ImageView.js详解
2015/03/05 Javascript
JavaScript获得指定对象大小的方法
2015/07/01 Javascript
全面解析多种Bootstrap图片轮播效果
2016/05/27 Javascript
jQuery实现查找链接文字替换属性的方法
2016/06/27 Javascript
JS验证全角与半角及相互转化的介绍
2017/05/18 Javascript
react高阶组件经典应用之权限控制详解
2017/09/07 Javascript
使用vue实现grid-layout功能实例代码
2018/01/05 Javascript
微信小程序如何获取openid及用户信息
2018/01/26 Javascript
详解webpack打包nodejs项目(前端代码)
2018/09/19 NodeJs
从源码角度来回答keep-alive组件的缓存原理
2021/01/18 Javascript
终端命令查看TensorFlow版本号及路径的方法
2018/06/13 Python
python实现点对点聊天程序
2018/07/28 Python
python实现逆滤波与维纳滤波示例
2020/02/26 Python
浅谈python3 构造函数和析构函数
2020/03/12 Python
python + selenium 刷B站播放量的实例代码
2020/06/12 Python
Numpy中np.random.rand()和np.random.randn() 用法和区别详解
2020/10/23 Python
以思科路由器为例你写下单臂路由的配置命令
2013/08/03 面试题
项目建议书模板
2014/05/12 职场文书
上课玩手机的检讨书
2014/10/01 职场文书
小学生毕业评语
2014/12/26 职场文书
办公室年度工作总结2015
2015/05/21 职场文书
2016年党员学习廉政准则心得体会
2016/01/20 职场文书
浅谈:电影《孔子》观后感(范文)
2019/10/14 职场文书
java固定大小队列的几种实现方式详解
2021/07/15 Java/Android
bootstrapv4轮播图去除两侧阴影及线框的方法
2022/02/15 HTML / CSS
Spring Bean是如何初始化的详解
2022/03/22 Java/Android
python标准库ElementTree处理xml
2022/05/20 Python