getBoundingClientRect()

获取元素相对于视口的位置和尺寸信息

方法说明

getBoundingClientRect() 返回元素的大小及其相对于视口的位置。这是最常用的定位 API,返回一个 DOMRect 对象。

const rect = element.getBoundingClientRect();
// 返回值:DOMRect 对象
{
  x: 100,           // 元素左边缘距离视口左侧的距离
  y: 200,           // 元素上边缘距离视口顶部的距离
  width: 300,       // 元素宽度
  height: 150,      // 元素高度
  top: 200,         // 等同于 y
  right: 400,       // x + width
  bottom: 350,      // y + height
  left: 100         // 等同于 x
}
  • x / left - 元素左边缘距离视口左侧的距离
  • y / top - 元素上边缘距离视口顶部的距离
  • right - 元素右边缘距离视口左侧的距离(x + width)
  • bottom - 元素下边缘距离视口顶部的距离(y + height)
  • width - 元素宽度
  • height - 元素高度

💡 核心优势

与 offset 属性不同,getBoundingClientRect() 返回的是相对于视口的位置,而不是相对于父元素。当页面滚动时,这些值会实时更新。

示例 1:基础测量

移动鼠标或滚动页面,观察数值的实时变化

目标元素

实时数据(相对于视口)

x (left): 0px
y (top): 0px
right: 0px
bottom: 0px
width: 0px
height: 0px
const box = document.getElementById('box');
const rect = box.getBoundingClientRect();

console.log(`左上角位置: (${rect.x}, ${rect.y})`);
console.log(`元素尺寸: ${rect.width} × ${rect.height}`);

示例 2:检测元素是否在视口中

判断元素是否完全或部分可见

↓ 向下滚动找到目标元素 ↓

目标元素

继续滚动...

可见性检测

元素状态: 检测中...
top: 0px
bottom: 0px
视口高度: 0px
function isInViewport(element) {
  const rect = element.getBoundingClientRect();
  return (
    rect.top >= 0 &&
    rect.left >= 0 &&
    rect.bottom <= window.innerHeight &&
    rect.right <= window.innerWidth
  );
}

示例 3:计算元素重叠区域

检测两个元素是否重叠

元素 A
元素 B

重叠检测结果

是否重叠: -
重叠区域宽度: 0px
重叠区域高度: 0px
function checkOverlap(el1, el2) {
  const rect1 = el1.getBoundingClientRect();
  const rect2 = el2.getBoundingClientRect();

  return !(
    rect1.right < rect2.left ||
    rect1.left > rect2.right ||
    rect1.bottom < rect2.top ||
    rect1.top > rect2.bottom
  );
}

示例 4:滚动时实时更新位置

观察页面滚动时元素位置的变化

↓ 滚动整个页面 ↓

观察下方元素相对于视口位置的变化

观察我

位置追踪

Y (top): 0px
相对于视口顶部: 0px
页面滚动距离: 0px

💡 关键点

页面滚动时,getBoundingClientRect() 的返回值会实时更新。如果需要获取元素相对于文档的位置(不受滚动影响),需要加上 scrollY:
absoluteTop = rect.top + window.scrollY

示例 5:元素定位锚点

在某个元素附近定位另一个元素(如工具提示)

目标元素

工具提示位置

元素顶部: 0px
元素左侧: 0px
提示框 Y: 0px
提示框 X: 0px
function positionTooltip(element, tooltip) {
  const rect = element.getBoundingClientRect();

  // 在元素上方居中显示工具提示
  tooltip.style.top = (rect.top - tooltip.offsetHeight - 10) + 'px';
  tooltip.style.left = (rect.left + rect.width / 2 - tooltip.offsetWidth / 2) + 'px';
}

示例 6:固定定位元素的特殊情况

固定定位元素的位置是相对于视口的

相对定位
固定定位

相对定位元素

top: 0px
left: 0px

固定定位元素

top: 0px
left: 0px

💡 注意

固定定位元素(position: fixed)的 getBoundingClientRect() 返回的值不会随页面滚动而变化,因为它本身就是相对于视口定位的。

浏览器兼容性

方法 Chrome Firefox Safari Edge
getBoundingClientRect() ✓ 全版本 ✓ 全版本 ✓ 全版本 ✓ 全版本
返回值 width/height ✓ 全版本 ✓ 全版本 ✓ 全版本 ✓ 全版本
返回值 x/y ✓ 全版本 ✓ 全版本 ✓ 全版本 ✓ 全版本

总结

  • 相对于视口:返回值是相对于视口的位置,不是相对于文档
  • 实时更新:滚动或缩放时,返回值会自动更新
  • 包含 border:width/height 包含元素的 border
  • 常用场景:检测可见性、元素定位、碰撞检测、懒加载等
  • 性能考虑:频繁调用会触发 reflow,建议缓存结果