CSS 盒模型笔记

654 阅读3分钟

CSS 盒模型

什么是 CSS 盒模型?

CSS 盒模型决定了浏览器渲染引擎以何种标准对标签进行渲染,我们可以通过 box-sizing 控制容器内部的标签的渲染规则,我们也可以通过判断某个标签的 border、padding 的出现位置是否被计算入元素本身 content 的宽高中,了解这个标签的盒模型标准是什么。

常用的盒模型标准

  • IE 盒模型 - content-box - 怪异盒模型
  • W3C 盒模型 - border-box - 标准盒模型

IE 盒模型

IE 9 之后的 IE 浏览器默认采用 W3C 盒模型标准; 在 IE 盒模型标准下,浏览器对标签元素的宽高渲染规则如下

  • 标签的占用宽度 = content 内容宽度 + 左右 padding + 左右 border
  • 标签的占用高度为 = content 内容高度 + 上下 padding + 上下 border

因为 margin 是控制标签元素的位置,并不影响元素的宽高,所以这里没有加上,其实一个完整的盒模型包括: content 内容 + padding 内边距 + border 边框 + margin 外边距;

W3C 盒模型

W3C 盒模型是 W3C 官方推荐使用的盒模型,它的特点是 paddingborder 的数值会被计算到 content 中,也就是说,我们给一个标签元素添加 padding 或者 margin ,元素在页面中的宽高并不会增加,但内容位置会被挤压; 在 W3C 盒模型标准下,浏览器对标签宽高的渲染规则如下

  • 标签占用的宽度 = content 内容宽度
  • 标签占用的高度 = content 内容高度

举个栗子

IE 盒模型 ↓

<body>
    <style type="text/css">
        .red{
            box-sizing: content-box; /* 怪异盒模型 */
            width: 200px;
            height: 200px;
            padding: 50px;
            border: 10px solid #000;
            margin: 150px auto;
        }
    </style>

    <div class="red">这是内容</div>
</body>

这是效果 ↓

此时这个标签的实际宽高为:

  • 实际宽度 = content + padding-left +padding-right + border-left + border-right = 200 + 50 * 2 + 10 * 2 = 320
  • 实际高度 = content + padding-top +padding-bottom + border-top + border-bottom = 200 + 50 * 2 + 10 * 2 = 320

W3C 盒模型 ↓

<body>
    <style type="text/css">
        .red{
            box-sizing: border-box; /* 标准盒模型 */
            width: 200px;
            height: 200px;
            padding: 50px;
            border: 10px solid #000;
            margin: 150px auto;
        }
    </style>
    
    <div class="red">这是内容</div>
</body>

这是效果 ↓

我们可以看到,虽然我们给标签设置了 width: 200px; height: 200px ,但是因为我们设置了标准盒模型 box-sizing: border-box ,所以这个标签元素的内边距 paddingborder 被添加到了 content 中,该标签的实际宽高如下:

  • 实际宽度 = content + padding-left +padding-right + border-left + border-right = 80 + 50 * 2 + 10 * 2 = 200
  • 实际高度 = content + padding-top +padding-bottom + border-top + border-bottom = 80 + 50 * 2 + 10 * 2 = 200

content 变成 80 的原因是被 paddingborder 挤压了,计算公式如下:

  • content = 200 - 50 * 2 - 10 * 2 = 80

笔记不是很完善,以后补充