<length>

Baseline 广泛可用 *

此特性已相当成熟,可在许多设备和浏览器版本上使用。自 ⁨2015 年 7 月⁩以来,各浏览器均已提供此特性。

* 此特性的某些部分可能存在不同级别的支持。

<length> CSS 数据类型表示一个距离值。长度可用于许多 CSS 属性,例如 widthheightmarginpaddingborder-widthfont-sizetext-shadow

备注: 虽然 <percentage> 值可用于某些接受 <length> 值的属性,但它们本身并不是 <length> 值。参见 <length-percentage>

语法

<length> 数据类型由一个 <number> 后跟一个下面列出的单位组成。与所有 CSS 维度一样,数字和单位字面量之间没有空格。如果数字是 0,则指定长度单位是可选的。

备注: 有些属性允许负的 <length> 值,而有些则不允许。

长度的指定值specified length)由其数量和单位表示。长度的计算值computed length)是解析为绝对长度的指定长度,其单位不作区分。

<length> 单位可以是相对的或绝对的。相对长度表示相对于其他某个距离的度量。根据单位的不同,这个距离可以是特定字符的大小、行高,或者是视口的大小。使用相对长度单位的样式表可以更容易地从一个输出环境扩展到另一个输出环境。

备注: 子元素不会继承为其父元素指定的相对值;它们继承的是计算值。

相对长度单位

CSS 相对长度单位基于字体、容器或视口大小。

基于字体的相对长度单位

字体长度单位根据元素或其父元素当前生效字体中特定字符的大小或字体属性来定义 <length> 值。

备注: 这些单位,尤其是 em 和根相对单位 rem,常用于创建可伸缩的布局,即使用户更改字体大小,也能保持页面的垂直节奏。

cap

表示元素 font 的“大写字母高度”(大写字母的标称高度)。

ch

表示元素 font 中字形 0(零,Unicode 字符 U+0030)的宽度,或更准确地说是前进量。在无法或不方便确定 0 字形度量的情况下,必须假定其宽度为 0.5em,高度为 1em

em

表示元素的计算后的 font-size。如果用在 font-size 属性本身上,它表示元素的继承字体大小。

ex

表示元素 fontx-height。在带有 x 字母的字体中,这通常是字体中小写字母的高度;在许多字体中 1ex ≈ 0.5em

ic

等于用于渲染“水”字形(CJK 水表意文字,U+6C34)的字体中该字形的前进量

lh

等于使用它的元素的 line-height 属性的计算值,并转换为绝对长度。该单位允许基于理想空行的理论尺寸进行长度计算。然而,实际行框的大小可能因其内容而异。

基于根元素字体的相对长度单位

根元素字体相对长度单位根据元素中特定字符的大小或字体属性来定义 <length> 值。

rcap

等于根元素 font 的“大写字母高度”(大写字母的标称高度)。

rch

等于根元素 font 中字形 0(零,Unicode 字符 U+0030)的宽度或前进量

rem

表示根元素(通常是 <html>)的 font-size。当在根元素的 font-size 中使用时,它表示其初始值。常见的浏览器默认值为 16px,但用户定义的偏好设置可能会修改此值。

rex

表示根元素 font 的 x-height。

ric

等于根元素字体上 ic 单位的值。

rlh

等于根元素字体上 lh 单位的值。该单位允许基于理想空行的理论尺寸进行长度计算。然而,实际行框的大小可能因其内容而异。

基于视口的相对长度单位

视口百分比长度单位基于四种不同的视口尺寸:小、大、动态和默认。允许使用不同视口尺寸是为了应对浏览器界面动态展开和收起,以及显示和隐藏下方内容的情况。

小视口单位

当希望在浏览器界面动态扩展时获得尽可能小的视口,应使用小视口尺寸。小视口尺寸允许设计的内容在浏览器界面展开时填满整个视口。当浏览器界面收起时,选择此尺寸也可能留下空白区域。

例如,一个使用基于小视口尺寸的视口百分比单位来确定大小的元素,当所有动态浏览器界面都显示时,它将完美地填满屏幕,内容不会被遮挡。然而,当这些浏览器界面被隐藏时,元素周围可能会出现额外的空间。因此,小视口百分比单位通常更“安全”,但在用户开始与页面交互后,可能不会产生最吸引人的布局。

小视口尺寸由 sv 前缀表示,并产生 sv* 视口百分比长度单位。小视口百分比单位的尺寸是固定的,因此是稳定的,除非视口本身被调整大小。

大视口单位

当希望在浏览器界面动态收起时获得尽可能大的视口,应使用大视口尺寸。大视口尺寸允许设计的内容在浏览器界面收起时填满整个视口。需要注意的是,当浏览器界面展开时,内容可能会被隐藏。

