前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
首页程序员面试题库writing-mode 块轴方向 margin 百分比
CSS盒模型与排版

文字改成竖排以后,外边距合并和百分比宽度还按原来的规则算吗?

会变,但只有 writing-mode 会。竖排时块轴变成水平方向,块从右往左排,合并的是左右外边距。direction 只改变一行文字从左往右还是从右往左,块轴还是竖直的,外边距合并照旧发生在上下。

前端进阶之旅 · 一题精讲更新于 2026.09.29
CSS#盒模型与排版
先看核心答案读代码示例
理解线索

两根轴和两个属性

  1. 块轴块一个接一个堆叠的方向,横排时是从上到下
  2. 行内轴一行文字排列的方向,横排时是从左到右
  3. writing-mode 与 direction前者决定块轴是竖的还是横的,后者只翻转行内轴的起止

竖排之后 width 管的是块方向的尺寸,它的 auto 不再是填满,而是由内容撑开,和横排时的 height: auto 一样。

核心回答

先记住这个答案

块级排版有两根轴。块轴是块一个接一个堆叠的方向,行内轴是一行文字排列的方向。横排时块轴从上到下,行内轴从左到右。外边距合并、宽度填满这些规则,本来就是按轴定义的:外边距沿块轴合并,auto 尺寸沿行内轴填满。所以 writing-mode: vertical-rl 把块轴转成从右到左以后,合并的就变成左右外边距,填满父容器的变成高度。direction: rtl 只把行内轴从左往右翻成从右往左,块轴没动,上下外边距照样合并。

  • 块轴是块堆叠的方向,行内轴是文字排列的方向
  • 书写模式与文本方向分工不同
  • 外边距合并永远沿块轴发生
  • width 是物理属性,竖排后它变成块方向的尺寸

竖排后合并的是左右外边距

把一个容器设成竖排,里面放两个块,给它们设左右外边距。

vertical-rl 下的两个块HTML
<style>
  .box { writing-mode: vertical-rl; height: 200px; }
  .a { margin-left: 20px; }  /* 竖排时块从右往左排,.a 在右边 */
  .b { margin-right: 30px; } /* .b 在 .a 左边 */
  /* 两块之间的距离是 30px,不是 50px:左右外边距合并了 */
</style>

<div class="box">
  <p class="a">第一段竖排文字</p>
  <p class="b">第二段竖排文字</p>
</div>

vertical-rl 里块从右往左堆叠,.a 的左外边距和 .b 的右外边距挨在一起,就像横排时上一个块的 margin-bottom 碰到下一个块的 margin-top,于是合并成两者中较大的 30px。反过来,这时 .a 和 .b 的上下外边距各算各的,不再合并。 p 默认带的是 margin-block 方向的外边距,也就是逻辑属性。竖排时它自动落到左右两侧,所以默认样式下段落之间的间距看起来和横排一样。

direction 为什么不影响合并

direction 的作用范围很小:它决定行内轴从哪一头开始,也就是文字、行内元素从左往右还是从右往左排,另外影响表格列的顺序和 text-align: start 落在哪边。块轴依然是从上到下。

所以阿拉伯语、希伯来语页面设了 direction: rtl,段落之间的上下外边距照样合并。变化的是行内方向的逻辑属性:margin-inline-start 在 ltr 下是左外边距,在 rtl 下就变成右外边距。

物理属性和逻辑属性
margin-left、width 这类是物理属性,永远指屏幕上的某个方向,不跟着书写方向转。margin-inline-start、inline-size、block-size 是逻辑属性,按当前的轴来解释。做多语言、要支持竖排的组件,用逻辑属性写一遍,切换 writing-mode 和 direction 时样式会自动跟着转。

百分比和 auto 宽度怎么变

width 是物理属性,它的百分比永远相对包含块的宽度,这一点不会因为竖排而改变。变的是它在布局里的角色。

横排时 width 是行内方向的尺寸,块级元素的 width: auto 会填满父容器。竖排时 width 变成块方向的尺寸,auto 不再填满,而是由内容撑开,填满父容器的变成了 height。所以横排里那些关于 height: 100% 不生效的问题,竖排时会换到 width 上出现:包含块的宽度如果也是由内容决定的,百分比宽度可能算不出来。

外边距和内边距的百分比,CSS2 规定一律相对包含块的宽度。书写模式规范把它改成相对包含块的行内尺寸,竖排时就是相对高度。这一条各浏览器的实现要以实测为准,项目里尽量不要依赖竖排下的百分比外边距。

回答前,多想一步

容易答错的地方

以为 direction: rtl 也会转块轴
direction 只翻转行内方向。想让块从左往右或从右往左横着排,要用 writing-mode。
以为外边距合并永远只发生在上下
合并是沿块轴发生的。横排时块轴竖直,所以是上下;竖排时块轴水平,就是左右。
以为竖排后 width: auto 还会填满
竖排时填满父容器的是行内方向,也就是高度。width 这时由内容决定,要固定宽度得显式写值或用 block-size。
试着用自己的话回答

面试官还会怎么问?

做 RTL 适配时,样式要怎么改?

先把 margin-left、padding-right、left 这类物理属性换成 margin-inline-start、padding-inline-end、inset-inline-start。然后在根元素上切换 dir="rtl",布局会自动镜像,不用再维护一份 RTL 样式表。

父元素横排、子元素竖排时,外边距还合并吗?

父子块轴互相垂直,这种情况叫正交流。规范规定,书写模式和父元素不同的块会自动建立新的块格式化上下文,也就是 BFC,所以它和父元素之间的外边距不会合并。它和同样横着排的兄弟之间,上下外边距还是照常合并。

Flex 布局和 writing-mode 有什么关系?

flex-direction: row 的「行」指的是行内轴,不是屏幕上的水平方向。竖排容器里写 row,子项会从上往下排。Grid 的行列也是按逻辑方向定义的。

从一道题,走向一组知识

把知识连起来

层叠与选择器

all: unset 和 all: revert 有什么不同,重置后元素会变成什么样?

all 不重置 direction,改 writing-mode 和 direction 时要知道这个例外。

层叠与选择器

在 @media 里面写 @layer,层的优先级会变吗?

在 @media 里按屏幕宽度切换 writing-mode 这类覆盖样式时,放进哪个 @layer 决定了谁优先。

参考资料

  • writing-mode - MDN
  • CSS logical properties and values - MDN

示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。

本题目录
  1. 先记住这个答案
  2. 竖排后合并的是左右外边距
  3. direction 为什么不影响合并
  4. 百分比和 auto 宽度怎么变
  5. 容易答错的地方
  6. 面试官还会怎么问
  7. 把知识连起来
读懂,再试着讲出来

先看核心答案,再读代码。最后展开追问,检查自己有没有遗漏边界。

试着回答追问
浏览全部面试题理解原理,也关注真实的使用场景。回到顶部 ↑