我们之所以要在这里探讨书写模式和方向,是因为目前为止我们已经了解了很多与屏幕的物理显示密切相关的很多属性,而书写模式和方向在水平书写模式下会很有意义。
让我们再来看看那两个盒子——一个用horizontal-tb设定了书写模式,一个用vertical-rl设定了书写模式。我为这两个盒子分别设定了宽度( width)。可以看到,当盒子处于纵向书写模式下时,宽度也发生了变化,从而导致文本超出了盒子的范围。
.box {
width: 150px;
}
.horizontal {
writing-mode: horizontal-tb;
}
.vertical {
writing-mode: vertical-rl;
}
Heading
A paragraph.
These boxes have a width.
Heading
A paragraph.
These boxes have a width.
通过这一些列调整,我们想要的实际上是使宽和高随着书写模式一起变化。当处于纵向书写模式之下时,我们希望盒子可以向横向模式下一样得到拓宽。
为了更容易实现这样的转变,CSS最近开发了一系列映射属性。这些属性用逻辑(logical)和相对变化(flow relative)代替了像宽width和高height一样的物理属性。
横向书写模式下,映射到width的属性被称作内联尺寸(inline-size)——内联维度的尺寸。而映射height的属性被称为块级尺寸(block-size),这是块级维度的尺寸。下面的例子展示了替换掉width的inline-size是如何生效的。
.box {
inline-size: 200px;
block-size: 300px
}
.horizontal {
writing-mode: horizontal-tb;
}
.vertical {
writing-mode: vertical-rl;
}
Heading
A paragraph. Demonstrating Writing Modes in CSS.
These boxes have inline-size.
Heading
A paragraph. Demonstrating Writing Modes in CSS.
These boxes have inline-size.
逻辑外边距、边框和内边距属性
我们在前面两节中学习了CSS的盒模型和CSS边框。在外边距、边框和内边距属性中,你会发现许多物理属性,例如 margin-top、 padding-left和 border-bottom。就像width和height有映射,这些属性也有相应的映射。
margin-top属性的映射是margin-block-start——总是指向块级维度开始处的边距。
padding-left属性映射到 padding-inline-start,这是应用到内联开始方向(这是该书写模式文本开始的地方)上的内边距。border-bottom属性映射到的是border-block-end,也就是块级维度结尾处的边框。
下面是物理和逻辑属性之间的对比。
如果你用writing-mode把盒子.box的书写模式改为vertical-rl,你将会看到尽管盒子的物理方向变了,盒子的物理属性仍然没变,然而逻辑属性会随着书写模式一起改变。
你还可以看到,二级标题
(en-US)有一个黑色的底部边框border-bottom。你知道如何使得底部边框无论在那种书写模式下都位于文本的下方吗?
.box {
inline-size: 200px;
writing-mode: horizontal-tb;
}
.logical {
margin-block-start: 20px;
padding-inline-end: 2em;
padding-block-start: 2px;
border-block-start: 5px solid pink;
border-inline-end: 10px dotted rebeccapurple;
border-block-end: 1em double orange;
border-inline-start: 1px solid black;
}
.physical {
margin-top: 20px;
padding-right: 2em;
padding-top: 2px;
border-top: 5px solid pink;
border-right: 10px dotted rebeccapurple;
border-bottom: 1em double orange;
border-left: 1px solid black;
}
h2 {
border-bottom: 5px solid black;
}
Physical Properties
A paragraph. Demonstrating Logical Properties in CSS.
Logical Properties
A paragraph. Demonstrating Logical Properties in CSS.
对于每一个普通边距,都有许多属性可以参考,你可以在MDN页面(Logical Properties and Values)查看所有映射属性。
.box {
inline-size: 200px;
writing-mode: horitical-tb;
}
.box1 {
inline-size: 200px;
writing-mode: vertical-rl;
}
.logical {
margin-block-start: 20px;
padding-inline-end: 2em;
padding-block-start: 2px;
border-block-start: 5px solid pink;
border-inline-end: 10px dotted rebeccapurple;
border-block-end: 1em double orange;
border-inline-start: 1px solid black;
}
.physical {
margin-top: 20px;
padding-right: 2em;
padding-top: 2px;
border-top: 5px solid pink;
border-right: 10px dotted rebeccapurple;
border-bottom: 1em double orange;
border-left: 1px solid black;
}
h2 {
border-bottom: 5px solid black;
border-block-end: 5px solid black;
}
Physical Properties
A paragraph. Demonstrating Logical Properties in CSS.
Logical Properties
A paragraph. Demonstrating Logical Properties in CSS.
逻辑值
目前为止我们看到的都是逻辑属性的名称。还有一些属性的取值是一些物理值(如top、right、bottom和left)。这些值同样拥有逻辑值映射(block-start、inline-end、block-end和inline-start)。
例如,你可以将一张图片移到左边,并使文本环绕图片。你可以将left替换为inline-start ,就像下面的例子中一样。
将这个例子的书写模式改为vertical-rl,看看图片会发生什么。将inline-start改为inline-end来改变图片的移动。
.box {
inline-size: 200px;
writing-mode: horizontal-tb;
}
img{
float: inline-start;
margin-inline-end: 10px;
margin-block-end: 10px;
}

This box uses logical properties. The star image has been floated inline-start, it also has a margin on the inline-end and block-end.
之类,我们同样使用逻辑边距值来保证在任何书写模式下边距的位置都是对的。
注:float的逻辑值暂时只有Firefox和Firefox for Android支持,上面的例子可能无法生效。
应该使用物理属性还是逻辑属性呢?
逻辑属性是在物理属性之后出现的,因而最近才开始在浏览器中应用。你可以通过查看MDN的属性页面来了解浏览器对逻辑属性的支持情况。如果你并没有应用多种书写模式,那么现在你可能更倾向于使用物理属性,因为这些在你使用弹性布局和网格布局时非常有用。