getComputedStyle 和 getBoundingClientRect

246 阅读3分钟

在DOM操作中,getComputedStyle 和 getBoundingClientRect 是两个常用的方法,用于获取元素的几何属性和样式信息。下面详细介绍这两个方法及其使用方式。

getComputedStyle

getComputedStyle 方法返回一个对象,该对象包含元素的所有计算样式(即最终应用的样式,包括浏览器默认样式、外部样式表、内联样式等)。它通常用于获取元素的具体样式值。带单位px

使用方式

let element = document.getElementById('myElement');
let computedStyle = window.getComputedStyle(element);

常用属性

  • width / height: 元素的宽度和高度,包括内边距(padding)和边框(border),但不包括外边距(margin)。
  • paddingTop / paddingRight / paddingBottom / paddingLeft: 元素的内边距。
  • marginTop / marginRight / marginBottom / marginLeft: 元素的外边距。
  • borderTopWidth / borderRightWidth / borderBottomWidth / borderLeftWidth: 元素的边框宽度。
  • display: 元素的显示方式(如 blockinlinenone 等)。
  • position: 元素的定位方式(如 staticrelativeabsolutefixed 等)。
  • zIndex: 元素的堆叠顺序。

示例

let element = document.getElementById('myElement');
let computedStyle = window.getComputedStyle(element);

console.log('Width:', computedStyle.width); // 输出元素的宽度
console.log('Padding Top:', computedStyle.paddingTop); // 输出元素的上内边距
console.log('Display:', computedStyle.display); // 输出元素的显示方式

是否会触发回流

部分属性会触发回流:如果读取的属性与布局相关(如 widthheightmarginpaddingtop 等),浏览器可能需要先执行回流(确保布局最新)才能返回准确值。

其他属性可能不触发:如果读取的属性仅与颜色、透明度等非布局相关(如 coloropacity),则可能仅触发重绘,甚至不触发任何操作(若数据已缓存)。

浏览器优化:现代浏览器会尽量合并回流操作,但连续读取多个布局相关属性时,可能触发一次回流。

getBoundingClientRect

getBoundingClientRect 方法返回一个 DOMRect 对象,该对象包含元素的大小及其相对于视口的位置信息。不带单位

使用方式:

let element = document.getElementById('myElement');
let rect = element.getBoundingClientRect();

DOMRect 对象的属性

  • x / y: 元素左上角相对于视口的X和Y坐标。
  • width / height: 元素的宽度和高度,包括内边距和边框。
  • top: 元素上边界相对于视口顶部的距离。
  • right: 元素右边界相对于视口左侧的距离。
  • bottom: 元素下边界相对于视口顶部的距离。
  • left: 元素左边界相对于视口左侧的距离。

示例

let element = document.getElementById('myElement');
let rect = element.getBoundingClientRect();

console.log('X:', rect.x); // 输出元素左上角的X坐标
console.log('Y:', rect.y); // 输出元素左上角的Y坐标
console.log('Width:', rect.width); // 输出元素的宽度
console.log('Height:', rect.height); // 输出元素的高度
console.log('Top:', rect.top); // 输出元素上边界相对于视口顶部的距离
console.log('Left:', rect.left); // 输出元素左边界相对于视口左侧的距离

是否会触发回流

几乎总会触发回流:因为它需要返回最新的布局信息(如元素的位置和尺寸)。如果浏览器尚未完成布局计算(例如,在修改样式后未强制布局前),调用此方法会强制浏览器立即执行回流,以提供准确结果。

例外情况:如果布局信息已经是最新的(例如,在连续读取多次且无样式修改的情况下),可能不会重复触发。

区别与适用场景:

  • getComputedStyle 主要用于获取元素的计算样式,适合需要获取具体样式值(如颜色、字体大小等)的场景。
  • getBoundingClientRect 主要用于获取元素的几何信息(如位置和大小),适合需要计算元素在页面中的位置或进行布局操作的场景。

总结

  • getComputedStyle 提供了元素的样式信息,适用于需要获取样式属性的场景。
  • getBoundingClientRect 提供了元素的几何信息,适用于需要获取元素位置和大小的场景。