我听说你应该使用em
而不是像素来定义样式表中的大小和距离。那么问题来了,为什么在CSS中定义样式时应该使用em
而不是px
?有没有一个很好的例子说明这一点呢?
说一个比另一个更好的选择是错误的(否则它们不会在规范中各自拥有用途)。甚至值得注意的是,Stack Overflow广泛使用px单位。这并不是问题所认为的不好的选择。
单位的定义
px是一个绝对的度量单位(类似于in,pt或cm),也恰好是1/96英寸单位(稍后解释为什么)。因为它是一个绝对度量,所以它可以用于任何你想要定义为特定大小而不是相对于其他东西(如浏览器窗口大小或字体大小)的大小的情况。
像所有其他绝对单位一样,px单位不随浏览器窗口的宽度而缩放。因此,如果您的整个页面设计使用绝对单位(如px)而不是%,它将不会根据浏览器的宽度进行调整。这并不是本质上好或坏的,只是设计师在忠实于确切大小和不灵活性之间做出的选择,或者在拉伸过程中不坚持确切大小。网站通常会同时包含固定大小和可伸缩大小的对象。
固定大小的元素经常需要被加入到页面中,例如广告横幅、标志或图标等。这确保您几乎总是需要至少一些基于像素的度量单位在设计中。例如,图像默认会按比例缩放,以使每个像素的大小为1px,因此如果您围绕着一个图像进行设计,您将需要使用px单位。对于精确的字体大小和边框宽度,它也非常有用,由于四舍五入,对于大多数屏幕而言,使用px单位最合适。
所有绝对度量都彼此严格相关; 也就是说, 1英寸 总是等于 96像素, 就像 1英寸 总是等于 72pt. (需要注意的是,当涉及基于屏幕的媒体时,1英寸 实际上几乎从不是一个物理英寸) 所有绝对度量假定标称屏幕分辨率为96ppi,标称视距为桌面监视器,在这样的屏幕上,一个 px 将等于屏幕上一个物理像素和一个 in 将等于96个物理像素。在像素密度或视距差异显着的屏幕上,或者如果用户使用浏览器缩放功能缩放页面,则 px 不再必然关联到物理像素。 em 不是绝对单位-它是相对于当前选择的字体大小的单位。除非您使用绝对单位(如 px 或 pt) 覆盖了字体样式,否则如果用户已经进行了选择,这将受到用户浏览器或操作系统中字体选择的影响,因此使用 em 作为一般的长度单位是没有意义的,除非您特别希望它随字体大小的变化而变化。在设计中使用 % 单位可以使您的设计适应屏幕/设备的宽度,而使用像 px 这样的绝对单位则不行。
vh、vw、vmin 和 vmax 是像 % 一样的相对单位,但它们是相对于视口(窗口中可见区域的大小)的大小而不是父元素的大小。分别相对于视口的高度、宽度、较小值和较大值。
我有一台小型笔记本电脑,分辨率很高,必须将Firefox的文本缩放设置为120%才能阅读而不用眯眼。
许多网站都存在问题。布局变得混乱不堪,按钮中的文字被切成一半或完全消失。即使stackoverflow.com也受到了影响:
请注意上方的按钮和页面选项卡重叠。如果使用em单位而不是px,则不会出现问题。
我问这个问题的原因是我忘记了如何使用em作为CSS中的单位,因为有一段时间我一直在愉快地进行CSS的编写。人们没有注意到我将问题提得比较普遍,因为我并不是在谈论字体大小本身,而是更关心如何定义页面上任何给定的块级元素的样式。
正如Henrik Paul和其他人所指出的那样,em与元素中使用的字体大小成比例。通常使用px来定义块级元素的大小,但在浏览器中调整字体大小通常会破坏设计。通过快捷键Ctrl++或Ctrl+-可以常规缩放字体大小,因此使用em是一个很好的实践方法。
下面是一个说明性的例子。假设我们有一个div标签,我们想将其转换为一个时尚的日期框,我们可能会有类似于这样的HTML代码:
<div class="date-box">
<p class="month">July</p>
<p class="day">4</p>
</div>
一个简单的实现方式是,定义 date-box
类的宽度为像素(px):
* { margin: 0; padding: 0; }
p.month { font-size: 10pt; }
p.day { font-size: 24pt; font-weight: bold; }
div.date-box {
background-color: #DD2222;
font-family: Arial, sans-serif;
color: white;
width: 50px;
}
然而,如果我们想在浏览器中调整文本大小,设计将会被破坏。文本也会溢出盒子,这与 SO 的设计几乎相同,正如 flodin 指出的那样。 这是因为盒子的宽度将保持不变,因为它被锁定为50px
。
更明智的方法是使用 em 来定义宽度:
div.date-box {
background-color: #DD2222;
font-family: Arial, sans-serif;
color: white;
width: 2.5em;
}
* { margin: 0; padding: 0; font-size: 10pt; }
// Initial width of date-box = 10 pt x 2.5 em = 25 pt
// Will also work if you used px instead of pt
这样,您在日期框上就拥有了流体设计,即该框将与日期框所定义的字体大小成比例地调整大小。在此示例中,字体大小以 *
定义为10pt,并将按照该字体大小的2.5倍进行调整。因此,在浏览器中调整字体大小时,该框将具有该字体大小的2.5倍大小。
rem
, em
, ch
等等。 - Spoike它对于需要根据字体大小进行缩放的所有内容都很有用。
在实现通过缩放字体大小进行缩放的浏览器上尤其有用。因此,如果您使用em
对所有元素进行大小调整,则它们将相应地进行缩放。
因为em (http://en.wikipedia.org/wiki/Em_(typography))是与当前使用的字体大小成比例的。例如,如果字体大小为16点,一个em就是16点。如果你的字体大小为16像素(注意:不同于点),那么一个em就是16像素。
这导致了两个相关的问题:
2px
等于0.125em
。 - Wolf使用px来精确定位图形元素。使用em来测量与文本元素(如行高等)相关的位置和间距。px是像素精确的,em可以根据使用的字体动态改变。
例子:
代码: body{font-size:10px;} //保持所有大小都正确,将此值更改为例如该值的1.4倍
…
body
1
2
3
4
5
通过更改 body 中的值,其余部分会自动更改为基础值的某种倍数...
10×2=20 10×1.6=16 等等
您可以将基础值设置为8像素...所以 8×2=16 8×1.6=12.8 //浏览器可能进行四舍五入
一个非常实用的原因是,如果使用px指定字体大小,IE 6不允许你调整字体大小,但如果使用相对单位如em或百分比,则可以。不允许用户调整字体大小会严重影响可访问性。尽管它正在衰落,但仍有很多IE 6用户存在。
Pixel是绝对单位,而
rem
/em
是相对单位。更多信息请参见:https://drafts.csswg.org/css-values-3/
当您希望字体大小根据系统字体大小进行自适应时,应使用相对单位,因为系统会将font-size
值提供给根元素即HTML元素。
在这种情况下,当网页在Google Chrome中打开时,Chrome会将font-size
设置为HTML元素,尝试更改它以查看具有rem
/em
单位字体的网页上的效果。
如果使用px
作为字体单位,则字体大小不会调整,而使用rem
/em
单位的字体大小会随着更改系统字体大小而调整。
因此,当您想要固定大小时,请使用px
,而当您想要大小自适应/动态到系统大小时,请使用rem
/em
。