【问题标题】:What is difference between CSS em and ch units?CSS em 和 ch 单位有什么区别?
【发布时间】:2020-12-19 05:25:11
【问题描述】:

CSS emch 单位有什么区别?

我一直在我的样式表中使用 ch,但 em 似乎更常见。它们有什么区别?

我知道 20ch 将为 20 个零提供足够的空间。我不明白 em 是什么。它是否为 20 M 提供了足够的空间,还是 20 x 字体大小,即 16 号字体将提供 320,但 320 是什么单位?我不知道它们是几乎相同还是完全不同。

【问题讨论】:

  • em 是字体的字体大小,传统上是大写字母 M 的宽度(因此为 em)。 ch 是字体中数字 0 的宽度。
  • 我会推荐你​​查看 w3schools 以获得更好的解释
  • 什么完全你不明白?您究竟了解做什么?除了复制和粘贴两个单位的规范定义之外,您希望我们如何回答这个问题?
  • @MikeMcCaughan 所以我知道 20ch 将为 20 个零提供足够的空间,我不明白 em 是什么,它是否为 20 M 提供了足够的空间,或者它是 20 x 字体大小,即大小 16字体会给出 320,但 320 是什么单位。我不知道它们是几乎相同还是完全不同。

标签: css


【解决方案1】:

我查看了所有答案以及您对它们的 cmets,我觉得您希望将 emch 单位主要用于 widthheight 属性。

[...] 那么它们不适合设置字段宽度吗?

从我的角度来看,我不建议这样做。


CH-单位

首先,我以前从未与ch 合作过,老实说,我认为它没有任何实际用途- 可能是今年的input,所以总有四个数字的宽度,但不会更多 - 因为它永远不会准确告诉您元素最终的宽度。

我改变了主意,现在我看到了 ch 的真正用途。 :)

input 的年份示例,因此始终存在四个数字的宽度,将继续存在。但是ch 对于正确定义段落的文本宽度也非常有用。

使用像素、相对值或百分比值非常困难 - 特别是对于响应式设计 - 设置每行的完美文本宽度,包括段落的间距。但是,这可能是网站用户体验的责任。 Atlassian Design 的摘要是绝配:

设置适合读者的阅读环境。大行文字难以阅读,使人们更难集中注意力。虽然没有正确的方法来衡量文本的完美宽度,但一个好的目标是每行包含 60 到 100 个字符,包括间距。设置最佳行长将内容分解为易于消化的块。

来源:Atlassian Design

这是ch 可以完美地作为一个单元使用的地方。为了更好地了解,您可以查看最后的示例。

但现在终于要定义ch ;)

正如人们常说的,ch 是指0 字符的宽度与其字体大小的比值。

例如:正文有一个font-size: 16px,而0 字符的宽度是来自所选字体系列的10px,那么1ch 等于10px。即使这样仍然不准确,因为例如italicbold 可以改变字符的宽度。


EM 和 REM 单位

正如人们常说的,em - 并且要多带一位玩家-rem 是相对于font-size 而言的。

其中rem总是相对于根元素font-sizeem相对于自身元素或最后一个父元素的font-size(也可以是根元素) em> 带有font-size

em 示例:只有bodyfont-size: 16px; 而元素本身没有font-size,则1em 等于16px。如果元素的父元素或元素本身得到font-size: 20px;,则1em 等于20pxem 单位也可以自我繁殖。

rem 示例:body 有一个font-size: 16px;,那么1rem 等于16px。即使元素本身或父元素得到了font-size: 20px;1rem 仍然等于16pxbody 设置。

[...] 如果 ch 在字体中是 '0' 的大小,为什么 em 在字体中不是 'M' 的大小 [...]

em 最初是基于当前字体M 字符的排版测量,但这已经过时了。正如您现在看到的,它总是引用“固定起始值”而不是字符的宽度。


推荐用法

正如我所说,从我的角度来看,我不建议将chemrem 用于widthheight 属性。这些单位对于“文本”属性更有用。

