Richard Rutter 的指南 用于设置元素的 font-size
很吸引人:他认为我们应该根据元素与页面上其他元素的关系,使用 em
和 rem
单位。
以包含两段短文的引用为例。 段落之间的间距将取决于段落文本的大小,因此您可以合理地将该间距设置为 rems 或 ems。 如果您在设计过程中决定引用应该设置得更大一些,那么段落之间的间距也必须增加。 因此,段落间距与段落文本大小直接相关,因此应被视为组件内的局部大小调整。 因此,在这种情况下,您应该使用 ems。
这与 Chris 几年前描述的方法 相辅相成。
所以这是我的想法:您仍然在文档级别保留
px
大小调整,以便您可以轻松/高效地进行大范围的大小更改。 但是页面上的每个模块都设置了一个rem
的字体大小。 实际的文本元素(h1、h2、p、li 等),如果您要对其进行大小调整,则使用em
进行大小调整,因此它们相对于模块而言。
将它们分解一下:首先,我们将使用 px
设置文档元素的 font-size
html {
font-size: 16px;
@media screen and (min-width: 900px) {
font-size: 18px;
}
@media screen and (min-width: 1200px) {
font-size: 20px;
}
}
接下来,我们将使用 em
样式化所有小的文本元素,例如段落、标题或块引用。 这是因为它们彼此之间存在关系。
h2 {
font-size: 2em;
}
pre {
font-size: 0.8em;
}
最后,我们将使用 rem
样式化这些文本片段所在的模块,以便我们可以轻松地调整它们内部的所有文本。
.module {
font-size: 1.1rem;
}
.another-module {
font-size: 1.3rem;
}
…这最终会在实践中产生类似的效果。
查看 CodePen 上 Chris Coyier 的示例 Em AND Rem (@chriscoyier)。
我们通过这样做能实现什么? 为什么我们不能只坚持使用 rem
或 em
来保持简单? 嗯,通过这种方法,每个模块都立即变成独立的,并且在将来更容易进行样式化。 但是我们也可以快速调整每个模块的 font-size
,而无需更改大量代码库。 如果我们注意到整个网站的 font-size
需要向上调整,则只需要更改一个值即可。
em
和 rem
值对于两种不同的工作非常有用,如果我们以其设计的方式使用它们,那么我们的工作可能会变得更容易维护和更灵活。
那 :root 上的 100% 呢,而不是 16px? 完全摆脱像素不是最佳实践吗?
此外,通过引用 :root 元素而不是 html 元素来利用 rem 不是更好吗?
100% 将匹配用户在浏览器中设置的字体(大多数浏览器默认情况下为 16px)。 我想这取决于您想要对根字体大小有多少控制权。
你能详细说明一下为什么在 :root 上设置比在 html 上设置更好吗? 我对此很感兴趣。
:root 选择器匹配文档的根元素。 显然,html 元素在 99% 的情况下与根元素相同(并非总是如此)。 我已经读到,最好将 :root 设置为百分比,例如 100%(或 62.5%,为了方便以后进行数学运算,因为这样 1 rem 就等于 10px),然后将 html 设置为 1 rem。
:root { font-size: 100% } 或 :root { font-size: 62.5% } // 10px
html { font-size: 1.0rem } html { font-size: 1.6rem } // 16px
不要。这样做。
@Anonymous
为什么? 是不是与
:root
有关,还是你不同意将字体百分比更改为62.5%
?不要这样做,因为如果你从未设置字体的固定大小,你将完全依赖于用户为其字体大小设置的值。 100%(或 62.5%)是某物的百分比,所以你最好描述这个某物应该是什么,而不是让用户决定。
@Jake 太棒了,你真的想剥夺用户更改其默认字体大小的权利吗?
我不想卷入评论大战。 大多数现代浏览器鼓励用户缩放整个页面,而不是只缩放字体大小——他们必须更深入地挖掘才能只更改字体大小。 考虑到这一点,即使使用非相对单位设置顶级字体声明,用户仍然可以放大和缩小。 你只是设置了一个默认大小。
我(以及其他人)想说的是,将字体设置为相对大小但没有声明它相对于什么,这是没有意义的。 大多数开发人员在设计方面付出了很多努力,为什么他们会将此细节交给机会?
@Jake 残疾人知道如何更改他们的浏览器设置,并且可以一次性定义更大的字体大小。 据我所知,缩放是基于站点的,所以他们必须在每个新访问的站点上重复缩放操作,这对他们来说真的很痛苦。
这根本不是一个细节,这里没有任何“机会”参与其中,只有可访问性,这是 W3 主要设计原则之一:https://www.w3.org/Consortium/mission.html#principles
@Jake,@nhoizey 绝对是正确的。
让我们仔细看看关于残疾人以及为什么帮助每个人访问您的内容很重要。
按照官方Web 可访问性倡议 (WAI) 的指南放大文本和图像,跳到 Chrome 帮助页面,它完美地指出了这一点。
摘自Chrome 帮助
考虑到这一点以及一些个人经验,在改进网站的可访问性(包括针对最常用的屏幕阅读器进行优化)时,我认为有必要知道,从 IE8 开始的大多数 Internet Explorer 系列的使用并不少见。 提供诸如忽略字体样式和与屏幕阅读器无缝交互等更具体的设置,使之非常容易操作。
没有人真正回答为什么不应该在根上设置字体百分比…… 在我有限的测试中,用户的字体大小首选项仍然会调整使用这种设置的文本的整体比例。
像这样的设置允许您以一种可理解的方式使用
rem
单位,因为 1rem 本质上等于 10px,并且允许所有内容根据用户字体大小首选项很好地缩放,例如.container { padding: 2rem; }
而不是.container { padding: 20px; }
@Shaw 在 html 上使用
font-size:62.5%
是一个有趣的想法早在 2004 年,但 Richard Rutter 本人在 2007 年改变了他的想法,使用font-size:100%
,即使它看起来更难(使用预处理器就不难了)。我认为,使用
font-size:62.5%
可能会导致页面中的某些元素使用10px
的字体大小,因为您忘记设置更高的值,或者它是一个您无法控制的第三方内容。 IMHO,使用font-size:100%
甚至更好,根本不设置,更安全。@nhoizey 当您在我的示例中设置
body
的font-size
时,忘记设置更高的值实际上不是问题。 除非以某种方式重置,否则一切都应该至少遵循body
的基本大小,但我避免在我的网站中包含未知的 CSS。您发送的链接根本没有提到使用
rem
单位,因为它们在 2004/2007 年并不存在。 由于em
单位的差异,在 HTML 上使用字体百分比有点 hacky,但使用rem
可以使相对于用户字体设置进行可靠的填充和边距变得极其容易。从Mozilla 关于
rem
单位的文档中,‘这个单位在创建完美可扩展的布局方面很实用。’,这正是我使用它的方式。我使用rem
还没有遇到任何问题,并且布局和文本随用户的字体和/或缩放设置很好地缩放。除非某些浏览器存在一些可访问性问题,否则我认为rem
单位没有理由不能以这种方式使用。我找到了这篇文章反对使用
rem
,声称px
单位是可扩展的。然而,px
不会随用户的字体大小设置而缩放,尽管它们会随缩放而改变。出于好奇,您如何处理支持用户
font-size
和缩放更改以及移动设备的可扩展布局?有人曾经能够放大整个网页的字体大小,而无需遍历整个 CSS 文件并重新调整许多小部分吗?
就像您决定需要 16px 的主体而不是 14px,但随后您发现某些菜单大小应该保持在 14px,并且脚注需要从 ~12px 变为 14px,而不是 13.7px。这始终是一个发现的过程,找出某些东西是按比例大小的,但并不需要按比例大小,而另一些东西则根本无法按所有大小很好地缩放。
通过一行 CSS 和大量的比例缩放彻底改变网站一直是一个美好的梦想,但多年来从未看到它成功,我开始认为这是一个空想。
我在编写 CSS 时自己的目标不是让我用一个变量改变整个设计,而是让在进行彻底改变时,很容易看到所有更改的位置。这只是编写可维护、可调试的 CSS。
全站灵活的字体大小是一个很好的例子,实用性超过了可能性。当然,最终灵活地实现可能是可能的,但对于大多数网站而言,变量实在太多了。
不过我要说,强迫自己使用更少的变量永远不是一件坏事。它可以帮助您将设计集中在更简单、更易于理解的内容上,因此,也许努力实现灵活的全局字体大小并不是一件坏事。
我完全同意你的观点,当我从事商业产品时,我从不只使用一组字体大小,而某些大小组必须根据其所在位置表现得不同。由于每个 CSS 大小属性都会影响你的布局,它会在按钮上、列内或特定布局/容器内起作用吗?这很难说,我们需要考虑所有这些情况,再加上媒体查询。我认为 REM 在简单的布局中可以很好地工作,比如文章页面或简单的博客。
我同意上面的评论,虽然它经常被用作例子,但我认为更改一个数字以影响整个文档并不是一个现实世界的例子。我坚持使用 em 作为单位,这些单位应该与排版相关,比如按钮的填充、P 和标题的边距等,但我更喜欢不要将其用于字体大小。此外,我们使用内联块作为网格布局,它依赖于 font-size: 0(是的,我们可以通过在 HTML 中做一些奇怪的事情来避免这种情况,但这不太实用),因此 em 级联会被破坏。我可以理解在块(BEM 块,而不是 display: block)上设置一个 rem 的字体大小,然后所有子元素/元素在 em 中都会保持所有东西的模块化。
不,拜托!
基线网格。我使用 EMs 来处理诸如我的字体大小或不影响基线网格的大小,以便将其隔开,但在谈论垂直间距(例如行高、边距)时,我通常会使用 REMs,除非我不认为它是基线网格的一部分(例如菜单)。
为什么你会使用与内容无关的单位来表示行高/边距?当然,line-height 1.3 会比神奇数字要合适/通用得多:/
这是一篇有趣的读物,Rob。很高兴看到关于这个主题的一些讨论。
我自己也做了一些混合使用 ems 和 rems 的实验。但我不知道它带来的“复杂性”是否值得付出努力。我所说的“复杂性”是指,难以理解单位以及它们如何对所在位置做出反应。你总是必须意识到上下文,才能充分利用这种技术。
理论上,文档的流动/节奏应该遵循一个没有废话的尺寸比例,这对于大多数情况来说应该足够了。
使用基于字体大小的缩放的很大一部分是为了利用可访问性属性(它会考虑用户输入,即缩放),而不是任意的像素值。通过将非常小的字体大小设置为组件来更改文档流会导致很多可读性问题(说的是 DOM,实际上是一系列问题),在我看来,这有点难以接受。
关于如何设置 HTML 文档,似乎有太多相互矛盾的理论。有些人主张使用 px,有些人主张使用百分比,还有些人主张使用 rems 和 ems 或者以上所有方法的组合。
就我个人而言,我想相信将 :root 或 html 设置为 100%,然后使用 rems 将是理想的方式,这样可以更好地控制布局和嵌套,而且也是移动友好的。
为什么将其设置为
100%
,而不是让默认值按原样工作,而不必在 CSS 中进行任何设置?你怎么看这个
对所有内容使用 rem(使用 px 作为备用)是不是不好的做法?
我甚至将其用于容器、填充、边距……
从样式的角度来看,使用 rems 与使用像素没有区别(浏览器仍然会计算一个 px 值),主要区别在于你失去了相对大小。例如,你可能有一个标题,字体大小为 30px,边距底部为 30px,另一个标题的字体大小为 20px——你可能不希望边距底部也为 30px(因为间距通常与大小相关,因此是无单位的行高)。相反,margin-bottom 1em 可能会更好,因为它是一个相对单位。
现实世界中 ems 和 rems 的一个简短示例
http://codepen.io/basement31/pen/JXbJYx
按钮的填充是相对于字体大小设置的,这意味着你只需要更改一个值,按钮就会保持一致。
此外,不要忘记用于媒体查询的 ems
http://blog.cloudfour.com/the-ems-have-it-proportional-media-queries-ftw/
查看该文章顶部的注释。
这是我最喜欢的概念之一,它陷入了 GlobalDeveloperConsciousness™。
@Chris 我相信 Lyza 在说“缩放行为已……变得一致”时是正确的,但这并不意味着用户更改其浏览器默认字体大小就不应该再被考虑……这两个是不同的主题,都需要基于
em
的 MQs。如果有一篇关于这个主题(排版和单位)的完整文章就好了,因为这篇文章里没有什么真正的新东西。
我最近读了一系列关于它的文章(由Zell Liew撰写),并且已经对模块化比例、“响应式”视窗基于的字体大小、垂直节奏等有所了解……这促使我了解更多关于它的知识,而且我对在 CSS-Tricks 上找到任何合成内容感到有点失望(请把它看作是褒奖,因为 99% 的时间它都是金矿)。
我也想知道在 :root 而不是 html 甚至 body 上设置全局字体大小有什么区别。在我的大多数项目中,我完全避免更改全局字体大小,所以对我来说这不是一个问题,但我可以看到,通过为设置浏览器字体大小的用户使用像素来修复它会产生一个问题。好吧,这样做的人应该不多,但我们必须假设他们这样做是有充分理由的,而我们通过设置一个至少不是相对的单位完全忽略了这些理由。
我不相信在 rem 中设置模块的字体大小。为什么不使用 em 设置,因此与根字体大小相关?假设我们使用 BEM,并且为每个块设置一个 rem 的字体大小。按钮将是一个块。一个次级块,其根字体大小更小,并且包含此按钮,会将其显示得太大。
关于使用单个声明响应式地更改字体大小,Mike Rithmuller Mike Rithmuller一年前写了一篇关于基于视窗宽度的响应式排版方法的文章,其中使用像素表示最小值/最大值(最终针对多个视窗不同)。这不是理想的,因为我们并不总是需要减小/增大字体大小才能实现响应式,相反,我们更喜欢更改布局。
非常好
Re: { font-size: 62.5% }
简而言之:为了避免问题,直接将根元素设置为px。
详细解释:我刚刚接到一位设计师的电话,他想知道为什么他的设计都乱了,因为他将浏览器设置为10px。我为了寻找“为什么使用CSS rem”的答案找到了这个页面,并查看了一些参考页面。
浏览器偏好似乎已经成为了一个被遗忘的功能,而且尊重浏览器偏好的做法也越来越少。在根元素上使用绝对值可以很好地实现缩放,它只是忽略了我们“可以”尊重这些设置的事实。