为什么用em而不是px?


Answers:


554

说一个是比另一个更好的选择是错误的(或者在规范中都没有给出他们自己的目的)。甚至值得注意的是,StackOverflow大量使用了px单位。斯派克被告知这不是一个糟糕的选择。

单位定义

  • px是一个绝对的度量单位(例如inptcm),它也恰好是in in单位的1/96 (更多有关后面的原因)。由于这是绝对度量,因此您可以随时使用它来定义特定大小,而不必与浏览器窗口大小或字体大小等其他比例成比例。

    像所有其他绝对单位一样,px单位不会根据浏览器窗口的宽度缩放。因此,如果您的整个页面设计都使用诸如px而不是%的绝对单位,则它将不适应浏览器的宽度。这并不是天生的好坏,只是设计人员需要在粘附到精确的尺寸和不屈不挠与拉伸之间做出选择,但在此过程中没有粘附到确切的尺寸。一个站点通常会同时包含固定大小和灵活大小的对象。

    固定大小的元素通常需要合并到页面中-例如广告横幅,徽标或图标。这样可确保您几乎总是在设计中至少需要一些基于px的度量。例如,图像(默认情况下)将进行缩放,以使每个像素的大小为1 * px *,因此,如果要围绕图像进行设计,则需要px单位。对于精确的字体大小调整和边框宽度,这也是非常有用的,由于四舍五入,在大多数屏幕上使用px单位最为有意义。

    所有绝对测量值都严格相关。也就是说,1英寸永远 96PX,就像1英寸永远 72pt。(请注意,在谈论基于屏幕的媒体时,1in实际上几乎从来不是物理英寸)。所有绝对测量假定的96ppi的标称屏幕分辨率和桌面显示器的标称观看距离,并且这样的屏幕上的一个像素将等于一个物理屏幕上的像素和一个将等于96个物理像素。在像素密度或观看距离明显不同的屏幕上,或者如果用户使用浏览器的缩放功能缩放了页面,则px不再必须与物理像素有关。

  • em不是绝对单位-它是相对于当前选择的字体大小的单位。除非您通过以绝对单位(例如pxpt)设置字体大小来覆盖字体样式,否则这将受到用户浏览器或OS中字体的选择(如果已选择)的影响,因此这没有意义。可以将em用作长度的一般单位,除非您特别希望它随着字体大小的缩放而缩放。

    当您特别希望某物的大小取决于当前字体大小时,请使用em

  • 在这种情况下,还是相对于父元素的高度或宽度的相对单位。如果您的设计不依赖特定的像素大小来设置其大小,则它们可以很好地替代px单位,例如设计的总宽度。

    在设计中使用单位可使您的设计适应屏幕/设备的宽度,而使用px等绝对单位则不能。


27
除非您知道'em'的大小以像素为单位,否则无法在em和像素之间进行转换。这可能取决于该元素的继承字体大小,而继承字体大小又取决于整个文档的字体大小,而这取决于用户浏览器和/或操作系统中的字体大小设置。如果您要针对特定​​的像素大小,请以像素为单位进行指定。即,如果您想要990px​​,则输入990px​​。如果您想要像素,为什么不使用它们?
thomasrutter

7
??我没说什么矛盾的。我说的是使用px单位,使用em单位。您似乎暗示使用px单位通常是不好的。如果在调整浏览器的默认字体大小时站点中断,则故障不是px单位,这是错误的假设。显然,网页设计师依靠默认字体大小(通常是个好主意),但仍基于对该字体大小的错误假设而创建了其余的布局,例如尝试将固定尺寸的图形元素与文本对齐,元素大小仅与一种字体大小的文本匹配。
thomasrutter 2011年

3
这没有错,也不过分简化。显然,如果在实际声明 font-size 的行中使用em,则该行中的em在该元素上进行任何font-size声明之后都不可能相对于同一元素的font-size ,因为它将不会还不知道-因此,它必须相对于元素在声明同一元素的font-size属性之前应具有的font-size相对。由于其他任何行为实际上都是不可能的,因此我看不到任何歧义。
thomasrutter

3
@TalhaSayed,您正在将像素与px单位混淆。它们不是一回事-请阅读CSS规范。px单位是绝对单位,与in单位,cm单位或pt单位含义相同。
thomasrutter 2014年

