← 📐 CSS Box Alignment · 一套对齐属性,横跨所有布局 / start / flex-start / self-start:看起来都是「靠起点」,起点却各不相同 待审核 2 / 6
keywords · 参照系

start / flex-start / self-start:看起来都是「靠起点」,起点却各不相同

positional 关键字看着像近义词,关键差别在**「起点」以谁为参照**。start / end 参照对齐容器的书写方向;self-start / self-end 参照对齐对象自身的书写方向;flex-start / flex-end 参照 flex-direction 定义的主轴方向(仅 Flex 有意义);left / right 则是物理方向,不随任何书写模式变化。单看 LTR、不翻转时它们恰好重合,所以易被当成同义词——本页特意把书写方向 / flex 方向掰开,让它们分道扬镳

一句话区分: start = 跟容器的流向;self-start = 跟自己的流向;flex-start = 跟 flex 方向;left = 跟物理屏幕。后三者都是为了在某个特定参照下,表达「不被默认流向带着走」。

1 · 分歧一:flex-direction 翻转时,flex-start ≠ start

下面是个 justify-content 的 Flex 容器。把 flex-direction 切到 row-reverse:主轴起点 main-start 跑到了右边,于是 flex-start 把项推到右、flex-end 推到左;而 start 始终跟容器书写方向(LTR 下永远靠左)、left 永远靠物理左。再把容器 direction 切到 rtl:start 翻到右、left 仍在左。逐一切换关键字,看每个值实际把项推到了哪个物理侧。

为什么会这样: flex-start 锚定的是 flex-direction 推导出的 main-start 边——翻转方向就翻转它;start 锚定的是容器 writing-mode / direction 推导出的行内起点,与 flex-direction 无关。所以「想跟着 flex 流向走」用 flex-start,「想跟着文字阅读方向走」用 start。在非 Flex 布局里 flex-start 会被当作 start 处理。

2 · 分歧二:对象自身书写方向不同,self-start ≠ start

下面是个 justify-items 的 Grid 容器(LTR),两个对象的自身 direction 不同:上 ltr、下 rtl。选 start 时两者都靠容器起点(左);切到 self-start,LTR 对象仍靠左、RTL 对象却靠到右边——因为它参照的是自己的行内起点。left / right 则两者都钉在同一物理侧。

3 · 四组关键字对照

center 居中、与方向无关;块轴(align-*)不接受 left / right
关键字 参照系 属于 翻转时跟谁走
start / end 对齐容器的 writing-mode + direction *-content / *-items / *-self 容器 direction
self-start / self-end 对齐对象自身的 writing-mode + direction *-items / *-self(单项才有「自己」) 对象自己的 direction
flex-start / flex-end flex-direction 推导的 main/cross-start Flex 语境(其余模式当作 start / end flex-direction
left / right 物理方向(屏幕左右) 行内轴(justify-*);块轴上当 start 谁都不跟,恒定

选哪个? 绝大多数场景该用流向相对start / end——它能让布局自动适配 LTR / RTL / 竖排,这正是 Box Alignment 全程用逻辑方向而非物理方向的初衷。只有在「必须钉死物理侧」(如某个图标永远在屏幕右下)时才用 left / right;flex-start 多数时候与 start 等效,只在你刻意翻转 flex-direction 又想跟随翻转时才有区别。