一些例子:

  • 所有h2 应该是文本的四倍:font-size: 4rem;
  • 所有p 应该总是有一个半行的marginmargin-bottom: 0.5em;
  • 元素的line-height 应该比font-size 大20%:line-height: 1.2em;
  • 一年的input,应该总是有四个数字的widthwidth: 4ch;
  • p 的文本宽度应始终为每行 80 个字符的宽度,包括间距:width: 80ch;

但像素在处理不同设备时并不灵活

为此,作为结论,我建议您简单地使用百分比width: 80%; 或视口宽度和视口高度height: 100vh; width: 100vw;。或者至少总是有一个最大值:width: 1000px; max-width: 100%;


这里有一些 sn-ps - 仅用于具有 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>

【讨论】:

  • 这确实有帮助,我现在明白了,谢谢!
  • 年份的输入,应该总是有四个数字的宽度:width: 4ch; – 这不是意味着所有数字都与零的宽度相同?我怀疑你会在那里找到的所有字体都是这种情况。
【解决方案2】:

我通常使用em & rem。这是一种更简单的响应式方式,取决于您选择的字体系列,而不是特定字符。

来自MDN &lt;length&gt; documentation

ch - 表示宽度,或者更准确地说是提前量, 元素的字形“0”(零,Unicode 字符 U+0030) font.

em - 表示计算出的元素的font-size。如果用于 font-size 属性本身,它代表 inherited 字体大小 元素。

<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>

【讨论】:

  • 在 w3schools 参考之前,这是一个很好的答案。它通常在 SO 中不受欢迎,因为它们在历史上是不准确的。指向像@Mike McCaughan 在上述评论中的Moz
  • @happymacarts 你实际上是 100% 正确的。我只是有点击第一个链接的坏习惯,它通常是 w3s。谢谢,将编辑
  • 我在发布问题之前确实看过 w3c 学校,但我没有,我仍然不明白答案
  • @PaulTaylor 这两个单位都是相对单位。这意味着它取决于一件事或另一件事。这些值已在上面发布。
  • @GerardoBLANCO '这取决于一件事或另一件事',抱歉,这对我来说毫无意义。
【解决方案3】:

Gerardo 的回答要补充两点:

  1. 浏览器支持有所不同:em 将被当今使用的任何浏览器支持,但 ch 单位是 calculated slightly different in IE11 and is missing support in Opera Mini.
  2. ch 的单位始终基于“0”字符,而 em 的单位与其各自的父字体大小相关。

【讨论】:

  • 2.请扩展这意味着“各自的父母字体大小”是什么意思,它不是总是基于“M”字符吗,ch 测量值不会根据使用的字体大小而变化吗?
【解决方案4】:

它们完全不同。

一个 em 等于父元素的字体大小(以像素为单位)。像素字体大小是指字母的高度,以像素为单位。所以如果你没有改变 HTML 元素的 font-size,大多数东西的默认大小是 16px,所以一个 em 是 16px 高度。 2em 将是 32px 高度等。

Rem 比 ems IMO 更容易使用(因为 Rem 单位将始终引用根/HTML 元素的字体大小)。

【讨论】:

  • 所以如果他们测量高度,那么它们不适合设置字段宽度吗?
  • 虽然您可以使用 em 单位来指定宽度,但它不是很直观。如果要准确指定一行可以包含多少个字符,请坚持使用 ch 单位。我个人认为像素是最容易使用的。
  • 但像素在处理不同设备时并不灵活
  • 而 ch 仅是 '0 的宽度,我有一个赏金要奖励,但如果没有得到更完整的答案,我无法奖励它。
猜你喜欢
  • 1970-01-01
  • 2021-07-16
  • 2017-05-14
  • 2015-09-11
  • 2011-01-24
  • 2010-10-12
  • 2010-12-28
  • 2018-09-05
  • 2014-12-19
相关资源
最近更新 更多