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 相关文章推荐
用js实现的页面关键字密度查询代码
Dec 27 Javascript
jquery怎样实现ajax联动框(二)
Mar 08 Javascript
js控制网页背景音乐播放与停止的方法
Feb 06 Javascript
js制作带有遮罩弹出层实现登录注册表单特效代码分享
Sep 05 Javascript
Jquery鼠标放上去显示全名的实现方法
Feb 06 Javascript
vue 子组件向父组件传值方法
Feb 26 Javascript
使用D3.js+Vue实现一个简单的柱形图
Aug 05 Javascript
vue实现多组关键词对应高亮显示功能
Jul 25 Javascript
Vue组件通信入门之Provide和Inject机制
Dec 29 Javascript
JavaScript数组常用的增删改查与其他属性详解
Oct 13 Javascript
微信小程序实现日历小功能
Nov 18 Javascript
Vue通过懒加载提升页面响应速度
May 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实现的短网址算法分享
2014/06/20 PHP
php使用simplexml_load_file加载XML文件并显示XML的方法
2015/03/19 PHP
PHP的Yii框架使用中的一些错误解决方法与建议
2015/08/21 PHP
PHP类型约束用法示例
2016/09/28 PHP
用JavaScript隐藏控件的方法
2009/09/21 Javascript
jquery.uploadify插件在chrome浏览器频繁崩溃解决方法
2015/03/01 Javascript
text-align:justify实现文本两端对齐 兼容IE
2015/08/19 Javascript
VueJs路由跳转——vue-router的使用详解
2017/01/10 Javascript
用js将long型数据转换成date型或datetime型的实例
2017/07/03 Javascript
Bootstrap一款超好用的前端框架
2017/09/25 Javascript
如何为vue的项目添加单元测试
2018/12/19 Javascript
浅谈js闭包理解
2019/04/01 Javascript
[00:32]2018DOTA2亚洲邀请赛OpTic出场
2018/04/03 DOTA
[05:26]TI10典藏宝瓶套装外观展示
2020/07/03 DOTA
使用Python制作获取网站目录的图形化程序
2015/05/04 Python
编写Python CGI脚本的教程
2015/06/29 Python
Python爬取京东的商品分类与链接
2016/08/26 Python
TensorFlow平台下Python实现神经网络
2018/03/10 Python
Python 保存矩阵为Excel的实现方法
2019/01/28 Python
Python爬虫抓取技术的一些经验
2019/07/12 Python
在python中使用pymysql往mysql数据库中插入(insert)数据实例
2020/03/02 Python
python Xpath语法的使用
2020/11/26 Python
html5 canvas 实现光线沿不规则路径运动
2020/04/20 HTML / CSS
俄罗斯家居用品购物网站:Евродом
2020/11/21 全球购物
八年级物理教学反思
2014/01/19 职场文书
高二生物教学反思
2014/01/27 职场文书
采购求职信
2014/03/17 职场文书
元旦寄语大全
2014/04/10 职场文书
行政部经理助理岗位职责
2014/06/15 职场文书
测量员岗位职责
2015/02/14 职场文书
2015年七年级班主任工作总结
2015/05/21 职场文书
2015年团支部年度工作总结
2015/05/27 职场文书
新闻稿件写作范文
2015/07/18 职场文书
实习报告怎么写
2019/06/20 职场文书
职业规划从高考志愿专业选择开始
2019/08/08 职场文书
磁贴还没死, 微软Win11可修改注册表找回Win10开始菜单
2021/11/21 数码科技