为什么你永远不应该在CSS中使用px来设置字体大小

这篇具有很好参考价值的文章主要介绍了为什么你永远不应该在CSS中使用px来设置字体大小。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

为什么你永远不应该在CSS中使用px来设置字体大小

 文章来源地址https://www.toymoban.com/news/detail-427408.html

代码部署后可能存在的BUG没法实时知道,事后为了解决这些BUG,花了大量的时间进行log 调试,这边顺便给大家推荐一个好用的BUG监控工具 Fundebug。

在Josh Collinsworth的博客文章“永远不要用px作为字体大小”中,作者讨论了为什么不应该使用像素(px)作为网页字体大小的单位[1]。作者指出,相对于容器、浏览器或用户的字体大小,px值是静态的。无论用户的字体偏好设置如何,当我们以静态像素设置值时,它将覆盖用户的选择,以我们指定的确切值替代。这意味着,如果我wu7的样式表使用像素单位,可能导致访问网站的用户难以阅读。

因此,作者建议使用相对单位,如em、rem或百分比,而不是像素。这些单位是基于用户的字体大小偏好设置进行缩放的,从而提供了更好的可访问性和可读性。尤其是在设计响应式网站时,相对单位能够提高跨设备的兼容性。通过使用相对单位,设计师可以确保网站在不同设备和浏览器中以合适的字体大小显示[1]。

下面是正文:

在 Web 开发领域中,有很多误解流传,即使它们被反驳了很多次也仍然存在。"外部链接应该总是在新标签页中打开" 就是一个很好的例子。CSS Tricks 在将近十年前就对此进行了详细的解释(简而言之:大多数情况下是错误的),但它似乎仍然在某些角落中存在。

案例证明:在CSS中, px , em 或 rem 单位之间没有功能上的区别的想法是一个我一遍又一遍听到的误解,因此我想在这里发帖来解决这个问题。

我们要非常清楚:在CSS中使用的单位绝对很重要。并且在设置时 font-size 应尽可能避免使用 px 。

我们在谈论什么单位,它们是做什么的?

在我们讨论为什么应该避免使用 px 作为 font-size 之前,让我们确保我们都清楚我们正在谈论哪些单位,以及它们的一般行为。

px

px 是像素的缩写……虽然现在大多数情况下它不再是一个真正的像素。在显示器通常是一个相对可预测的低分辨率像素比例,比如1024×768的时代, 1px 通常等于屏幕上的一个实际像素。

屏幕使用称为像素的彩色光点阵来显示图像。一个像素是显示器上的一个彩色光点;硬件能够呈现的最小可能的“点”。这就是我在本节中所说的“字面上的”、“实际的”或“设备”像素;物理世界中的一个像素。

然而,当高分辨率(有时称为“视网膜”)屏幕出现时,设备开始将更多的像素压缩到更小的空间中,这些物理设备像素变得非常微小。在高分辨率屏幕上浏览网页,如果CSS中的 1px 仍然对应于一个字面设备像素,那么甚至阅读任何内容都将非常困难,因为像素本身正在迅速缩小。毕竟,现代智能手机的分辨率甚至比高清电视还要高。

所以现在, 1px 通常对应于放大的“缩放”像素的大小,而不是实际硬件上的字面像素。在我们的 CSS 中, 1px 的东西可能会占用多个物理硬件像素,而我们没有任何纯 CSS 的方法来指定一个字面设备像素。但这没关系,因为它们通常太小了,我们不想去处理它们。

一个例子:iPhone 14 Pro 上的像素非常微小,16px 在字面上的设备像素大小大约相当于2pt字号的印刷字体大小。好在浏览器为我们缩放了它们!

大多数情况下,这些并不在本讨论的语境中真正重要,但我认为了解这些还是很好的。重要的部分是: 1px 等于浏览器视为单个像素的任何内容(即使在硬件屏幕上它不是真正的像素)。

em 和 rem

这就带我们来到了 em 和 rem ,它们彼此相似。继续讲述不严格相关但仍然有趣的小知识: "em" 是一个排版术语,实际上比计算机早了几十年。在排版上,一个 em 等于当前字体大小。

如果你将字体大小设置为 32pt(“pt”是另一个仍然有时使用的旧排版术语),那么 1em 就是32pt。如果当前字体大小为 20px ,那么 1em = 20px

在网页上,默认字体大小为 16px 。一些用户从不更改默认设置,但许多人会更改。但默认情况下, 1em 和 1rem 都将等于 16px 。