例如,在屏幕空间宝贵的手机上,浏览器通常会在用户开始滚动页面后隐藏部分或全部的标题栏和地址栏。当一个元素使用基于大视口尺寸的视口百分比单位来确定大小时,当这些浏览器界面被隐藏时,元素的内容将填满整个可见页面。然而,当这些可伸缩的浏览器界面显示时,它们可能会隐藏使用视口百分比单位来确定大小或定位的内容。

大视口单位由 lv 前缀表示,并产生 lv* 视口百分比单位。大视口百分比单位的尺寸是固定的,因此是稳定的,除非视口本身被调整大小。

动态视口单位

当希望视口根据浏览器界面动态展开或收起而自动调整大小时,可以使用动态视口尺寸。动态视口尺寸允许设计的内容精确地适应视口,而不管动态浏览器界面是否存在。

动态视口单位由 dv 前缀表示,并产生 dv* 视口百分比单位。动态视口百分比单位的尺寸是不稳定的,即使视口本身没有改变。

备注: 虽然动态视口尺寸可以提供更多的控制和灵活性,但使用基于动态视口的视口百分比单位可能会导致内容在用户滚动页面时重新调整大小。这可能导致用户界面降级并造成性能问题。

默认视口单位

默认视口尺寸由浏览器定义。由此产生的视口百分比单位的行为可能等同于基于小视口尺寸、大视口尺寸、介于两者之间的中间尺寸或动态视口尺寸的视口百分比单位。

备注: 例如,浏览器可能会将高度的默认视口百分比单位(vh)实现为等同于大视口百分比高度单位(lvh)。如果是这样,当浏览器界面展开时,这可能会遮挡全屏显示的内容。目前,所有默认视口单位(vhvw 等)都等同于其对应的大视口单位(lvhlvw 等)。

视口百分比长度单位定义了相对于初始包含块尺寸的百分比 <length> 值,而初始包含块的尺寸又基于视口或页面区域(即可见文档部分)的大小。当初始包含块的高度或宽度改变时,基于它们大小的元素也会相应缩放。如下所述,每个视口尺寸都有一个对应的视口百分比长度单位变体。

备注: 视口长度单位在 @page 声明块中无效。

vh

表示视口初始包含块高度的百分比。1vh 是视口高度的 1%。例如,如果视口高度是 300px,那么属性值为 70vh 将是 210px

针对小、大和动态视口尺寸的相应视口百分比单位分别是 svhlvhdvhvh 等同于 lvh,表示基于大视口尺寸的视口百分比长度单位。

vw

表示视口初始包含块宽度的百分比。1vw 是视口宽度的 1%。例如,如果视口宽度是 800px,那么属性值为 50vw 将是 400px

针对小、大和动态视口尺寸,相应的视口百分比单位是 svwlvwdvwvw 等同于 lvw,表示基于大视口尺寸的视口百分比长度单位。

vmax

以百分比表示 vwvh 中的较大值。

针对小、大和动态视口尺寸,相应的视口百分比单位是 svmaxlvmaxdvmaxvmax 等同于 lvmax,表示基于大视口尺寸的视口百分比长度单位。

vmin

以百分比表示 vwvh 中的较小值。

针对小、大和动态视口尺寸,相应的视口百分比单位是 svminlvmindvminvmin 等同于 lvmin,表示基于大视口尺寸的视口百分比长度单位。

vb

表示初始包含块在根元素块轴方向上尺寸的百分比。

针对小、大和动态视口尺寸,相应的视口百分比单位分别是 svblvbdvbvb 等同于 lvb,表示基于大视口尺寸的视口百分比长度单位。

vi

表示初始包含块在根元素行内轴方向上尺寸的百分比。

针对小、大和动态视口尺寸,相应的视口百分比单位是 svilvidvivi 等同于 lvi,表示基于大视口尺寸的视口百分比长度单位。

容器查询长度单位

当使用容器查询为容器应用样式时,可以使用容器查询长度单位。这些单位指定一个相对于查询容器尺寸的长度。使用相对于其容器的长度单位的组件在不同容器中使用时更加灵活,无需重新计算具体的长度值。

如果没有可用的合格容器进行查询,容器查询长度单位将默认为该轴向的小视口单位sv*)。

更多信息,请参阅容器查询

cqw

表示查询容器宽度的百分比。1cqw 是查询容器宽度的 1%。例如,如果查询容器的宽度是 800px,那么属性值为 50cqw 将是 400px

cqh

表示查询容器高度的百分比。1cqh 是查询容器高度的 1%。例如,如果查询容器的高度是 300px,那么属性值为 10cqh 将是 30px

cqi

表示查询容器行内尺寸的百分比。1cqi 是查询容器行内尺寸的 1%。例如,如果查询容器的行内尺寸是 800px,那么属性值为 50cqi 将是 400px

