从内到外四层。width 只描述哪一层,取决于 box-sizing;margin 在盒子外面,不属于盒子本身但参与布局占位。
/* 现代项目第一行就写这个,全站统一 */
*, *::before, *::after { box-sizing: border-box; }
为什么它更好用:width: 100% 加个内边距不会溢出父容器;算栅格列宽时不用再减 padding。代价是 width 不再等于内容宽,需要用 min-width 保内容下限。
上/下 margin 各 16px
两个相邻块级元素之间的实际间距 = 较大那个,不是相加
| 现象 | 规则 |
|---|---|
| 兄弟之间 | 相邻的垂直 margin 合并为最大值(正+正取大;负+负取绝对值大;正+负相加) |
| 父与首个子 | 父元素没有 padding-top/border-top 时,子的 margin-top 会「穿透」到父身上,把整个父往下推 |
| 谁不塌陷 | flex/grid 容器的子项、float、绝对定位、inline-block、overflow 非 visible 的 BFC 容器 |
这就是为什么老布局里到处都是「加个 overflow: hidden」的玄学修复——它在创建 BFC。今天用 Flex 的 gap 可以从根上绕开塌陷,不必理解合并规则也能排好间距。
margin-top: 24px —— 绿色父容器整体被推下去了,父与子之间并没有 24px 白缝margin-left: 60pxmargin-left: -24px 让元素探出父容器).overlap li { margin-left: -12px; } /* 头像列表相互叠压的常见写法 */
/* 坑:负 margin 会让内容跑到容器外,窄屏直接溢出出现横向滚动条 */
padding-bottom 或改用 gap。