JS | 元素视图方法之getBoundingClientRect()方法详解,秒懂!

24,681次阅读
没有评论

共计 5586 个字符,预计需要花费 14 分钟才能阅读完成。

目录

一、getBoundingClientRect()简介

二、getBoundingClientRect()的兼容性

三、getBoundingClientRect()的示例及分析

四、getBoundingClientRect()的应用场景


JS | 元素视图方法之 getBoundingClientRect()方法详解,秒懂!

JS | 元素视图方法之 getBoundingClientRect()方法详解,秒懂!

在前端开发过程中,我们经常需要获取 HTML 元素的尺寸和位置信息。getBoundingClientRect()方法就是一个非常重要的工具,它可以帮助我们获取元素的大小及其相对于视口的位置。

一、getBoundingClientRect()简介

1、getBoundingClientRect()方法的含义

getBoundingClientRect()是一个原生的 DOM 元素的方法,该方法返回一个 Object 对象,包含元素的大小及其相对于视口的位置。

注意:getBoundingClientRect(),这个方法没有参数的

getBoundingClientRect()用于获得页面中某个元素的左,上,右和下分别相对浏览器视窗的位置。也就是说,该方法用于获取 DOM 元素到浏览器可视范围的距离(不包含文档卷起的部分)。

JS | 元素视图方法之 getBoundingClientRect()方法详解,秒懂!

2、getBoundingClientRect()方法的语法

Element.getBoundingClientRect();

3、getBoundingClientRect()方法的返回值

该函数返回的 DOMRect 对象,包含 6 个属性:top,bottom,left,right,width,height。



  
    
    
    Document
    
  

  
    

二、getBoundingClientRect()的兼容性

​getBoundingClientRect() ​方法在大多数现代浏览器中都得到了支持,包括 IE5 以上的版本。‌ 这个方法最初是由 IE 引入的,后来被 W3C 接纳为标准,因此在现代浏览器中的兼容性几乎完美‌。

尽管大多数浏览器都支持 getBoundingClientRect 方法,但在一些老版本浏览器中仍然存在兼容性问题。例如,IE6 和 IE7 的 left 和 top 值会少 2px,这是因为 HTMl 文档根元素默认有 2px 的边框。此外,Firefox 6 以前的版本无法获取 top 和 bottom 属性值‌。

为了解决这些兼容性问题,可以通过一些技巧来统一处理。例如,在测试 getBoundingClientRect 方法时,可以创建一个临时元素来获取其 getBoundingClientRect 值,然后用这个值来调整原始元素的坐标。这种方法可以确保在不同浏览器中获取到的位置数据一致‌。

JS | 元素视图方法之 getBoundingClientRect()方法详解,秒懂!

1、width 和 height:ie9 及以上支持 width / height 属性。

ie9 以下浏览器只支持 getBoundingClientRect 方法的 4 个属性:top、bottom、right、left 属性;

ie9 和其它浏览器支持 getBoundingClientRect 方法的 6 个属性:top、bottom、right、left、width 和 height

兼容 ie6~ie8 的 width / height 的写法:

var rectWidth = rect.right - rect.left;

var rectHeight = rect.bottom - rect.top;

2、在 ie7 及 ie7 以下 document.documentElement 即 html 标签的 lefttop会多出两个像素。

在 ie7 及 ie7 以下的 html 元素坐标会从 (2, 2) 开始算起,在 ie8 已经修复了这个 bug。这就是多出两个像素的原因。下面我们做下兼容:

var rectLeft = rect.left - document.documentElement.clientLeft || 2;
var rectRight = rect.right - document.documentElement.clientLeft || 2;
var rectBottom = rect.bottom - document.documentElement.clientTop || 2;
var rectTop = rect.top - document.documentElement.clientTop || 2;

小结:getBoundingClientRect()方法最初是在 IE5 中引入的,并且现在已经成为 W3C 标准的一部分,因此在大多数现代浏览器中都得到了良好的支持。‌ 然而,在不同的浏览器和版本中,仍然存在一些兼容性问题需要注意。

在 IE 浏览器中,尤其是 IE6 和 IE7,getBoundingClientRect()方法返回的 lefttop值会比实际位置少 2 像素,这是因为 HTML 文档根元素默认有 2 像素的边框。为了解决这个问题,可以在获取边界之前,创建一个临时元素并设置其样式,然后获取该元素的 getBoundingClientRect() 值,用这个值来校正原始元素的 lefttop值‌。

在 FireFox 浏览器中,Firefox 6 及以前的版本使用 getBoundingClientRect() 时不能获取到 topbottom这两个属性值。从 Firefox 6 及以后的版本开始,所有四个属性值都能正确获取‌。

对 Chrome、Safari 等现代浏览器,getBoundingClientRect()方法已经非常成熟,能够正确返回元素的 lefttoprightbottomwidthheight属性值‌。

为了确保跨浏览器的兼容性,可以通过以下代码进行兼容处理:

