Element: getBoundingClientRect() 方法

Baseline 已广泛支持

此特性已相当成熟,可在许多设备和浏览器版本上使用。自 ⁨2015 年 7 月⁩以来,各浏览器均已提供此特性。

Element.getBoundingClientRect() 方法返回一个 DOMRect 对象,该对象提供有关元素大小及其相对于 视口 位置的信息。

语法

js
getBoundingClientRect()

参数

无。

返回值

返回的值是一个 DOMRect 对象,它是包含整个元素的最小矩形,包括其内边距和边框宽度。lefttoprightbottomxywidthheight 属性以像素为单位描述了整个矩形的位置和大小。除 widthheight 之外的属性是相对于视口左上角的。

DOMRect object that is the smallest rectangle containing the entire element.

方法返回的 DOMRect 对象的 widthheight 属性包括 paddingborder-width,而不仅仅是内容宽度/高度。在标准盒子模型中,这等于元素的 widthheight 属性 + padding + border-width。但如果为元素设置了 box-sizing: border-box,那么它将直接等于其 widthheight

返回的值可以被认为是元素 getClientRects() 方法返回的矩形的并集,即与元素关联的 CSS 边框框。

空的边框框将被完全忽略。如果元素的所有边框框都为空,则返回一个 widthheight 为零的矩形,并且 topleft 是元素第一个 CSS 框(按内容顺序)的左上角。

在计算边界矩形时,会考虑视口区域(或其他可滚动元素)的滚动量。这意味着矩形的边界(toprightbottomleft)每次滚动位置改变时都会改变其值(因为它们是相对于视口的,而不是绝对值)。

如果你需要相对于文档左上角的边界矩形,只需将当前滚动位置添加到 topleft 属性(可以通过 window.scrollYwindow.scrollX 获取)即可获得一个与当前滚动位置无关的边界矩形。

示例

基本

这个简单的示例检索表示简单 <div> 元素边界客户端矩形的 DOMRect 对象,并在其下方打印出其属性。

html
<div></div>
css
div {
  width: 400px;
  height: 200px;
  padding: 20px;
  margin: 50px auto;
  background: purple;
}
js
let elem = document.querySelector("div");
let rect = elem.getBoundingClientRect();
for (const key in rect) {
  if (typeof rect[key] !== "function") {
    let para = document.createElement("p");
    para.textContent = `${key} : ${rect[key]}`;
    document.body.appendChild(para);
  }
}

请注意 width/height 如何等于其 width/height + padding

另请注意,x/lefty/toprightbottom 的值如何等于视口相关边缘到该元素一侧的绝对距离。

滚动

此示例演示了在滚动文档时边界客户端矩形如何变化。

html
<div id="example"></div>
<div id="controls"></div>
css
div#example {
  width: 400px;
  height: 200px;
  padding: 20px;
  margin: 50px auto;
  background: purple;
}

body {
  padding-bottom: 1000px;
}
p {
  margin: 0;
}
js
function update() {
  const container = document.getElementById("controls");
  const elem = document.getElementById("example");
  const rect = elem.getBoundingClientRect();

  container.textContent = "";
  for (const key in rect) {
    if (typeof rect[key] !== "function") {
      let para = document.createElement("p");
      para.textContent = `${key} : ${rect[key]}`;
      container.appendChild(para);
    }
  }
}

document.addEventListener("scroll", update);
update();

规范

规范
CSSOM 视图模块
# dom-element-getboundingclientrect

浏览器兼容性

另见