7
@thomasrutter,哇!我只是用谷歌搜索,是的,我不得不说我错了。这些年来,我一无所知。我曾经认为1像素= 1“屏幕上的点”。我想我今天学到了一些新东西。
Talha说2014年

143

我有一台高分辨率的小型笔记本电脑,并且必须以120%的文本缩放比例运行Firefox才能阅读而不会斜视。

许多站点对此都有问题。布局变成乱码,按钮中的文本被切成两半或全部消失。即使stackoverflow.com也遭受了它的困扰:

Firefox的屏幕截图,文本缩放为120%

请注意顶部按钮和页面选项卡如何重叠。如果他们使用em单位而不是px,就不会有问题。


15
您也可以在Firefox中缩放文本,而无需在“视图”->“缩放”->“仅缩放文本”中缩放图像,然后照常缩放。
thomasrutter

4
+1好点。尽管对于高分辨率,您可以将屏幕设置设置为以120 dpi的分辨率显示文本,而不是标准的96分辨率
Spoike

5
@Spoike:可以,但是Firefox不支持系统DPI设置。参见bugs.launchpad.net/ubuntu/+source/firefox/+bug/19524
flodin

6
@Juan:那是因为他们使用了最简单的缩放方法:缩放整个页面。但这意味着在150%缩放时,1000px宽的页面将变为1500px宽。对于网络和浏览器开发人员而言,这是最简单的缩放方法。不幸的是,它不是很友好。这就是为什么其他浏览器具有文本缩放功能,该功能仅放大内容而不更改布局。但这意味着Web开发人员需要为各种字体大小基本设计其布局,从而极大地限制了您可以进行设计的工作。要使网站的16pt字体和48pt字体看起来都不错,这是非常困难的。
冒犯君主

1
@Lesemajeste并未缩放整个页面,实际上“缩放”应该是什么。难道开发人员就必须告诉利基用户应付或不访问吗?我永远不会考虑16pt和48pt字体来构建单个页面。正如您所指出的那样,这只是愚蠢的,在布局上非常有限。我认为FF仅希望对文本进行特殊缩放是很好​​的,但是我不会在设计时考虑到这一点。
1934286

93

我问这个问题的原因是我忘记了如何使用em,因为我很高兴在CSS中进行黑客攻击。人们没有注意到我把这个问题笼统地当作了问题,因为我并不是在谈论字体大小本身。我对如何在页面上的任何给定块元素上定义样式更感兴趣。

正如Henrik Paul和其他人指出的,em与元素中使用的字体大小成正比。在px中以块元素定义大小是一种常见的做法,但是,在浏览器中调整字体大小通常会破坏这种设计。调整字体大小通常是通过快捷键Ctrl+ +Ctrl+完成的-。因此,一个好的做法是使用em代替。

使用px定义宽度

这是一个说明性的例子。假设我们有一个div标签,我们想将其变成一个时尚的日期框,我们可能会有如下所示的HTML代码:

<div class="date-box">
    <p class="month">July</p>
    <p class="day">4</p>
</div>

一个简单的实现将以date-boxpx 为单位定义类的宽度:

* { 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;
}

问题

但是,如果我们要在浏览器中放大文本大小,则设计会中断。文字也会在框外出血,这与flodin指出的SO设计中的情况几乎相同。这是因为该框的宽度保持与锁定时相同的大小50px

改用em

一个更聪明的方法是用ems定义宽度:

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

这样,您就可以在日期框上进行流畅的设计,即框将与文本一起按日期框定义的字体大小按比例放大。在此示例中,font-size的定义*为10pt,它将是该字体大小的2.5倍。因此,当您在浏览器中调整字体大小时,该框的大小将是该字体大小的2.5倍。


1
我想知道:它将如何使用宽度百分比来适应网格系统?如果包含块的宽度为100%,会破坏它吗?
雨果·德·洪里格2013年

64
如今情况并非如此。在任何现代浏览器中按Ctrl+Ctrl-也将缩放像素值。现在已经有一段时间了。
YemSalat 2014年

1
@YemSalat这是否也适用于在操作系统中调整DPI?
angularsen 2015年

