JS设置获取盒模型对应宽高的五种方式详解

2,494 阅读3分钟

JS设置获取盒模型对应宽高有五种方式,分别是

1) dom.style.width/height【只能取到内联元素】
2) dom.currentStyle.width/height【只有IE支持】
3) document.getComputedStyle(dom,null).width/height  
4) dom.getBoundingClientRect().width/height 
5) dom.offsetWidth/offsetHeight【常用】

下面来具体说说

//注:如果下面示例未写html和css,说明与此处相同
.box {
    width: 100px;
    height: 100px;
    border: 10px solid #CC9966;
    padding: 30px;
    margin: 40px;
    background: #66FFFF;
}
<div class="box">Axjy</div>

dom.style.width/height

通过dom节点的style样式获取,只能取到行内样式的宽和高,style 标签中和 link 外链的样式取不到

.box{...}
----------------------------

let targetDom = document.querySelector('.box');
let width = targetDom.style.width;
let height = targetDom.style.height;

console.log("width",width)
console.log("height",height)

使用类设置宽高时

获取的宽高为空

5.png

在行内设置宽高时

获取的是行内设置的宽高

6.png

element.style.xxx 这种只能取得内嵌样式的属性,获取样式能读能写

dom.currentStyle.width/height

取到的是最终渲染后的宽和高,如果有设置宽高,则不论哪种盒模型获取到的都是设置的宽高,只有IE兼容

.box {...同上}
----------------------------

let targetDom = document.querySelector('.box');
let width = targetDom.currentStyle.width;
let height = targetDom.currentStyle.height;

element.currentStyle[xxx] 可以取得内部和外部样式,但是只兼容ie浏览器,获取的样式只能读

document.getComputedStyle(dom,null).width/height

取到的是最终渲染后的宽和高,如果有设置宽高,则不论哪种盒模型获取到的都是设置的宽高,和currentStyle相同,但是比 element.currentStyle[xxx]兼容性更好,IE9 以上支持。

getComputedStyle()方法,

  • 第一个参数:取得计算样式的元素;
  • 第二个参数:一个伪元素字符串(例如“:after”),如果不需要伪元素信息,默认为null;

image.png

.box {...同上}
----------------------------

let targetDom = document.querySelector('.box');
let width =  window.getComputedStyle(targetDom).width
let height = window.getComputedStyle(targetDom).height

console.log("width",width)
console.log("height",height)

7.png

『小扩展』

如果box类不设置宽高,而是由内容自动撑开;

标准盒模型通过getComputedStyle获取到的宽高是content的值;

8.png

9.png

IE盒模型通过getComputedStyle获取到的宽高 = border + padding + content,不包括外边距;

10.png

11.png

dom.getBoundingClientRect().width/height

得到渲染后的宽和高,大多浏览器支持。IE9以上支持。

.box {...同上}
----------------------------
let targetDom = document.querySelector('.box');
let width = targetDom.getBoundingClientRect().width;
let height = targetDom.getBoundingClientRect().height
console.log('width',width)
console.log('height',height)

标准模型,宽高设置为100的结果,额外包括了padding和border的值;

12.png

IE模型,宽高设置为100的结果;

13.png

『小扩展』

如果box类不设置宽高,而是由内容自动撑开;

不论是哪种模型,获取到的都是(border + padding + content),不包括外边距;

14.png

getBoundingClientRect还可以取到相对于视窗的上下左右的距离(用于获取某个元素相对于视窗的位置集合)。

18.png

dom.offsetWidth/offsetHeight(常用)

获取到的东西最多,包括高度(宽度)、内边距和边框,不包括外边距。最常用,兼容性最好。

.box {...同上}
----------------------------
let targetDom = document.querySelector('.box');
let width = targetDom.offsetWidth;
let height = targetDom.offsetHeight;
console.log('width',width)
console.log('height',height)

标准模型,宽高设置为100的结果;

15.png

IE模型,宽高设置为100的结果;

16.png

『小扩展』

如果box类不设置宽高,而是由内容自动撑开;

不论是哪种模型,获取到的都是(border + padding + content),不包括margin;

17.png

从上面可以看出,dom.getBoundingClientRect().width/height 和 dom.offsetWidth/offsetHeight 结果是一样的


🌺以上内容如果错误或其他观点,欢迎在评论区留言!🌺

彻底搞懂CSS里的BFC

CSS 框模型

CSS 基础框盒模型介绍