“Em” 最初是指 “M” 字符的宽度,这也是名称的由来。但现在它指的是当前字体大小,而不是特定字形的尺寸。

EM 和 REM 之间的区别

为了区分这两者: 1rem 始终等于浏览器的字体大小,或者更准确地说是 html 元素的字体大小。 rem 代表“根em”,而网页的根是<html>标签。因此, 1rem = document  字体大小。(默认情况下,这是 16px ,但可以被用户覆盖。)

另一方面,em是当前元素的字体大小。看下面的CSS:

.container {

  font-size: 200%;

}

p {

  font-size: 1em;

}

考虑到上述 CSS, .container 元素内的段落将会变成原来的两倍大小。这是因为 1em 表示“当前字体大小”,在 .container 内,它是200%。 1em × 200% = 2em (默认为 32px )。

然而, .container 元素外的段落仍将是 1em 的正常字体大小(默认为 16px )。

如果我们在上面的CSS中将 em 更改为 rem ,那么所有段落标签的字体大小将始终是浏览器的默认大小,无论它们在哪里。

font-size: 1em 等同于 font-size: 100% 。 em 和 % 单位在其他情况下并不总是等价的;例如, width: 1em 和 width: 100% 很可能会非常不同,因为此时百分比是基于父容器的宽度而不是其字体大小。但是,就 font-size 属性而言, % 和 em 是相同的。

总结一下:

  • 1em 是当前元素的字体大小。

  • 1rem (根em)是文档的字体大小(即浏览器的字体大小)。

好的,那就是单位的含义和来源。现在让我们回答为什么使用哪个单位很重要。

为什么这一切都很重要

再次强调的误解是:既然 1em 和 16px 相等,那么选择哪个单位并不重要。这似乎是合理的;如果 16px = 1rem ,那么选择哪种方式输入似乎并不重要。

记住, em 和 rem 是相对的;默认情况下,它们都(最终)基于浏览器的字体大小。

2rem 是浏览器字体大小的两倍; 0.5rem 是其一半,依此类推。因此,如果用户更改其首选字体大小,如果使用 em 和 rem ,则网站上的所有文本都会相应更改,就像应该的那样。 2rem 仍然是该字体大小的两倍; 0.5rem 仍然是其一半。

相比之下, px 值是静态的。无论容器、浏览器或用户的字体大小如何, 20px 只是 20px 。当设置静态像素值时,无论用户的字体偏好大小如何,它都会覆盖该选择并使用指定的确切值。

批判性地说,这意味着如果你的样式表使用 px 在任何地方设置 font-size ,那么基于该值的任何文本都将无法由用户更改。

那是非常糟糕的事情。它是不可访问的,甚至可能会阻止某人完全使用该网站。

因此,虽然可能存在一些有效的用例来解释这种行为,但它绝对不是你想要的默认行为。

这也是避免使用视口单位(如 vw 或 vh )设置字体大小的非常好的理由。它们也是静态的,用户无法覆盖。 最多,像 calc(1rem + 1vw) 这样的值可能是可以接受的,因为它仍然包含 rem 作为基础。即便如此,我仍建议使用 clamp() 或媒体查询来设置最小和最大值,因为屏幕尺寸往往远远超出我们所期望或测试的范围。

超出字体大小的差异

好的,现在让我们谈谈当我们不特别处理 font-size 属性时, px 和 em / rem 如何变化。

开发人员通常通过缩放页面来进行测试,我认为这就是本文中心误解的来源。当你缩放时,所有内容都会被缩放(放大或缩小),在这种情况下,选择 px 或 em / rem 作为你的CSS单位通常并不重要。就缩放而言,两者的行为方式相同。而且,大多数视力良好的开发人员可能不会意识到其中还有更多内容。然而,棘手的问题是:

即使超出 font-size , px 的行为也与 em 和 rem 不同。

px 单位仍然与屏幕上像素的缩放值相关联。 em 和 rem 与文档的字体大小相关联,而不是页面的缩放或比例。

为了演示,请看这个 CodePen:

codepen.io/collinswort…

我们有几个段落,每个段落底部有 2px 边框,并且它们之间有 20px 边距。请注意,我们对两者都使用 px 单位。

如果你放大或缩小,元素的大小和距离保持相对不变。也就是说:你放大得越多,那条线就越粗,段落之间的间距就越大。