@anjdreas实话实说不知道。
YemSalat 2015年

4
@spoike,请拒绝投票,因为根据YemSalat的评论显然已经不对了
RayLoveless

60

顶部投票答案在这里从thomasrutter是正确的,他对响应EM。但是像素大小是非常非常错误的。因此,即使它很旧,我也不能忘记它。

电脑屏幕通常不是96dpi!(或者ppi,如果您想做书呆子。)


像素没有固定的物理尺寸。
(是的,它仅固定在一个屏幕中,但是在下一屏幕中,一个像素很可能更大或更小,并且肯定不是1/96英寸。)


证明
画一条线,长960像素。用物理尺测量。是10英寸吗?没有..?
将笔记本电脑连接到电视。这条线现在是10英寸吗?还没?
在iPhone上显示该行。还是一样大小?为什么不?

谁发明了96dpi电脑屏幕神话?
(有些宗教以72dpi的神话运作。但是同样错误。)


4
>要想了解px的外观,请想象一下1990年代的CRT电脑显示器:它可以显示的最小点约为1/100英寸(0.25毫米)或更多。px单位的名称来自这些屏幕像素。-从W3C引用:w3.org/Style/Examples/007/units.en.html#units
Jay Zelenkov

4
所有的绝对测量值都是严格相关的。也就是说,1in总是* 96px *,就像1in总是* 72pt *。(请注意,在谈论基于屏幕的媒体时,1in实际上几乎从来不是物理英寸),我认为投票最多的答案不是在谈论物理英寸。这些关系在in和pt等不同的绝对大小调整方案之间。例如 如果我画一条1英寸的线,只要延伸您的“证明”,它的物理尺寸将为1英寸吗?
Saumitra R. Bhave 2015年

5
-1表示错误,无关的行号。px的大小是相对于参考像素的大小,而不是您在此屏幕上的像素的大小。您可能不喜欢这样,但是拿出标尺并不会使它变得不那么现实,也不会有助于回答问题。stackoverflow.com/questions/27382331/... "The reference pixel is the visual angle of one pixel on a device with a pixel density of 96dpi and a distance from the reader of an arm's length. For a nominal arm's length of 28 inches, the visual angle is therefore about 0.0213 degrees."
underscore_d

52

它可用于必须根据字体大小缩放的所有内容。

在通过缩放字体大小实现缩放的浏览器中特别有用。因此,如果您使用所有元素调整大小,em它们会相应缩放。


97
如今,所有现代浏览器都通过均等缩放所有绝对单位来实现缩放,而不仅仅是缩放字体大小。请注意,此答案写于2009年,当时的情况比现在要少。
thomasrutter

22

因为em(http://en.wikipedia.org/wiki/Em_ ( typography))与当前使用的字体大小成正比。如果字体大小为16磅,则em为16磅。如果您的字体大小为16像素(请注意:与磅数不同),则em为16像素。

这导致两件事(相关):

  1. 如果以后选择在CSS中编辑字体大小,则保持比例很容易。
  2. 许多浏览器都支持自定义字体大小,从而覆盖了CSS。如果以像素为单位设计所有内容,则在这些情况下布局可能会中断。但是,如果您使用ems,则这些替代方法可以缓解这些问题。

我只是寻找一个计算公式:-)也许这是很好的添加反向例子中,同样,像2px0.125em对于16像素的字体。

12

例:

代码:body {font-size:10px;} //保持所有小于正确值的10个大小,更改此值,其余更改为该值的1.4

1 {font-size:1.2em;} // 12px

2 {font-size:1.4em;} // 14px

3 {font-size:1.6em;} // 16px

4 {font-size:1.8em;} // 18px

5 {font-size:2em;} // 20px

身体

1个

2

3

4

5

通过更改体内的值,其余的会自动更改为基本值的一倍...

10×2 = 20 10×1.6 = 16等

您可以将基本值设置为8px…因此8×2 = 16 8×1.6 = 12.8 //可以被浏览器四舍五入


3
最好添加一个说明效果的图像。

8

