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 相关文章推荐
Document对象内容集合(比较全)
Sep 06 Javascript
jquery操作select大全
Apr 25 Javascript
jQuery实现的多级下拉菜单效果代码
Aug 24 Javascript
JS简单限制textarea内输入字符数量的方法
Oct 14 Javascript
关于JavaScript数组你所不知道的3件事
Aug 24 Javascript
jquery+ajax实现省市区三级联动效果简单示例
Jan 04 Javascript
浅谈React之状态(State)
Sep 19 Javascript
vue-cli脚手架搭建的项目去除eslint验证的方法
Sep 29 Javascript
PM2自动部署代码步骤流程总结
Dec 10 Javascript
利用Electron简单撸一个Markdown编辑器的方法
Jun 10 Javascript
viewer.js一个强大的基于jQuery的图像查看插件(支持旋转、缩放)
Apr 01 jQuery
js获取图片的base64编码并压缩
Dec 05 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中session与cookie的比较
2015/01/27 PHP
YII使用url组件美化管理的方法
2015/12/28 PHP
PHP7扩展开发之基于函数方式使用lib库的方法详解
2018/01/15 PHP
PHP7匿名类的用法示例
2019/04/05 PHP
用 JavaScript 迁移目录
2006/12/18 Javascript
用js实现多域名不同文件的调用方法
2007/01/12 Javascript
js实现select跳转功能代码
2014/10/22 Javascript
jQuery实现行文字链接提示效果的方法
2015/03/10 Javascript
jQuery实现带渐显效果的人物多级关系图代码
2015/10/16 Javascript
js仿微信语音播放实现思路
2016/12/12 Javascript
Vue中使用vux的配置详解
2017/05/05 Javascript
js的函数的按值传递参数(实例讲解)
2017/11/16 Javascript
Vue filter介绍及详细使用
2018/04/04 Javascript
浅谈vue项目可以从哪些方面进行优化
2018/05/05 Javascript
angular5 子组件监听父组件传入值的变化方法
2018/09/30 Javascript
详解微信小程序胶囊按钮返回|首页自定义导航栏功能
2019/06/14 Javascript
Vue实现回到顶部和底部动画效果
2019/07/31 Javascript
关于ckeditor在bootstrap中modal中弹框无法输入的解决方法
2019/09/11 Javascript
解决VueCil代理本地proxytable无效报错404的问题
2020/11/07 Javascript
[01:40]2014DOTA2国际邀请赛 三冰SOLO赛后采访恶搞
2014/07/09 DOTA
python获取从命令行输入数字的方法
2015/04/29 Python
在Python的Django框架下使用django-tagging的教程
2015/05/30 Python
一个月入门Python爬虫学习,轻松爬取大规模数据
2018/01/03 Python
Python 一键获取百度网盘提取码的方法
2019/08/01 Python
python爬取音频下载的示例代码
2020/10/19 Python
英国Boots旗下太阳镜网站:Boots Designer Sunglasses
2018/07/07 全球购物
出纳岗位职责模板
2013/11/27 职场文书
毕业生的自我鉴定该怎么写
2013/12/02 职场文书
防邪知识进家庭活动方案
2014/08/26 职场文书
晚自修旷课检讨书怎么写
2014/11/17 职场文书
网络销售员岗位职责
2015/04/11 职场文书
门卫管理制度范本
2015/08/05 职场文书
2016三八妇女节慰问信
2015/11/30 职场文书
创业计划书之蛋糕店
2019/08/29 职场文书
导游词之蜀山胜景瓦屋山
2019/11/29 职场文书
微信小程序实现拍照和相册选取图片
2021/05/09 Javascript