我想赞扬josh3736 的回答,因为它提供了一些出色的历史背景。虽然很清楚,但自从提出这个问题以来,CSS 格局在近五年内发生了变化。当这个问题被问到时,这px
是正确的答案,但今天不再适用。
tl;博士:使用rem
单位概述
从历史上看px
,单位通常代表一个设备像素。随着设备的像素密度越来越高,这不再适用于许多设备,例如 Apple 的 Retina Display。
rem
单位表示根em大小。这是font-size
任何匹配的:root
。在 HTML 的情况下,它是<html>
元素;对于 SVG,它是<svg>
元素。font-size
每个浏览器* 中的默认值是16px
.
关于使用px
Internet 上的大多数 CSS 示例都使用px
值,因为它们是事实上的标准。pt
,并且理论上可以in
使用各种其他单位,但它们不能很好地处理小值,因为您很快需要求助于分数,这些分数更长,更难推理。
如果你想要一个细边框,px
你可以使用1px
,pt
你需要使用0.75pt
来获得一致的结果,这不是很方便。
关于使用rem
rem
的默认值16px
对于它的使用来说并不是一个非常有力的论据。写作比写作0.0625rem
更糟糕0.75pt
,那么为什么会有人使用rem
呢?
与其他单位相比,有两个rem
优势。
- 尊重用户偏好
- 您可以将表观
px
值更改为rem
您想要的任何值
尊重用户偏好
浏览器缩放多年来发生了很大变化。从历史上看,许多浏览器只会扩大规模font-size
,但当网站意识到他们美丽的像素完美设计在任何人放大或缩小时都会破坏时,这种情况发生了相当大的变化。此时,浏览器会缩放整个页面,因此基于字体的缩放是不可能的。
尊重用户的意愿并非不可能。仅仅因为浏览器16px
默认设置为,并不意味着任何用户都不能将他们的偏好更改为24px
或32px
纠正低视力或低能见度(例如屏幕眩光)。如果您的单位基于rem
,则任何具有较高字体大小的用户都会看到按比例增大的网站。边框会更大,内边距会更大,边距会更大,一切都会流畅地扩大。
如果您的媒体查询基于rem
,您还可以确保您的用户看到的网站适合他们的屏幕。在宽浏览器上font-size
设置为的用户将有效地看到您的网站,如在宽浏览器上向用户显示的那样。RWD 在使用中绝对没有损失。32px
640px
16px
320px
rem
改变表观px
值
因为rem
是基于节点font-size
的:root
,如果你想改变1rem
代表什么,你所要做的就是改变font-size
:
:root {
font-size: 100px;
}
body {
font-size: 1rem;
}
<p>Don't ever actually do this, please</p>
无论您做什么,都不要将:root
元素设置font-size
为一个px
值。
如果您将font-size
on设置html
为一个px
值,那么您已经破坏了用户的偏好,而无法让它们恢复。
如果要更改 的表观值rem
,请使用%
单位。
这方面的数学相当简单。
的明显字体大小:root
为16px
,但假设我们想将其更改为20px
。我们需要做的就是乘以16
某个值来得到20
.
建立你的方程式:
16 * X = 20
并解决X
:
X = 20 / 16
X = 1.25
X = 125%
:root {
font-size: 125%;
}
<p>If you're using the default font-size, I'm 20px tall.</p>
做所有事情的倍数20
并不是那么好,但一个常见的建议是使表观大小rem
等于10px
. 那个神奇的数字10/16
是0.625
, 或62.5%
。
:root {
font-size: 62.5%;
}
<p>If you're using the default font-size, I'm 10px tall.</p>
现在的问题是您font-size
对页面其余部分的默认设置太小了,但是有一个简单的解决方法:设置 a font-size
on body
using rem
:
:root {
font-size: 62.5%;
}
body {
font-size: 1.6rem;
}
<p>I'm the default font-size</p>
重要的是要注意,通过这种调整, 的表观值rem
意味着10px
您可能写入的任何值都可以通过碰撞小数位px
直接转换为。rem
padding: 20px;
变成
padding: 2rem;
您选择的明显字体大小取决于您,所以如果您愿意,没有理由不能使用:
:root {
font-size: 6.25%;
}
body {
font-size: 16rem;
}
并且有1rem
平等1px
的。
所以你有了它,一个尊重用户意愿的简单解决方案,同时也避免过度复杂的 CSS。
等等,有什么收获?
我怕你会这么问。尽管我想假装它rem
很神奇并且可以解决所有问题,但仍然存在一些值得注意的问题。在我看来没有什么大不了的,但我要把他们叫出来,所以你不能说我没有警告你。
媒体查询(使用em
)
您将遇到的第一个问题rem
涉及媒体查询。考虑以下代码:
:root {
font-size: 1000px;
}
@media (min-width: 1rem) {
:root {
font-size: 1px;
}
}
这里的值rem
根据媒体查询是否适用而变化,媒体查询取决于 的值rem
,那么到底发生了什么?
rem
在媒体查询中使用初始值font-size
并且不应该(参见 Safari 部分)考虑到元素可能发生font-size
的任何变化。:root
换句话说,它的表观价值总是 16px
.
这有点烦人,因为这意味着您必须进行一些小数计算,但我发现大多数常见的媒体查询已经使用了 16 的倍数。
| px | rem |
+------+-----+
| 320 | 20 |
| 480 | 30 |
| 768 | 48 |
| 1024 | 64 |
| 1200 | 75 |
| 1600 | 100 |
此外,如果您使用 CSS 预处理器,您可以使用 mixins 或变量来管理您的媒体查询,这将完全掩盖问题。
苹果浏览器
不幸的是,Safari 存在一个已知错误,其中对:root
字体大小的更改确实会更改rem
媒体查询范围的计算值。:root
如果元素的字体大小在媒体查询中发生更改,这可能会导致一些非常奇怪的行为。幸运的是,解决方法很简单:使用em
单位进行媒体查询。
上下文切换
如果您在各种不同的项目之间切换项目,则很可能会看到 font-size 的rem
值不同。在一个项目中,您可能正在使用10px
另一个项目中的表观大小可能是的表观大小1px
。这可能会令人困惑并导致问题。
我在这里唯一的建议是坚持62.5%
转换rem
为 的表观大小10px
,因为这在我的经验中更为常见。
共享 CSS 库
如果您正在编写将在您无法控制的网站上使用的 CSS,例如用于嵌入式小部件,那么实际上没有什么好方法可以知道外观大小rem
。如果是这种情况,请随时继续使用px
.
如果您仍然想使用rem
,请考虑发布 Sass 或 LESS 版本的样式表,其中包含一个变量来覆盖rem
.
* 我不想吓唬任何人使用rem
,但我无法正式确认每个浏览器都16px
默认使用。您会看到,有很多浏览器,对于一个浏览器来说,与15px
或18px
. 但是,在测试中,我没有看到一个示例,其中使用默认设置的系统中使用默认设置的浏览器具有除16px
. 如果你找到这样的例子,请与我分享。