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 相关文章推荐
文本框根据输入内容自适应高度的代码
Oct 24 Javascript
往光标所在位置插入值的js代码
Sep 22 Javascript
探讨js中的双感叹号判断
Nov 11 Javascript
禁止拷贝网页内容的js代码
Jan 22 Javascript
JavaScript中的object转换函数toString()与valueOf()介绍
Dec 31 Javascript
JavaScript判断是否为数组的3种方法及效率比较
Apr 01 Javascript
javascript基础知识讲解
Jan 11 Javascript
React Router基础使用
Jan 17 Javascript
node-sass安装失败的原因与解决方法
Sep 04 Javascript
小程序分享模块超级详解(推荐)
Apr 10 Javascript
VSCode写vue项目一键生成.vue模版,修改定义其他模板的方法
Apr 17 Javascript
vue 获取元素额外生成的data-v-xxx操作
Sep 09 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 之 没有mysql支持时的替代方案
2006/10/09 PHP
php模板中出现空行解决方法
2011/03/08 PHP
php curl抓取网页的介绍和推广及使用CURL抓取淘宝页面集成方法
2015/11/30 PHP
推荐10 款 SVG 动画的 JavaScript 库
2015/03/24 Javascript
javascript显式类型转换实例分析
2015/04/25 Javascript
jquery+php随机生成红包金额数量代码分享
2015/08/27 Javascript
谈谈JavaScript中function多重理解
2015/08/28 Javascript
基于AngularJS+HTML+Groovy实现登录功能
2016/02/17 Javascript
javascript代码调试之console.log 用法图文详解
2016/09/30 Javascript
JavaScript中在光标处插入添加文本标签节点的详细方法
2017/03/22 Javascript
vue深入解析之render function code详解
2017/07/18 Javascript
浅谈node的事件机制
2017/10/09 Javascript
Angular实现的敏感文字自动过滤与提示功能示例
2017/12/29 Javascript
从0到1搭建Element的后台框架的方法步骤
2019/04/10 Javascript
vue实现井字棋游戏
2020/09/29 Javascript
JavaScript WeakMap使用详解
2021/02/05 Javascript
python解决字典中的值是列表问题的方法
2013/03/04 Python
教你如何在Django 1.6中正确使用 Signal
2014/06/22 Python
Python使用Mechanize模块编写爬虫的要点解析
2016/03/31 Python
selenium+python自动化测试环境搭建步骤
2019/06/03 Python
python字典setdefault方法和get方法使用实例
2019/12/25 Python
Python turtle库的画笔控制说明
2020/06/28 Python
canvas与html5实现视频截图功能示例
2016/12/15 HTML / CSS
The Hut美国/加拿大:英国领先的豪华在线百货商店
2019/03/26 全球购物
Bluebella德国官网:英国性感内衣和睡衣品牌
2019/11/08 全球购物
万代美国官网:PREMIUM BANDAI USA
2020/09/11 全球购物
公司道歉信范文
2014/01/09 职场文书
给护士表扬信
2014/01/19 职场文书
小学毕业感言150字
2014/02/05 职场文书
高中美术教师事迹材料
2014/08/22 职场文书
2014年业务工作总结
2014/11/17 职场文书
结婚老公保证书
2015/02/26 职场文书
2015年体育教学工作总结
2015/05/20 职场文书
2016年社区“6.26”禁毒日宣传活动总结
2016/04/05 职场文书
什么是创业计划书?什么是商业计划书?这里一一解答
2019/07/12 职场文书
关于React Native使用axios进行网络请求的方法
2021/08/02 Javascript