CSS的em与ch单位有什么区别?
我在我的样式表中使用了ch,但是em似乎更常用。它们之间有什么区别?
我知道20ch足以容纳20个零。但我不理解什么是em。它是否足以容纳20个M,或者是20 x字体大小,即16号字体会给出320,但320是什么单位呢?我不明白它们是否几乎相同或完全不同。
CSS的em与ch单位有什么区别?
我在我的样式表中使用了ch,但是em似乎更常用。它们之间有什么区别?
我知道20ch足以容纳20个零。但我不理解什么是em。它是否足以容纳20个M,或者是20 x字体大小,即16号字体会给出320,但320是什么单位呢?我不明白它们是否几乎相同或完全不同。
我看了所有的答案,以及你对它们的评论,感觉你主要想使用em
和ch
单位来设置width
或height
属性。
[...]那么它们不适合用于设置字段宽度吗?
从我的角度来看,我不建议这样做。
CH-单位
首先,我以前从未使用过ch
,老实说我也没有看到任何真正的用处- 也许是一个input
的年份,所以总是有四个数字的宽度,但不要超过 -因为它从来不会告诉你元素最终的宽度。
现在我改变了主意,我认为ch
确实有很好的实际用途。 :)
关于以输入年份的例子,使得输入框始终有四个数字的宽度,这个例子还存在。但是,ch
也非常有用于准确定义段落文字的文本宽度。
使用像素、相对值或百分比值非常困难 - 尤其是对于响应式设计 - 正确设置每行包括间距的段落文本宽度。然而,这可能会对网站的用户体验造成损害。Atlassian Design的一篇摘要是完美的匹配:
将阅读环境设置为适合读者的模式。宽的文字行很难阅读,使得人们更难以集中注意力。虽然没有正确测量文本的完美宽度的方法,但一个好的目标是每行包括间距的字符数在60和100之间。设置最佳行长可以将内容分解为易于消化的块。
这就是ch
作为单位的完美使用场景。为了更好的展示,您可以查看末尾的示例。
但现在终于到了ch
的定义部分;)
正如经常提到的那样,ch
是指0
字符相对于其字体大小的宽度。
例如:正文的font-size: 16px
,所选字体系列的0
字符宽度为10px
,则1ch
等于10px
。即使如此,这仍然不准确,因为例如italic
或bold
可以改变字符的宽度。
EM-和REM-单位
正如经常所说的,em
(并增加一个玩家) 以及 rem
都与 font-size
相关。
rem
始终相对于根元素的 font-size
,而 em
则相对于自身元素或最后一个带有 font-size
的父元素或根元素。
例如使用 em
: 只有 body
具有 font-size: 16px;
而该元素没有自己的 font-size
,则 1em
等于 16px
。 如果该元素的父级或元素本身具有 font-size: 20px;
,则 1em
等于 20px
。 em
单位也可以相乘。
例如使用 rem
: body
具有 font-size: 16px;
,则 1rem
等于 16px
。即使元素本身或父元素具有 font-size: 20px;
,1rem
仍等于 body
的设置,即 16px
。
[...] 如果 '0' 的大小是字体中的 ch,为什么 'M' 的大小不是 em [...]
em
最初基于当前字体 M
字符的印刷测量,但这已经过时了。现在,它总是引用“固定起始值”,而不是字符的宽度。
推荐使用方式
我认为,不建议将 ch
、em
或 rem
用于 width
或 height
属性。这些单位对于 “文本” 属性更有用。
一些例子:
h2
的字体大小应该是正常文本的四倍:font-size: 4rem;
p
元素的下边距应始终为半个行高:margin-bottom: 0.5em;
line-height
应比font-size
大20%:line-height: 1.2em;
input
应始终具有四个数字的宽度:width: 4ch;
p
的文本宽度应始终为每行80个字符,包括间距:width: 80ch;
但像素在处理不同设备时并不灵活
因此,总结起来,我建议您简单地使用百分比 width: 80%;
或视口宽度和视口高度 height: 100vh; width: 100vw;
。或者至少始终使用最大值:width: 1000px; max-width: 100%;
。
以下是一些代码片段 - 仅供理解width
属性的示例:
em
- 相对于当前元素或上级元素中具有字体大小的元素的字体大小
body {
font-size: 16px;
}
p {
font-weight: bold;
}
div {
width: 1em;
height: 50px;
background: lightgray;
}
.em-0-5 {
width: 0.5em;
}
.em-10 {
width: 10em;
}
.fs-10 {
font-size: 10px;
}
.parent {
font-size: 0.5em;
}
.parent div {
width: 10em;
}
<p>1em (body font-size * 1 = 16px)</p>
<div></div>
<p>0.5em (body font-size * 0.5 = 8px)</p>
<div class="em-0-5"></div>
<p>10em (body font-size * 10 = 160px)</p>
<div class="em-10"></div>
<p>10em from 10px own element font-size (element font-size * 10 = 100px)</p>
<div class="em-10 fs-10"></div>
<p>10em from 0.5em parent font-size (body font-size * parent font-size * 10 = 80px)</p>
<span class="parent">
<div></div>
</span>
rem
- 相对于根元素的字体大小
body {
font-size: 16px;
}
p {
font-weight: bold;
}
div {
width: 10rem;
height: 50px;
background: lightgray;
}
.parent {
font-size: 20px;
}
.parent div {
width: 5rem;
}
<p>10rem (body font-size * 10 = 160px)</p>
<div></div>
<p>5rem in a parent element with font-size 20px (body font-size * 5 = 80px)</p>
<span class="parent">
<div></div>
</span>
ch
- 相对于数字“0”的宽度。
body {
font-size: 16px;
}
p {
font-weight: bold;
}
input {
width: 4ch;
}
div {
width: 20ch;
background: lightgray;
word-wrap: break-word;
}
.ch-1 {
width: 1ch;
}
.ch-5 {
width: 5ch;
font-size: 32px;
}
<p>4ch (space of 4x zero character)</p>
<input type="text" value="2018" />
<p>20ch (space of 20x zero characters)</p>
<div>0000000000000000000000000</div>
<p>Also 20ch (space of 20x zero characters)</p>
<div>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et </div>
<p>1ch (space of 1x zero character)</p>
<div class="ch-1">00000</div>
<p>5ch from font-size 32px (space for 5x zero characters with a font-size of 32px)</p>
<div class="ch-5">0000000000000000000000000</div>
em
和rem
。这是一种更简单的使事物具有响应性的方式,取决于您选择的字体系列而不是特定字符。<length>
文档:
ch
- 表示元素font
中字符“0”(Unicode字符U+0030)的宽度或更准确地说是其推进度量。
em
- 表示元素的计算font-size
。如果在font-size
属性本身上使用,则表示元素的继承font-size。
<h1>How em works</h1>
<h2>Default values</h2>
<p style="font-size: 1em">I am 1 em on a default browser (10px)</p>
<p style="font-size: 2em">I am 2 em on a default browser (20px)</p>
<hr>
<h2>Inherit values</h2>
<div style="font-size: 18px">
<p style="font-size: 1em">I am 1 em depending on my parent element font-size (18px)</p>
<p style="font-size: 2em">I am 2 em depending on my parent element font-size (36px)</p>
</div>
它们完全不同。
一个em等于父元素的字体大小(以像素为单位)。像素字体大小是指字母的高度,以像素为单位。因此,如果您没有更改HTML元素的字体大小,则大多数内容的默认大小为16px,因此一个em的高度为16px。2em将是32px高度,依此类推。
在我看来,Rem比em更容易使用(因为Rem单位始终会引用根/HTML元素的字体大小)。
在Gerardo的回答中有两件事要补充:
em
将被今天使用的任何浏览器支持,但ch
单位在IE11中计算略有不同,并且在Opera Mini中缺少支持。ch
单位始终基于“0”字符,而em
相对于其各自父元素的字体大小。