为了方便起见,这里有一张截图,显示了同一支笔的400%缩放。文本、线条和间距都变大了4倍;它们相对于彼此的大小保持不变:

为什么你永远不应该在CSS中使用px来设置字体大小

当涉及到缩放时, px 、 em 或 rem 之间没有真正的区别。但缩放并不是用户使网站更易用的唯一方法。

如前所述,用户还可以指定默认和/或最小字体大小。当他们这样做时,功能开始分歧。

在下面的截图中,我已将Firefox的默认字体大小设置为 64px 。看一下:

为什么你永远不应该在CSS中使用px来设置字体大小

将屏幕截图中的文本与其上方的文本进行比较。请注意,这一次,行并没有变粗,段落之间的边距也没有成比例增加。只有文本本身变大了。因为边框宽度和边距都是在 px 中设置的,它们保持不变,不会缩放。

但是请注意,如果将CSS中的 px 更改为相应的 rem 值,会发现线条和间距确实变大了! (zh-Hans)

为什么你永远不应该在CSS中使用px来设置字体大小

所以,这里的总结是:

  • 当用户更改字体大小时, px 值不会缩放。

  • em 和 rem 的值会随字体大小成比例调整。

如果你想要一个交互式演示,将所有这些内容联系在一起,请查看最终的 CodePen;调整顶部的滑块以查看修改文档字体大小对各种元素的影响,基于它们使用的 CSS 单位。 codepen.io/collinswort…

选择哪一个

因此,知道 em 和 rem 会随字体大小缩放,但 px 值不会,那么我们该怎么办?我们应该永远不使用 px 吗?

虽然我认为如果你选择这条路,你可能会没事,但我仍然认为 px 有其存在的意义。

我们知道当用户调整字体大小时 px 值不会改变,这意味着像素单位实际上是某些美学元素的不错选择。也许我们有一定的间距,我们不希望在字体大小变大时变得更大。(如果默认情况下是一个大块的负空间,也许允许它缩放到更大的尺寸是没有意义的。)

也许有一些边框大小我们不想改变,或者页面上有用 CSS 创建的装饰元素,在更大的字体大小下看起来效果不佳。也许我们不希望填充随着字体大小的增加而膨胀。在所有这些情况下, px 仍然是一个不错的选择。

我个人建议使用 rem 来设置所有的大小。我只在想要与当前字体大小成比例的东西(例如,与一些文本旁边的图标应该与字符的高度完全相同,并且在一侧有半个字符的情况)中添加 em 。我不会在任何地方使用 px ,除非是明确不想随字体大小缩放的设计元素。

永远不要用 px 单位中设置 font-size ,除非你非常确定你在做什么,它会如何行动,以及在你这样做时它是否仍然可访问。

关于媒体查询的重要说明

出于与上述所有原因相同的原因,重要的是要避免在 @media 查询中使用 px ;当用户缩放时,它将正常工作,但是使用 px 的媒体查询将在用户自己设置更大的字体大小时失败。

@media (min-width: 800px) {

  /* Changing font size does NOT affect this breakpoint */

}

@media (min-width: 50rem) {

  /* Changing font size DOES affect this breakpoint */

}

 

这是因为随着字体大小的增加, 50rem 会根据用户的偏好变成不同的值,而 800px 则不会。

很可能,当我们为较大的断点编写CSS时,我们认为有足够的屏幕空间让元素扩展。如果用户设置了非常大的字体大小,则可能不是这种情况,将媒体查询设置为 rem 而不是 px 可以帮助我们避免这种假设并响应用户的偏好。

我在这个网站上遇到了这个问题;我把所有的断点都设置在 px 上。然而,当我将默认字体大小设置得更大时,我的媒体查询没有响应,因为它们仍然只查看屏幕的像素宽度。因此,我仍然有一个微小的侧边栏,里面塞满了难以辨认的巨大文本,因为我没有考虑用户的偏好。在那之后,我立即改为 rem ,问题得到了解决。

简而言之:在媒体查询中,除非您确定自己知道在浏览器中设置自己的字体大小会对用户产生什么影响,否则一定要避免使用 px 。

 更多内容请点击:开发者网站---为什么你永远不应该在CSS中使用px来设置字体大小

 

