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 相关文章推荐
JavaScript 学习笔记一些小技巧
Mar 28 Javascript
JQ获取动态加载的图片大小的正确方法分享
Nov 08 Javascript
table对象中的insertRow与deleteRow使用示例
Jan 26 Javascript
jQuery元素选择器用法实例
Dec 23 Javascript
jquery实现删除一个元素后面的所有元素功能
Dec 21 Javascript
使用jQuery判断Div是否在可视区域的方法 判断div是否可见
Feb 17 Javascript
最细致的vue.js基础语法 值得收藏!
Nov 03 Javascript
javascript 初学教程及五子棋小程序的简单实现
Jul 04 Javascript
详解vue微信网页授权最终解决方案
Jun 16 Javascript
js/jQuery实现全选效果
Jun 17 jQuery
Vue中正确使用Element-UI组件的方法实例
Oct 13 Javascript
vue打包时去掉所有的console.log
Apr 10 Vue.js
深入了解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 文件上传模型,支持多文件上传
2009/08/13 PHP
二招解决php乱码问题
2012/03/25 PHP
Smarty中的注释和截断功能介绍
2015/04/09 PHP
通过JAVAScript实现页面自适应
2007/01/19 Javascript
子窗口、父窗口和Silverlight之间的相互调用
2010/08/16 Javascript
Array, Array Constructor, for in loop, typeof, instanceOf
2011/09/13 Javascript
如何使Chrome控制台支持多行js模式——意外发现
2013/06/13 Javascript
纯javascript判断查询日期是否为有效日期
2015/08/24 Javascript
JavaScript中的原型继承基础学习教程
2016/05/06 Javascript
jQuery插件开发汇总
2016/05/15 Javascript
微信小程序 PHP后端form表单提交实例详解
2017/01/12 Javascript
JavaScript的for循环中嵌套一个点击事件的问题解决
2017/03/03 Javascript
jQuery 表单序列化实例代码
2017/06/11 jQuery
基于Vue实现图书管理功能
2017/10/17 Javascript
ES6使用Set数据结构实现数组的交集、并集、差集功能示例
2017/10/31 Javascript
浅谈Vue服务端渲染框架Nuxt的那些事
2018/12/21 Javascript
JavaScript 预解析的4种实现方法解析
2019/09/03 Javascript
vue实现给div绑定keyup的enter事件
2020/07/31 Javascript
python生成excel的实例代码
2017/11/08 Python
解决python使用open打开文件中文乱码的问题
2017/12/29 Python
利用scrapy将爬到的数据保存到mysql(防止重复)
2018/03/31 Python
使用matplotlib中scatter方法画散点图
2019/03/19 Python
基于python实现删除指定文件类型
2020/07/21 Python
详解python 支持向量机(SVM)算法
2020/09/18 Python
安装Anaconda3及使用Jupyter的方法
2020/10/27 Python
全球知名旅游社区巴西站点:TripAdvisor巴西
2016/07/21 全球购物
中国最大的名表商城:万表网
2016/08/29 全球购物
德国在线订购鲜花:Fleurop
2018/08/25 全球购物
美国美食礼品篮网站:Gourmet Gift Baskets
2019/12/15 全球购物
JDO的含义
2012/11/17 面试题
String s = new String(“xyz”);创建了几个String Object?
2015/08/05 面试题
文史专业毕业生自荐信
2013/11/17 职场文书
英语国培研修感言
2014/02/13 职场文书
师德师风演讲稿
2014/05/05 职场文书
计算机专业毕业生自荐书
2014/06/02 职场文书
撤诉申请书法院范本
2015/05/18 职场文书