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 相关文章推荐
Jquery实战_读书笔记2 选择器
Jan 22 Javascript
jQuery经过一段时间自动隐藏指定元素的方法
Mar 17 Javascript
jquery实现鼠标经过显示下划线的渐变下拉菜单效果代码
Aug 24 Javascript
JS解决iframe之间通信和自适应高度的问题
Aug 24 Javascript
微信小程序 闭包写法详细介绍
Dec 14 Javascript
详解Angular4中路由Router类的跳转navigate
Jun 09 Javascript
ionic3 懒加载
Aug 16 Javascript
jQuery中过滤器的基本用法示例
Oct 11 jQuery
JavaScript常用截取字符串的三种方式用法区别实例解析
May 15 Javascript
js中的 || 与 &amp;&amp; 运算符详解
May 24 Javascript
浅谈webpack性能榨汁机(打包速度优化)
Jan 09 Javascript
layui实现图片虚拟路径上传,预览和删除的例子
Sep 25 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中json_encode、json_decode与serialize、unserialize的性能测试分析
2010/06/09 PHP
PHP遍历数组的几种方法
2012/03/22 PHP
PHP删除目录及目录下所有文件的方法详解
2013/06/06 PHP
解决php接收shell返回的结果中文乱码问题
2014/01/23 PHP
CodeIgniter配置之routes.php用法实例分析
2016/01/19 PHP
小议Function.apply()之二------利用Apply的参数数组化来提高 JavaScript程序性能
2006/11/30 Javascript
JS判断不能为空实例代码
2013/11/26 Javascript
js判断为空Null与字符串为空简写方法
2014/02/24 Javascript
JavaScript中DOM详解
2015/04/13 Javascript
javascript简单实现滑动菜单效果的方法
2015/07/27 Javascript
JS实现弹出浮动窗口(支持鼠标拖动和关闭)实例详解
2015/08/06 Javascript
详解Node.js模块间共享数据库连接的方法
2016/05/24 Javascript
使用Javascript监控前端相关数据的代码
2016/10/27 Javascript
详解vue之页面缓存问题(基于2.0)
2017/01/10 Javascript
前端主流框架vue学习笔记第一篇
2017/07/26 Javascript
基于jQuery实现定位导航位置效果
2017/11/15 jQuery
layui 富文本图片上传接口与普通按钮 文件上传接口的例子
2019/09/23 Javascript
Python中使用strip()方法删除字符串中空格的教程
2015/05/20 Python
python实现电子产品商店
2019/02/26 Python
利用pyecharts实现地图可视化的例子
2019/08/12 Python
浅析Python语言自带的数据结构有哪些
2019/08/27 Python
Python数据可视化:幂律分布实例详解
2019/12/07 Python
Python在线和离线安装第三方库的方法
2020/10/31 Python
python模块内置属性概念及实例
2021/02/18 Python
canvas中普通动效与粒子动效的实现代码示例
2019/01/03 HTML / CSS
美国第二大连锁药店:Rite Aid
2019/04/03 全球购物
高二政治教学反思
2014/02/01 职场文书
大学生毕业求职自荐书范文
2014/02/04 职场文书
超市开学活动方案
2014/03/01 职场文书
3分钟演讲稿
2014/04/30 职场文书
个人考核材料
2014/05/15 职场文书
领导走群众路线整改措施思想汇报
2014/10/12 职场文书
三方合作意向书范本
2015/05/09 职场文书
检察院起诉意见书
2015/05/20 职场文书
导游词之珠海轮廓
2019/10/25 职场文书
Python 装饰器(decorator)常用的创建方式及解析
2022/04/24 Python