用于外边距、边框和内边距的逻辑属性

CSS 逻辑属性和值模块为各种外边距、边框和内边距属性及其简写属性定义了流相对的映射。在本指南中,我们将探讨这些内容。

如果你查看逻辑属性和值模块,你可能会注意到该模块的属性列表非常长。这主要是因为外边距、边框和内边距的每个边都有四个普通属性值,再加上所有的简写属性值。

外边距、边框和内边距的映射

该模块详细说明了每个逻辑值到物理对应项的映射。下表展示了当 writing-modehorizontal-tb 且方向为从左到右时这些值的映射。因此,行内方向是水平的——从左到右——并且 margin-inline-start 等同于 margin-left

如果你使用 horizontal-tb 书写模式,但文本方向为从右到左,那么 margin-inline-start 将等同于 margin-right;而在垂直书写模式下,它将等同于使用 margin-top

逻辑属性 物理属性
border-block-end border-bottom
border-block-end-color border-bottom-color
border-block-end-style border-bottom-style
border-block-end-width border-bottom-width
border-block-start border-top
border-block-start-color border-top-color
border-block-start-style border-top-style
border-block-start-width border-top-width
border-inline-end border-right
border-inline-end-color border-right-color
border-inline-end-style border-right-style
border-inline-end-width border-right-width
border-inline-start border-left
border-inline-start-color border-left-color
border-inline-start-style border-left-style
border-inline-start-width border-left-width
border-start-start-radius border-top-left-radius
border-end-start-radius border-bottom-left-radius
border-start-end-radius border-top-right-radius
border-end-end-radius border-bottom-right-radius
margin-block-end margin-bottom
margin-block-start margin-top
margin-inline-end margin-right
margin-inline-start margin-left
padding-block-end padding-bottom
padding-block-start padding-top
padding-inline-end padding-right
padding-inline-start padding-left

还有一些额外的简写属性,这是因为我们可以同时指定盒子的块级或行内两边。这些简写属性没有物理等价物。

属性 用途
border-block 设置块级两边的 border-colorborder-styleborder-width
border-block-color 设置块级两边的 border-color
border-block-style 设置块级两边的 border-style
border-block-width 设置块级两边的 border-width
border-inline 设置行内两边的 border-color-style-width
border-inline-color 设置行内两边的 border-color
border-inline-style 设置行内两边的 border-style
border-inline-width 设置行内两边的 border-width
margin-block 设置所有的块级 margin
margin-inline 设置所有的行内 margin
padding-block 设置块级 padding
padding-inline 设置行内 padding

外边距示例

映射的外边距属性 margin-inline-startmargin-inline-endmargin-block-startmargin-inline-end 可以用来替代它们的物理对应项。

此示例中有两个盒子,每个边都有不同大小的外边距。为了让外边距更明显,我们增加了一个带边框的额外容器。

一个盒子使用物理属性,另一个使用逻辑属性。尝试将 direction 属性更改为 rtl,使盒子以从右到左的方向显示;第一个盒子的外边距将保持在原位,而第二个盒子在行内方向上的外边距将会交换位置。

还可以尝试将 writing-modehorizontal-tb 更改为 vertical-rl。注意第一个盒子的外边距如何保持在原位,而第二个盒子的外边距则会随文本方向而改变。

html
<div class="container">
  <div class="inner">
    <div class="physical box">
      margin-top: 5px<br />
      margin-right: 0<br />
      margin-bottom: 2em<br />
      margin-left: 50px
    </div>
  </div>
  <div class="inner">
    <div class="logical box">
      margin-block-start: 5px<br />
      margin-inline-end: 0<br />
      margin-block-end: 2em<br />
      margin-inline-start: 50px
    </div>
  </div>
</div>
css
.box {
  writing-mode: horizontal-tb;
  direction: ltr;
}

.physical {
  margin-top: 5px;
  margin-right: 0;
  margin-bottom: 2em;
  margin-left: 50px;
}

.logical {
  margin-block-start: 5px;
  margin-inline-end: 0;
  margin-block-end: 2em;
  margin-inline-start: 50px;
}

外边距简写

有一些简写属性可以同时指定行内两侧或块级两侧,它们分别是 margin-inlinemargin-block。每个属性接受两个值。第一个值将应用于该维度的起始边,第二个值应用于结束边。如果只设置一个值,它将应用于两边。

