CSS 拥有42种单位

最近因网站项目需求,我接触到了CSS单位“dvh”。此前从未留意过这个单位的存在,于是开始梳理自己遗漏的其他单位。

初学HTML/CSS时,我们仅掌握这9种常用单位:

px、%、em、ex、cm、mm、in、pt 和 pc

如今显然已扩展至42种:

px、%、em、ex、cm、mm、in、pt、pc、
vh、vw、rem、vmin、vmax、lvh、lvw、
swh、svw、svb、svi、dvh、dvw、dvb、dvi、
dvmin、dvmax、Q、cqw、cqh、cqi、cqb、
cqmin、cqmax、ch、rch、lh、rlh、cap、rcap、ic、ric、rex

其中部分属性似乎非常实用,以下是所有属性的简要概述:

元素周期表

px
像素,绝对长度单位。

%
百分比,相对单位。

em
元素自身字体大小。若字体为12px,则1em=12px。

rem
与em相同,但基于根元素的字体大小。

ex
相对于当前字体中字母“x”的小写高度。示例:font-size: 2ex;

cm
表示厘米长度。示例:width: 5cm;

mm
表示毫米长度。示例:height: 10mm;

in
表示英寸长度(1in = 2.54cm)。示例:border: 1in solid black;

pt
表示点单位长度(1pt = 1/72英寸)。示例:font-size: 12pt;

pc
表示派卡单位长度(1pc = 12pt)。示例:width: 5pc;

vh
表示视口高度的百分比(1vh = 视口高度的1%)。示例:height: 50vh;

vw
表示视口宽度的百分比(1vw = 视口宽度的1%)。示例:width: 75vw;

rem
相对于根元素的字体大小()。示例:font-size: 2rem;

vmin
表示视口较小维度(宽度或高度)的百分比。示例:font-size: 5vmin;

vmax
表示视口较大维度(宽度或高度)的百分比。示例:padding: 3vmax;

lvh
基于页面加载时可能出现的最大视口高度。示例:height: 100lvh;

lvw
基于页面加载时可能出现的最大视口宽度。示例:width: 100lvw;

swh
基于可能出现的最小视口高度。示例:height: 100swh;

svw
基于可能出现的最小视口宽度。示例:width: 100svw;

svb
基于最小块尺寸(取决于书写模式)的小视口块尺寸。示例:block-size: 80svb;

svi
基于最小内联尺寸(取决于书写模式)的小视口内联尺寸。示例:inline-size: 80svi;

dvh
动态视口高度,随视口尺寸调整(如键盘弹出时)。示例:height: 100dvh;

dvw

动态视口宽度,随视口尺寸调整。示例:width: 100dvw;

dvb
动态视口块尺寸,在块方向动态调整。示例:block-size: 90dvb;

dvi
动态视口内联尺寸,沿内联方向动态调整。示例:inline-size: 90dvi;

dvmin
dvh与dvw中较小值,动态调整。示例:gap: 2dvmin;

dvmax
dvh与dvw中较大的值,动态调整。示例:margin: 3dvmax;

Q
代表四分之一毫米(1Q = 1/4mm)。示例:border-width: 4Q;

cqw
容器查询宽度,相对于查询容器的宽度。示例:width: 50cqw;

cqh
容器查询高度,相对于查询容器的高度。示例:height: 40cqh;

cqi
容器查询内联尺寸,相对于查询容器的内联尺寸。示例:max-width: 60cqi;

cqb
容器查询块尺寸,相对于查询容器的块尺寸。示例:max-height: 60cqb;

cqmin
基于容器的cqi与cqb取较小值。示例:padding: 5cqmin;

cqmax
基于容器的cqi与cqb取较大值。示例:border-radius: 5cqmax;

ch
相对于当前字体中字符“0”的高度。示例:width: 20ch;

rch
相对于根元素的ch单位。示例:line-height: 1.5rch;

lh

相对于当前元素的行高。示例:margin-bottom: 1lh;

rlh
相对于根元素的lh单位。示例:height: 2rlh;

cap
相对于当前字体大写字母的高度。示例:max-height: 3cap;

rcap
相对于根元素的cap单位。示例:padding-top: 2rcap;

ic
相对于当前字体中“?”(水)汉字的宽度。示例:column-width: 5ic;

ric
相对于根元素的 ic 单位。示例:grid-gap: 1ric;

rex
相对于根元素的 ex 单位。示例:height: 2rex;

在开发我的免费网站构建器时,实际上从未用到全部单位——坦白说大概只用到20%。

但用户偶尔会要求支持某些单位,目前最常被提及的是Em和Rem,我很快会添加支持。

CSS中42种单位看似繁复,但回溯至1996年(近30年前!)初创时仅有8-9种单位。如今这42种单位各具价值,在我看来在特定场景下都具有合理性。


注释:

我认为规范中明确指出像素(px)是相对单位! 只有那些对应物理长度单位的度量(如毫米、厘米、英寸、点、字号、Q等——可能还有遗漏)才被视为绝对单位,其余所有单位都相对其他基准存在。

最初px是通过屏幕分辨率(如px/in或px/cm)与绝对长度挂钩的,但我隐约记得规范曾因高分辨率屏幕而弱化这种关联,转而将其与像素尺寸挂钩——前提是屏幕需达到某种假设分辨率(不同于实际分辨率),这听起来反而像是px最终成了绝对单位。除非考虑到设备可自由声明分辨率,因此它本质上仍是相对的!

当然这一切可能仅是推测,实际规范或许确实以物理设备像素为准——但观察结果至少能证明现有实现方式与规范存在偏差… (那样的话就毫无意义了)

总之,我隐约记得某处提示过:干脆别用像素单位,改用点或毫米更妥当。或者用Q单位——因为1Q < 1pt < 1mm < 1pc < 1cm。

我认为标准文本中还有相当一部分内容专门用于定义何时x等于1ex、何时M等于1em (顺便说一句,你这里重复了两次rem)这取决于你定义的具体内容,否则像font-size: 1em这样的设置就显得多余了。而font-size: 0.9em若采用奇怪的定义方式,会趋近于零,因此它本质上是相对于下一层外层元素的字号来定义的(不太确定,毕竟时隔已久)。百分比单位也类似,但同样存在关于“百分比基准”的特定规则。

不过我此前并不知晓Q单位、各类rxx、cqx、dvx及其衍生单位(虽然实际应用这些单位时,可能需要查阅不同@media环境下的具体定义)。非常感谢!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注


京ICP备12002735号