一个非常实际的原因是,如果使用px指定IE 6,则IE 6不允许您调整字体大小,而如果使用相对单位(如em或百分比),则可以调整字体大小。不允许用户调整字体大小对于可访问性非常不利。尽管它正在下降,但仍然有很多IE 6用户。


1
请注意,IE7和IE8 仍然无法使用以像素为单位指定字体大小(通过Page > Text Size)来调整文本的大小。但是,IE7添加了页面缩放(Page > Zoom),显然可以缩放整个页面,包括文本。
墨卡托

1
比“页面> Zoon”更好,请尝试在IE7 +,Chrome和Firefox中敲击键盘上的[CTRL] + [-]或[+]键-全页缩放,而不会遇到尝试更改字体大小的大多数问题。
Rich Turner 2010年

1
几乎没有任何一台计算机在2017
迈克尔

3
@MichaelMay因此,为什么在2009年写出答案和其他评论……大声笑
Chev


2

使用em或百分比的主要原因是允许用户更改文本大小而不会破坏设计。如果使用px中指定的字体进行设计,如果用户选择“ 文本大小-较大”,则它们不会更改大小(在IE 6和其他版本中)。这对于有视觉障碍的用户来说是非常糟糕的。

有关此类设计的几个示例和文章(有很多选择),请参阅最新一期的“ A List Apart:Fluid Grids”,旧文章《如何在CSS中调整文本大小》或Dan Cederholm的Bulletproof Web Design

您的图片仍应以px大小显示,但是通常来说,以px来缩放文本大小不是一种好方法。

尽管我个人很鄙视IE6,但它是我们财富200强公司中唯一批准用于大多数用户的浏览器。


1
当我问这个问题时,我实际上正在寻找+1流体网格。(同样,您的公司不应该升级到IE7吗?)
Spoike

如果您问我,他们应该使用Firefox,但实际上并没有问我。:-)(IE7会好于6,但我不参与决策)
Traingamer,2009年

2

有一个简单的解决方案,如果您想使用px来指定字体大小,但是仍然希望通过将其放在CSS文件中来提供em的可用性:

body {
  font-size: 62.5%;
}

现在指定您p(和其他)标签,如下所示:

p {
  font-size: 0.8em; /* This is equal to 8px */
  font-size: 1.0em; /* This is equal to 10px */
  font-size: 1.2em; /* This is equal to 12px */
  font-size: 2.0em; /* This is equal to 20px */
}

等等。


2
这不是高度依赖于没有人触摸浏览器的自定义CSS设置吗?
Spoike

4
是的,您应该设置font-size: 10pxcss-tricks.com/forums/discussion/1230/...
m33lky

我更喜欢保留font-size:100%并使用mixins来计算em值
gunnx

0

您可能想使用em作为字体大小,直到IE6消失(来自您的站点)。当页面缩放(与文本缩放相反)成为标准行为时,Px会很好。

Traingamer已经提供了必要的链接


0

像素是绝对单位,而rem / em是相对单位。有关更多信息:https : //drafts.c​​sswg.org/css-values-3/

当您希望字体大小根据系统的字体大小自适应时,应该使用相对单位,因为系统会将字体大小值提供给作为HTML元素的根元素。

在这种情况下,如果网页在Google chrome中打开,则HTML元素的字体大小由chrome设置,请尝试对其进行更改,以查看对带有rem / em单位字体的网页的影响。

在此处输入图片说明

如果px用作字体单位,则更改系统的字体大小时,字体不会调整大小,而带有rem/ em单位的字体会调整大小。

因此,px当您想要固定大小时使用,当rem/ em想要大小自适应于系统大小时,则使用/ 。


-1

普遍的共识是使用百分比来调整字体大小,因为跨浏览器/平台更加一致。

不过,这很有趣,我一直使用pt来调整字体大小,并且我假设所有站点都使用了pt。您通常不会在其他应用程序(例如Word)中使用px大小。我想这是因为它们用于打印-但是在Web浏览器中的大小与在Word中的大小相同...


-2

避免使用em或px使用rem,因为它更容易找到计算值。但是在em和px之间,px更好,因为em很难调试。


请在您的答案中添加一些进一步的解释,以便其他人可以从中汲取教训-特别是因为这是一个非常古老的问题,已经有大量的建议被接受
Nico Haase
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.