在水平书写模式下,此 CSS 将为盒子的顶部应用 5px 的外边距,为底部应用 10px 的外边距。

css
.box {
  margin-block: 5px 10px;
}

内边距示例

映射的内边距属性 padding-inline-startpadding-inline-endpadding-block-startpadding-inline-end 可以用来替代它们的物理对应项。

在此示例中,有两个盒子。一个设置了物理内边距属性,另一个使用逻辑内边距属性。当 writing-modehorizontal-tb 时,两个盒子看起来应该是一样的。

尝试将 direction 属性更改为 rtl,使盒子以从右到左的方向显示。第一个盒子的内边距将保持在原位,而第二个盒子在行内方向上的内边距将会交换位置。

你也可以尝试将 writing-modehorizontal-tb 更改为 vertical-rl。再次注意,第一个盒子的内边距如何保持在原位,而第二个盒子的内边距则会随文本方向而改变。

html
<div class="container">
  <div class="physical box">
    padding-top: 5px<br />
    padding-right: 0<br />
    padding-bottom: 2em<br />
    padding-left: 50px
  </div>

  <div class="logical box">
    padding-block-start: 5px<br />
    padding-inline-end: 0<br />
    padding-block-end: 2em<br />
    padding-inline-start: 50px
  </div>
</div>
css
.box {
  writing-mode: horizontal-tb;
  direction: ltr;
}

.physical {
  padding-top: 5px;
  padding-right: 0;
  padding-bottom: 2em;
  padding-left: 50px;
}

.logical {
  padding-block-start: 5px;
  padding-inline-end: 0;
  padding-block-end: 2em;
  padding-inline-start: 50px;
}

内边距简写

与外边距一样,内边距也有双值简写属性——padding-inlinepadding-block——它们分别允许你设置行内两个方向和块级两个方向的内边距。

在水平 writing-mode 下,此 CSS 将为盒子的顶部应用 5px 的内边距,为底部应用 10px 的内边距。

css
.box {
  padding-block: 5px 10px;
}

边框示例

边框属性是该模块看起来有如此多属性的主要原因,因为它为盒子每一边的边框颜色、宽度和样式提供了普通逻辑属性,以及一次性为每一边设置这三者的简写属性。与外边距和内边距一样,每个物理属性都有一个映射版本。

下面的演示使用了一些普通属性和三个简写属性值。与其他演示一样,尝试将 direction 属性更改为 rtl 以使盒子以从右到左的方向显示,或者将 writing-modehorizontal-tb 更改为 vertical-rl

html
<div class="container">
  <div class="physical box">Borders using physical properties.</div>
  <div class="logical box">Borders using logical properties.</div>
</div>
css
.box {
  writing-mode: horizontal-tb;
  direction: ltr;
}

.physical {
  border-top: 2px solid hotpink;
  border-right-style: dotted;
  border-right-color: goldenrod;
  border-right-width: 5px;
  border-bottom: 4px double black;
  border-left: none;
}

.logical {
  border-block-start: 2px solid hotpink;
  border-inline-end-style: dotted;
  border-inline-end-color: goldenrod;
  border-inline-end-width: 5px;
  border-block-end: 4px double black;
  border-inline-start: none;
}

边框简写

有一些双值简写属性可以设置块级或行内方向的宽度、样式和颜色,还有一些简写属性可以设置块级或行内方向的所有三个值。在水平书写模式下,下面的代码会为盒子的顶部和底部提供 2px 绿色实线边框,为左侧和右侧提供 4px 点状紫色边框。

css
.box {
  border-block: 2px solid green;
  border-inline-width: 4px;
  border-inline-style: dotted;
  border-inline-color: rebeccapurple;
}

流相对的 border-radius 属性

border-radius 普通属性也有流相对的等价物。在水平 writing-mode 下,下面的示例会将右上角的边框半径设置为 1em,右下角为 0,左下角为 20px,左上角为 40px

css
.box {
  border-end-start-radius: 1em;
  border-end-end-radius: 0;
  border-start-end-radius: 20px;
  border-start-start-radius: 40px;
}

为四值简写语法指定逻辑值

规范对像 margin 这样的四值简写属性提出了建议,但关于如何表示这一点的最终决定尚未解决,相关讨论见此议题

目前,使用任何四值简写属性(如 marginpaddingborder)都将使用物理版本,因此如果遵循文档流很重要,请暂时使用普通属性。