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 相关文章推荐
URL地址中的#符号使用说明
Feb 12 Javascript
jquery学习笔记 用jquery实现无刷新登录
Aug 08 Javascript
深入理解JavaScript系列(9) 根本没有“JSON对象”这回事!
Jan 15 Javascript
jQuery+CSS实现菜单滑动伸展收缩(仿淘宝)
Mar 22 Javascript
js实现touch移动触屏滑动事件
Apr 17 Javascript
JS+CSS实现电子商务网站导航模板效果代码
Sep 10 Javascript
基于JS实现导航条之调用网页助手小精灵的方法
Jun 17 Javascript
React-intl 实现多语言的示例代码
Nov 03 Javascript
vue组件tabbar使用方法详解
Nov 06 Javascript
微信提示 在浏览器打开 效果实现过程解析
Sep 10 Javascript
详解Nuxt内导航栏的两种实现方式
Apr 16 Javascript
解决vue侦听器watch,调用this时出现undefined的问题
Oct 30 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时间戳与日期的转换
2013/06/06 PHP
变量在 PHP7 内部的实现(一)
2015/12/21 PHP
PHP按指定键值对二维数组进行排序的方法
2015/12/22 PHP
php文件上传原理与实现方法详解
2019/12/20 PHP
使用jQuery的ajax功能实现的RSS Reader 代码
2009/09/03 Javascript
js下用eval生成JSON对象
2010/09/17 Javascript
浅析JavaScript中的typeof运算符
2013/11/30 Javascript
你未必知道的JavaScript和CSS交互的5种方法
2014/04/02 Javascript
讲解JavaScript中for...in语句的使用方法
2015/06/03 Javascript
基于jQuery实现二级下拉菜单效果
2016/02/01 Javascript
javascript创建对象、对象继承的实用方式详解
2016/03/08 Javascript
微信小程序 Page()函数详解
2016/10/17 Javascript
Vuex之理解Store的用法
2017/04/19 Javascript
Vue2.0 v-for filter列表过滤功能的实现
2018/09/07 Javascript
js计算两个日期间的天数月的实例代码
2018/09/20 Javascript
微信小程序中显示倒计时代码实例
2019/05/09 Javascript
vue实现鼠标移过出现下拉二级菜单功能
2019/12/12 Javascript
Python性能优化技巧
2015/03/09 Python
Windows下用py2exe将Python程序打包成exe程序的教程
2015/04/08 Python
Python模块搜索概念介绍及模块安装方法介绍
2015/06/03 Python
python下载文件记录黑名单的实现代码
2017/10/24 Python
利用Python如何实现数据驱动的接口自动化测试
2018/05/11 Python
python 脚本生成随机 字母 + 数字密码功能
2018/05/26 Python
用Python画一个LinkinPark的logo代码实例
2019/09/10 Python
python pprint模块中print()和pprint()两者的区别
2020/02/10 Python
Python使用paramiko连接远程服务器执行Shell命令的实现
2021/03/04 Python
销售部主管岗位职责
2013/12/18 职场文书
餐饮投资计划书
2014/04/25 职场文书
酒店七夕情人节活动策划方案
2014/08/24 职场文书
端午节活动总结报告
2015/02/11 职场文书
社区青年志愿者活动总结
2015/05/06 职场文书
幼儿园园长安全责任书
2015/05/08 职场文书
环境卫生整治简报
2015/07/20 职场文书
公司员工宿舍管理制度
2015/08/03 职场文书
Html5通过数据流方式播放视频的实现
2021/04/27 HTML / CSS
div与span之间的区别与使用介绍
2021/12/06 HTML / CSS