cqb

表示查询容器块级尺寸的百分比。1cqb 是查询容器块级尺寸的 1%。例如,如果查询容器的块级尺寸是 300px,那么属性值为 10cqb 将是 30px

cqmin

表示查询容器行内尺寸或块级尺寸中较小值的百分比。1cqmin 是查询容器行内尺寸或块级尺寸中较小值的 1%。例如,如果查询容器的行内尺寸是 800px,块级尺寸是 300px,那么属性值为 50cqmin 将是 150px

cqmax

表示查询容器行内尺寸或块级尺寸中较大值的百分比。1cqmax 是查询容器行内尺寸或块级尺寸中较大值的 1%。例如,如果查询容器的行内尺寸是 800px,块级尺寸是 300px,那么属性值为 50cqmax 将是 400px

绝对长度单位

当输出介质的物理属性已知时(例如打印布局),绝对长度单位表示一个物理测量值。这是通过将其中一个单位锚定到一个物理单位视角单位,然后定义其他单位相对于它来实现的。物理单位包括 cminmmpcptpxQ。对于低分辨率设备(如屏幕)和高分辨率设备(如打印机),锚定的方式不同。

对于低 dpi 设备,单位 px 表示物理上的参考像素;其他单位是相对于它定义的。因此,1in 定义为 96px,这等于 72pt。这个定义的结果是,在这类设备上,用英寸(in)、厘米(cm)或毫米(mm)描述的尺寸不一定与同名的物理单位的尺寸相匹配。

对于高 dpi 设备,英寸(in)、厘米(cm)和毫米(mm)与其物理对应物相同。因此,px 单位是相对于它们定义的(1in 的 1/96)。

备注: 许多用户会增加其用户代理的默认字体大小,以使文本更易读。绝对长度单位可能会导致无障碍问题,因为它们是固定的,不会根据用户设置进行缩放。因此,在设置 font-size 时,应优先使用相对长度(如 emrem)。

px

一像素。对于屏幕显示,它传统上代表一个设备像素(点)。然而,对于打印机高分辨率屏幕,一个 CSS 像素意味着多个设备像素。1px = 1in / 96

cm

一厘米。1cm = 96px / 2.54

mm

一毫米。1mm = 1cm / 10

Q

四分之一毫米。1Q = 1cm / 40

in

一英寸。1in = 2.54cm = 96px

pc

一派卡。1pc = 12pt = 1in / 6

pt

一磅。1pt = 1in / 72

插值

在进行动画时,<length> 数据类型的值会作为真实的浮点数进行插值。插值发生在计算值上。插值的速度由与动画关联的缓动函数决定。

示例

比较不同的长度单位

以下示例提供了一个输入框,你可以在其中输入一个 <length> 值(例如 300px50%30vw),以设置按下 EnterReturn 键后下方出现的结果条的宽度。

这可以让你比较和对比不同长度单位的效果。

HTML

html
<div class="outer">
  <div class="input-container">
    <label for="length">Enter width:</label>
    <input type="text" id="length" />
  </div>
  <div class="inner"></div>
</div>
<div class="results"></div>

CSS

css
html {
  font-family: sans-serif;
  font-weight: bold;
  box-sizing: border-box;
}

.outer {
  width: 100%;
  height: 50px;
  background-color: #eeeeee;
  position: relative;
}

.inner {
  height: 50px;
  background-color: #999999;
  box-shadow:
    inset 3px 3px 5px rgb(255 255 255 / 50%),
    inset -3px -3px 5px rgb(0 0 0 / 50%);
}

.result {
  height: 20px;
  box-shadow:
    inset 3px 3px 5px rgb(255 255 255 / 50%),
    inset -3px -3px 5px rgb(0 0 0 / 50%);
  background-color: orange;
  display: flex;
  align-items: center;
  margin-top: 10px;
}

.result code {
  position: absolute;
  margin-left: 20px;
}

.results {
  margin-top: 10px;
}

.input-container {
  position: absolute;
  display: flex;
  justify-content: flex-start;
  align-items: center;
  height: 50px;
}

label {
  margin: 0 10px 0 20px;
}

JavaScript

js
const inputDiv = document.querySelector(".inner");
const inputElem = document.querySelector("input");
const resultsDiv = document.querySelector(".results");

inputElem.addEventListener("change", () => {
  inputDiv.style.width = inputElem.value;

  const result = document.createElement("div");
  result.className = "result";
  result.style.width = inputElem.value;
  const code = document.createElement("code");
  code.textContent = `width: ${inputElem.value}`;
  result.appendChild(code);
  resultsDiv.appendChild(result);

  inputElem.value = "";
  inputElem.focus();
});

结果

规范

规范
CSS 值和单位模块第 4 级
# 长度

浏览器兼容性

另见