到了这里,关于为什么你永远不应该在CSS中使用px来设置字体大小的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • spark中为什么要设置宽窄依赖

    宽依赖指的是两个或多个任务或数据之间具有较强的依赖关系。也就是说,在执行某个任务之前,需要先完成其他几个任务。宽依赖通常会导致任务串行执行,因为一个任务的开始必须等到其它任务的结束。这种关系会增加系统的延迟和执行时间。例如,如果任务A依赖于任务

    2024年02月12日
    浏览(32)
  • 什么是IP白名单?为什么要设置IP白名单?

    在互联网的世界里,IP地址是每个设备与网络进行通信的关键标识。然而,并不是所有的IP地址都可以无限制地访问所有网络资源。为了保障网络安全和资源管理,很多网站和服务会设置IP白名单。本文将详细介绍IP白名单的定义、作用以及为什么要设置IP白名单。 1、IP白名单

    2024年04月16日
    浏览(37)
  • 网通光纤路由器怎么设置为什么提示帐户密码错误

    最近小编因为工作原因又要搬家,新房东家是网通光纤宽带,是光纤进楼后先进的光纤接受器,看外观像是大的交换机。然后每个房间一条网线可以直接插入电脑,找房东开个帐户然后买张冲值卡,下载一个新的连接客户端,输入帐户密码就可以上网了.家里两台电脑需要上网

    2024年02月06日
    浏览(34)
  • 录屏为什么没有声音?两个步骤检测你的电脑设置

    很多小伙伴在录制完电脑屏幕后,会发现一个问题:录制的电脑屏幕文件只有画面,没有声音。 录屏为什么没有声音? 怎样才能录制有声音的视频?导致录屏没有声音的原因有很多。 下面小编就教您两个步骤检测您的电脑设置,然后手把手教您如何录制带声音的录屏文件,

    2024年02月11日
    浏览(40)
  • 【word密码】Word 文档设置了只读为什么还能编辑?

    有些朋友可能会遇到这种疑问,为什么我的Word文档设置了只读模式,还是可以编辑的,这是什么原因呢? 其实是因为大部分的只读模式,设置完成之后都是可以编辑的,但是当我们进行保存的时候就会发现,word提示需要重命名并选择新路径才能够保存。 这种操作,即使可以

    2024年01月25日
    浏览(47)
  • C++中为什么不能把所有函数都设置成虚函数?

    在面试的时候被问到一个问题,既然虚函数可以不被重写,为什么不把所有的函数都设置成虚函数? 我当时的回答是,因为对于工程来说,一个类里可能会有很多的函数,都设置成虚函数的话会有很多不必要的开销(虚函数表)。但总觉得回答不够完善,所以闲下来去了解了

    2023年04月12日
    浏览(28)
  • 解决mysql的启动类型设置了自动,为什么电脑开机后还是需要手动启动?

    问题: 明明mysql的启动类型设置了自动,为什么电脑开机后还是需要手动启动,如下图。  解决方式: 一、ctrl+R 快捷键弹出运行框  二、输入 regedit 后回车  三、地址栏内输入  计算机HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControl 后回车    四、找到Control入径后,新建一个名称为

    2024年02月14日
    浏览(37)
  • 小米路由器mini如何设置路由器上网为什么打不开网址

    最近有些朋友入手了小米路由器mini,出现不会设置路由器上网的情况,其实小米路由器设置上网的过程很简单,只是有些人看了说明书反而被卡住在说明书上的第3步,拼命打开网址就是进不了,下了小米路由器的APP也进不了,其实这时只要输入IP地址 192.168.31.1就可以解决问

    2024年02月07日
    浏览(43)
  • Unity半透明特效原理讲解(为什么半透明设置渲染顺序和深度写入这么重要)

    最近要实现一个透明的特效,所以更仔细的去学了一下。但是网上更多的是用文字讲解,实验做的相对较少,因此我在这里会更多的附上实验效果展示和结论。若有理解错误的地方,欢迎讨论。 摄像头看向两个Cube,红Cube在前,蓝Cube在后 效果: 解析: 红蓝Cube使用相同的S

    2024年02月06日
    浏览(30)
  • MDK keil为什么设置代码自动补全功能页面空白,不是汉化问题造成的

    这个问题在论坛上已经有很多回答,例如 http://t.csdn.cn/jtdB9 http://t.csdn.cn/0jSfN http://t.csdn.cn/D2wlk 但大多数都忽略了另一个原因——打开了51工程。其中第三篇提到了这个原因,但解决方案不够准确。 我来说一下这个问题,如上所述,除了汉化原因外,还有一个重要原因就是Ke

    2024年02月13日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包