在 Block、绝对定位与表格中:对齐的「补丁」与历史遗产
Flex / Grid 把 Box Alignment 用得最充分,而块级、绝对定位、表格这三种老布局对它的支持是逐步补上的、且各有边界。本页梳理三件事:其一,align-content 如今可作用于普通 block 容器(块轴上摆放块级子元素,曾经只能靠 margin);其二,justify-self
/ align-self 对绝对定位盒子生效(在 inset 区域内定位,normal 默认拉伸);其三,表格单元基本不接受 Box Alignment,仍用 text-align + vertical-align 这套老机制。
1 · align-content 作用于普通 block 容器
一个定高的 display: block 容器,几个块级子元素高度之和小于容器 → 块轴上有剩余空间。过去这空间只能空在底部(或手动 margin 调),现在 align-content 能直接把这组子元素沿块轴整体摆放——无需改成 flex /
grid。下方横幅是对当前浏览器的实测结论;若显示不支持,演示里子元素将始终贴顶。
注意两点: 块容器只接受块轴的 align-content;justify-content(行内轴整组分配)不适用于 block 容器——想让单个块级盒子在行内轴上移动,要么用 margin-inline: auto,要么用下面的
justify-self。另外块容器的子元素在块轴上本就依次堆叠、彼此独立,故 align-items / align-self 对 in-flow 块级子元素不生效。
2 · 绝对定位:justify-self / align-self 在 inset 区域内定位
一个绝对定位盒子,其对齐容器是由 inset(top/right/bottom/left)圈出的矩形(此处 inset: 0 = 整个定位父级)。当盒子有固定尺寸、在该区域里有富余时,justify-self(行内)/ align-self(块)就能把它摆到某一侧或居中。normal
对非替换元素表现为 stretch(撑满该轴),所以下面默认能看到拉伸。
这替代了什么: 经典的「绝对定位居中」要写 left: 0; right: 0; top: 0; bottom: 0; margin: auto(四方 auto margin 吸收剩余空间)。有了对齐属性,等价写法是 inset: 0; place-self: center——意图更直白。stretch 这一项则正对应「inset: 0
且不设宽高时盒子撑满」的老行为。
3 · 表格单元:仍是 text-align + vertical-align 的天下
表格内部的盒子(table / tr / td)位置由表格算法决定,不接受 justify-self / align-self / justify-content 这些 Box Alignment 属性。单元格内容的对齐沿用更早的两个属性:行内方向用
text-align、块方向用 vertical-align(取 top / middle / bottom)。切换看效果。
对照记忆: 同样是「块轴居中」,Flex/Grid 写 align-items: center、表格单元写 vertical-align: middle、定高 block 容器写 align-content: center——三套语法对应三种布局模式下的同一意图。Box Alignment
的长远目标正是用一套属性收敛它们,只是表格因历史包袱仍停在旧机制。