先记住这个答案
不要看到 justify-content: flex-start 就说“靠左”。先看 flex-direction 的取值。row 沿行内方向,column 沿块方向,带 -reverse 的值再交换起止。再看 direction 与 writing-mode,它们决定逻辑轴落在屏幕哪一边。例如 RTL 的横向 row,主轴起点通常就在右侧。
row沿行内方向column沿块方向-reverse交换主轴起止- 主轴起点不固定是左侧
RTL 导航里起点为何换边
英文界面通常是从左到右写,flex-direction: row 的主轴从左到右,justify-content: flex-start 看起来就是左对齐。切到 RTL 语言后,同样的 row 从右侧开始;如果再设 row-reverse,起点又换到左侧。写国际化布局时,用主轴起止和逻辑属性思考,比把各个方向写死更稳。
.nav {
display: flex;
flex-direction: row;
justify-content: flex-start; /* 对齐 main-start */
}
.nav[dir="rtl"] { direction: rtl; /* row 的起点转到右侧 */ }给容器切换 RTL 后,row 的主轴起点会移到右侧。
主轴起止由逻辑方向确定
交叉轴始终垂直于主轴,交叉轴起点主要由书写模式决定,flex-wrap: wrap-reverse 则会交换交叉轴两端。flex-direction: column 在常见横排书写模式下通常自上而下,但在竖排书写模式中,块方向可能从右向左。row-reverse 并不会重排 DOM;只改变摆放方向,因此可访问性顺序仍要从标记结构考虑。
例如容器是 flex-direction: row-reverse 且页面仍是 LTR,主轴起点就从右侧变为左侧;如果再切成 RTL,起点又会变化。justify-content: flex-start 始终跟主轴起点走,不应在设计稿里直接翻译为 left。align-items 则管交叉轴,方向由主轴与书写模式共同确定。排查“为什么靠错边”时,先确认这两条轴,再看容器是否还有正向剩余空间;没有余量时,换对齐值也不一定看得出差异。
容易答错的地方
- 把
row等同于屏幕从左到右 row指行内方向;RTL 或竖排书写模式会改变这个方向。- 认为
-reverse会改变键盘顺序 - 反向只影响视觉布局,焦点和阅读仍以 DOM 顺序为基础。
面试官还会怎么问?
column-reverse 的起点在哪里?
先找当前书写模式的块方向,再把起点和终点交换。常见横排模式下,它通常从容器下方开始。
justify-content: flex-end 对齐哪一端?
沿主轴对齐到 main-end;物理位置由 flex-direction、writing-mode 与 direction 一起决定。
怎样避免 RTL 页面到处写 left 和 right?
布局和间距优先考虑逻辑方向,例如 margin-inline-start,再在必要时处理确实具有物理方向含义的图标。
参考资料
示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。