盒子模型计算汇总
一、盒模型的分类
二、标准模型与 IE 模型的区别
两者的宽高计算方式不同:
- 标准模型计算的宽高以
content
的宽高为准 - IE 模型计算的宽高以
content + padding + border
的总宽高为准
应用场景
场景一
一般情况下,给容器设置宽高并加上边框后,渲染到页面中的容器真实宽高会叠加上边框厚度,此时就需要转为 IE 模型,将所谓的“外边框”
转为“内边框”
,这样容器设置的宽高才是真实宽高。
场景二
一般情况下,给容器设置宽高并加上内边距(padding)后,渲染到页面中的容器会被内边距撑大,真实宽高会叠加上内边距,此时也需要转为 IE 模型,将设置的内边距“内部消化”
,这样容器设置的宽高才是真实宽高。
三、标准模型与 IE 模型的设置
1、标准模型(默认)
box-sizing: content-box;
2、IE 模型
box-sizing: border-box;
四、盒模型宽高的计算
1、计算内容宽高(结果带px)
dom.style.width
可获取容器设置的宽度,但仅限于行内样式。
dom.currentStyle.width
可获取行内样式或内外样式表设置的宽度,但仅支持 IE。
window.getComputedStyle(dom).width
可获取行内样式或内外样式表设置的宽度,兼容性好。
2、计算真实宽度(结果不带px)
dom.clientWidth
标准模型:内容 + 内边距
IE 模型:内容 - 边框
dom.offsetWidth
标准模型:内容 + 内边距 + 边框
IE 模型:内容
dom.getBoundingClientRect().width
标准模型:内容 + 内边距 + 边框
IE 模型:内容
3、应用示例
3-1、标准模型计算
contentBox.style.width // ''(这里没设行内样式)
contentBox.currentStyle.width // 100px(仅限 IE)
window.getComputedStyle(contentBox).width // 100px
contentBox.clientWidth // 120
contentBox.offsetWidth // 122
contentBox.getBoundingClientRect().width // 122
3-2、IE 模型计算
borderBox.style.width // ''(这里没设行内样式)
borderBox.currentStyle.width // 100px(仅限 IE)
window.getComputedStyle(borderBox).width // 100px
borderBox.clientWidth // 98
borderBox.offsetWidth // 100
borderBox.getBoundingClientRect().width // 100