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 · 四组关键字对照
| 关键字 | 参照系 | 属于 | 翻转时跟谁走 |
|---|---|---|---|
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 又想跟随翻转时才有区别。