function getElementPosition(element) {var rect = element.getBoundingClientRect();
    var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
    var scrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft;
    var offset = 2; // 根据需要调整,例如 IE6 和 IE7 需要减去 2 像素
    return {
        left: rect.left + scrollLeft - offset,
        top: rect.top + scrollTop - offset,
        right: rect.right + scrollLeft - offset,
        bottom: rect.bottom + scrollTop - offset,
        width: rect.right - rect.left,
        height: rect.bottom - rect.top
    };
}

三、getBoundingClientRect()的示例及分析

下面是一个小案例,由下图可知当前元素为 #box,及 box 的相关样式(图中红色框),针对返回值进行详细分析与计算。



  
    
    
    Document
    
  

  
    

width / height:width 和 height 属性包含了 padding 和 border,而不仅仅是内容部分的宽度和高度。

● box-sizing:  content-box  ——Standards 模式 | 标准模式 

在标准盒子模型(默认模型)中,这两个属性值分别与元素的 内容区域的宽高 width/height + padding + border-width 相等。

● box-sizing:  border-box ——Quirks模式 | 怪异模式

如果是 box-sizing:border-box,两个属性则直接与元素的 width 或 height 相等。


top:图中 红色线 表示 top 的取值区域,最外层边框即上边框到窗口顶部的距离。

● 计算:当前元素的 margin-top 为 90,说明元素 上边框 距离窗口顶部为 90px,所以 top=90


left:图中 蓝色线 表示 left 的取值范围,可知是由最左侧边框及左边框到窗口左侧的距离。

计算:当前元素的 margin-left 为 120,说明元素 左边框 距离窗口左侧为 120px,所 left=120


bottom:图中 紫色线 表示 bottom 的取值范围,可知是元素的 下边框 到窗口顶部的距离。

包含元素的元素总高度(border + padding + 元素内容区域的高度 content height) + margin。

计算:此时的 bottom = border + padding + 元素内容区域的高度 + margin-top,所 bottom = (16*2) + (10*2) + 300] + 90 = 442,即等于 y + height


right:图中 绿色线 表示 right 的取值范围,可知是元素 右边框 到窗口顶部的距离。

包含元素的元素总宽度(border + padding + 元素内容区域的宽度 content width) + margin。

计算:此时的 right = border + padding + 元素内容区域的宽度 + margin-left,所 right = (16*2) + (10*2) + 300] + 120 = 472,即等于 y + width


x:元素左上角相对于视口的横坐标,即与 left 相同,所以 x =120。

y:元素左上角相对于视口的纵坐标,即与 top 相同,所以 y =90。

JS | 元素视图方法之 getBoundingClientRect()方法详解,秒懂!

四、getBoundingClientRect()的应用场景

这个方法通常用于需要获取元素在视口中的位置和尺寸信息的场景,比如实现拖拽、定位或响应式布局等,兼容性很好,一般用滚动事件比较多。

特殊场景会用上,比如你登录了淘宝的网页,当你下拉滑块的时候,下面的图片不会立即加载出来,有一个懒加载的效果。当上面一张图片没在可视区内时,就开始加载下面的图片。

参考:图片懒加载四种实现方案之 getBoundingClientRect()方法 – 烤地瓜 CSDN 博客

参考:JavaScript 中 getBoundingClientRect 的使用方法详解及应用场景 – 脚本之家

下面代码就是判断一个容器是否出现在可视窗口内:

 const box = document.getElementById('box')
 window.onscroll = function () {//window.addEventListener('scroll',()=>{})
  console.log(checkInView(box));
 }

function checkInView(dom) {const { top, left, bottom, right} = dom.getBoundingClientRect();
 return top > 0 &&
        left > 0 &&
        bottom 

getBoundingClientRect()方法的缺点:这个属性频繁计算会引发页面的重绘,可能会对页面的性能造成影响。


● 参考资料 ●

深入理解元素视图的 3 个方法之 getBoundingClientRect()方法 – 博客园

深入理解 getBoundingClientRect:前端开发的定位利器 - 百度开发者中心

Js 中的 getBoundingClientRect | 从 getBoundingClientRect()设置边距

js getBoundingClientRect 使用方法详解_javascript 技巧_脚本之家

超详细分析!!!秒懂 getBoundingClientRect()-CSDN 博客

—— 图片懒加载四种实现方案之 getBoundingClientRect()方法 – 烤地瓜 CSDN 博客 ——

原文地址: JS | 元素视图方法之 getBoundingClientRect()方法详解,秒懂!

    正文完
     0
    Yojack
    版权声明:本篇文章由 Yojack 于2024-11-07发表,共计5586字。
    转载说明:
    1 本网站名称:优杰开发笔记
    2 本站永久网址:https://yojack.cn
    3 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行删除处理。
    4 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
    5 本站所有内容均可转载及分享, 但请注明出处
    6 我们始终尊重原创作者的版权,所有文章在发布时,均尽可能注明出处与作者。
    7 站长邮箱:laylwenl@gmail.com
    评论(没有评论)