用于浮动和定位的逻辑属性

CSS 逻辑属性和值模块包含了 floatclear 物理值的逻辑映射,也包含了用于 定位布局 的定位属性的逻辑映射。本指南将介绍如何使用这些属性。

映射的属性和值

下表详细列出了本指南中讨论的逻辑属性和值,以及它们与物理属性和值的映射。它们假设是水平的 writing-mode,方向为从左到右。

逻辑属性或值 物理属性或值
float: inline-start float: left
float: inline-end float: right
clear: inline-start clear: left
clear: inline-end clear: right
inset-inline-start left
inset-inline-end right
inset-block-start top
inset-block-end bottom
text-align: start text-align: left
text-align: end text-align: right

除了这些已映射的属性之外,还有一些额外的简写属性,它们通过能够处理块级和内联维度而成为可能。除了 inset 属性外,这些属性没有映射到物理属性。

逻辑属性 用途
inset-inline 同时设置内联维度的上述两个插入值。
inset-block 同时设置块维度的上述两个插入值。
inset 通过多值物理映射同时设置所有四个插入值。

浮动和清除示例

用于 floatclear 属性的物理值为 leftrightboth。CSS 逻辑属性和值模块将 inline-startinline-end 值定义为 leftright 的映射。

在下面的示例中,第一个框使用 float: left 浮动,第二个框使用 float: inline-start 浮动。如果您将 direction: rtl 应用于 .inner 选择器,则左浮动的框始终保持在左侧,而 inline-start 浮动的项目则遵循文本的 direction。您可以将其与 writing-mode: vertical-rl 结合使用,以查看块布局与 direction 值结合时的区别。

html
<div class="container">
  <div class="inner">
    <div class="physical box"></div>
    Turnip greens yarrow ricebean rutabaga endive cauliflower sea lettuce
    kohlrabi amaranth water spinach avocado daikon napa cabbage asparagus winter
    purslane kale.
  </div>
  <div class="inner">
    <div class="logical box"></div>
    Turnip greens yarrow ricebean rutabaga endive cauliflower sea lettuce
    kohlrabi amaranth water spinach avocado daikon napa cabbage asparagus winter
    purslane kale.
  </div>
</div>
css
.inner {
  /* direction: rtl; */
  /* writing-mode: vertical-rl; */
}

.physical {
  float: left;
}

.logical {
  float: inline-start;
}

示例:定位布局的插入属性

CSS 定位通常允许我们以相对于其包含块的方式定位元素 — 我们本质上是相对于元素在正常流中应该出现的位置来插入项目。要将元素相对于视口定位,请使用物理属性 toprightbottomleft。当您希望定位与您的书写模式中的文本流相关时,请改用 inset-block-startinset-block-endinset-inline-startinset-inline-end

这些属性接受长度或百分比作为值,并与用户的屏幕尺寸相关。

在下面的示例中,inset-block-startinset-inline-end 属性用于使用绝对定位在带有灰色虚线边框(具有 position: relative)的区域内定位蓝色框。将 writing-mode 属性更改为 vertical-rl,或添加 direction: rtl,然后查看流相对框如何随文本方向移动。

html
<div class="container">
  <div class="inner">
    <div class="physical box"></div>
  </div>
  <div class="inner">
    <div class="logical box"></div>
  </div>
</div>
css
.inner {
  writing-mode: horizontal-tb;
}

.physical {
  position: absolute;
  top: 20px;
  right: 0;
}

.logical {
  position: absolute;
  inset-block-start: 20px;
  inset-inline-end: 0;
}

新的两值和四值简写

与模块中的其他属性一样,我们有简写属性,可以同时设置两个或四个值。

  • inset — 使用物理映射同时设置所有四个边。
  • inset-inline — 设置所有逻辑内联插入。
  • inset-block — 设置所有逻辑块插入。

示例:text-align 的逻辑值

text-align 属性具有与文本方向相关的逻辑值 — 您可以使用 startend 而不是 leftright。在下面的示例中,第一个块设置为 text-align: right,第二个块设置为 text-align: end

如果您将 direction 的值更改为 rtl,您会看到第一个块的对齐方式仍然在右侧,但第二个块的对齐方式则在左侧的逻辑末端。

html
<div class="container">
  <div class="inner physical">Aligned text</div>
  <div class="inner logical">Aligned text</div>
</div>
css
.inner {
  direction: ltr;
}

.physical {
  text-align: right;
}

.logical {
  text-align: end;
}

当使用使用开始和结束而不是物理方向进行对齐的盒对齐时,这种方法更具一致性。