CSS 与布局 / CSS Box Alignment · 一套对齐属性横跨所有布局 / positional 关键字的参照系 待审核 2 / 6
keywords · 参照系

positional 关键字的参照系

positional 关键字看着像近义词,关键差别在起点以谁为参照。startend 参照对齐容器的书写方向;self-startself-end 参照对齐对象自身的书写方向;flex-startflex-end 参照 flex-direction 定义的主轴方向,仅在 Flex 中有意义;leftright 是物理方向,不随任何书写模式变化。在 LTR 且不翻转时它们恰好重合,因而易被当成同义词。本页把书写方向与 flex-direction 掰开,让它们分道扬镳。

1 · flex-direction 翻转下的分歧

把一个 justify-content 的 Flex 容器切到 row-reverse,主轴起点跑到右边,于是 flex-start 把项推到右、flex-end 推到左;而 start 始终跟容器书写方向,LTR 下永远靠左,left 永远靠物理左。再把容器 direction 切到 rtlstart 翻到右而 left 仍在左。

图 1-1 · 各 positional 关键字在 flex-directiondirection 组合下的实际落点。可逐一切换关键字,观察每个值把项推到了哪个物理侧。

警示 · flex-start 锚定的是 flex-direction 推导出的 main-start 边,翻转方向即翻转它;start 锚定的是容器 writing-modedirection 推导出的行内起点,与 flex-direction 无关。想跟着 flex 流向走用 flex-start,想跟着文字阅读方向走用 start。在非 Flex 布局里 flex-startstart 处理。

2 · 对象自身书写方向下的分歧

一个 LTR 的 justify-items Grid 容器里放两个对象,其自身 direction 一为 ltr、一为 rtl。取 start 时两者都靠容器起点即左侧;切到 self-start 时 LTR 对象仍靠左而 RTL 对象靠到右边,因为它参照的是自己的行内起点。leftright 则把两者都钉在同一物理侧。

图 2-1 · 自身 direction 不同的两个对象在 startself-start 下的落点差异。

3 · 四组关键字对照

center 居中、与方向无关;块轴(align-*)不接受 leftright,遇到时按 start 处理。
关键字 参照系 属于 翻转时跟谁走
start / end 对齐容器的 writing-modedirection *-content / *-items / *-self 容器 direction
self-start / self-end 对齐对象自身的 writing-modedirection *-items / *-self(单项才有「自己」) 对象自己的 direction
flex-start / flex-end flex-direction 推导的 main-start 与 cross-start Flex 语境,其余模式按 start / end 处理 flex-direction
left / right 物理方向 仅行内轴 justify-*,块轴上按 start 谁都不跟,恒定
图 3-1 · 上表各关键字对应的声明写法与渲染结果对照。

建议 · 绝大多数场景应当用流向相对的 startend,它能让布局自动适配 LTR、RTL 与竖排,这正是 Box Alignment 全程用逻辑方向而非物理方向的初衷。只有必须钉死物理侧时才用 leftright,例如某个图标永远要在屏幕右下。flex-start 多数时候与 start 等效,只在刻意翻转 flex-direction 又想跟随翻转时才有区别。