当前位置: 首页 > Web前端 > CSS

如何更愉快地使用rem——别说你懂CSS相对单位

时间:2023-03-31 10:51:15 CSS

前段时间试着翻译了KeithJ.Grant的CSS好书《CSS in Depth》,第二章《Working with relative units》,本书对相对单位的介绍units的解释和例子可以说是相当全面了。看完之后发现自己对CSS相对单位了解的不多,希望能分享给大家,于是就有了这个系列的翻译。(如有勘误或翻译建议,欢迎GithubPR^_^)《别说你懂CSS相对单位》系列翻译:如何更愉快地使用em如何更愉快地使用rem【本文】viewport相关单位的应用定义属性对应章节本文中:2.2em和rem2.2.2font-size使用rem可用性:font-size使用相对长度单位2.3停止使用像素思维,好好想想2.3.1设置合理的字体大小默认值2.3.3制作此面板“响应式”2.3.3调整各个组件的大小2.2em和rem2.2.2将rem用于字体大小当浏览器解析HTML文档时,它会创建称为DOM(文档对象模型,文档对象模型)。树形结构,每个节点代表一个元素。是最上层的节点(根节点),下面是它的子节点和,再往下是它们的子节点,还有子节点等等。根节点是文档中所有其他元素的祖先。它有一个特殊的伪类选择器(:root),可以在样式表中用这个选择器表示。使用带有类名的类型选择器html,或者直接使用标签选择器,效果是一样的。rem是词根em(rootem)的缩写。rem与根元素关联,不依赖于当前元素。无论你在文档中的什么地方使用这个单位,1.2rem的计算值都等于根元素字体大小的1.2倍。下面的示例代码中声明了根元素的字体大小,在嵌套无序列表中使用rem声明字体大小。【代码片段2.10使用rem声明字体大小】:root{1font-size:1em;2}ul{font-size:.8rem;}1伪类:root相当于html选择器2使用浏览器默认字体大小(16px)本例中root字体大小为浏览器默认字体大小16px(根元素的1em等于浏览器的默认字体大小)。无序列表的字体大小为0.8rem,计算结果为12.8px。由于这仅适用于根元素,因此即使您在列表中嵌套了列表,嵌套子列表的字体大小也保持不变。可用性:对字体大小使用相对长度单位一些浏览器会为用户提供2种自定义文本大小的方法:缩放和设置默认字体大小。通过按Ctrl+或Ctrl-,用户可以缩放页面。这会在视觉上放大或缩小整个页面上的文本或图像(实际上是所有元素)。在某些浏览器中,此更改仅针对当前选项卡且是暂时的,不会影响新打开的选项卡。设置默认字体大小会有些不同。不仅设置入口很难找到(通常在浏览器的设置页面上),而且这个设置是永久性的,直到用户恢复默认值。值得注意的是,此设置对以px或其他绝对单位定义的字体大小没有影响。因为默认字体大小对于某些用户是必需的,尤其是那些视力不佳的用户,所以您应该以相对单位或百分比来定义字体大小。rem简化了很多em带来的复杂性。事实上,rem提供了px和em之间的相对单位折衷方案,并且更易于使用。那么,这是否意味着您应该对所有元素使用rem,并摆脱其他长度单位?当然不是。在CSS的世界里,答案通常是,视情况而定。rem只是您工具箱中的一项。掌握CSS最重要的事情之一就是学会区分在哪些场景下使用哪些工具。我的选择是使用rem表示font-size,px表示border,em表示其他指标,如padding、margin、border-radius等。但是,在必要时,我更喜欢在声明容器的宽度时使用百分比。这样,字体大小就变得可预测了,当其他因素影响元素的字体大小时,也可以使用em来缩放元素的padding和margin。在边框上使用像素很好,特别是如果您想要一条漂亮的线条。以上是我对不同属性使用不同单位的理想解决方案,但同样,这些都是工具,在某些情况下,使用不同的工具可能会取得更好的效果。提示如有疑问,请将rem用于字体大小,将px用于边框,将em用于大多数其他属性。2.3停止使用像素思维去思考将页面根元素的字体大小定义为0.625em即62.5%。模型。[代码片段2.11反模式:全局定义font-size为10px]html{font-size:.625em;}我不推荐这种用法。这种用法将浏览器的默认字体大小从16px减小到10px。这样做的好处是简化了计算。如果设计师告诉你字体大小应该是14px,那么你可以很容易的计算出1.4rem。毕竟,我们仍然使用相对单位。起初,这似乎很方便,但实际上这种实现有两个问题。首先,它迫使你编写大量重复的样式代码。10px对于大多数文本来说太小了,你需要在页面上来回覆盖它。你会发现你声明一个段落(

)的字体大小为1.4rem,然后声明导航(

下一段代码是样式化的。您将使用em作为填充和边框半径,使用rem作为标题字体大小,使用px作为边框。将以下代码添加到您的样式表中。[Snippet2.14Panelusingrelativeunits].panel{padding:1em;1边界半径:0.5em;1个边框:1px纯色#999;2}.panel>h2{margin-top:0;3字体大小:0.8rem;4font-weight:粗体;4文本转换:大写;4}1使用em2进行padding和border-radius定义一个1px的细边框3去除面板上方的多余空间,更多解释见第3章4使用rem控制标题的字体大小这段代码添加了一个细边框面板并定义标题的样式。我希望标题更小,但要粗体且全部大写。(可以根据自己的设计把字号改大一点或者换个排版方式)第二个选择器>是直系后代组合子,代表.panel下的子元素h2。有关选择器和复合选择器的更完整索引,请参阅附录A。在代码片段2.13中,为了更清楚的看到效果,我在body中添加了一个classpanel-body,但是你会发现在你自己的代码中是不需要的。因为这个元素继承了根元素的字体大小,所以它已经是你想要的样子了。2.3.3使面板“响应”让我们仔细看看这个问题。可以添加媒体查询根据屏幕尺寸的变化来改变基本字体大小,这样可以使面板在不同的屏幕尺寸下有不同的尺寸变化。(见图2.8)【图2.8不同屏幕尺寸下的响应式面板:300px(左上)、800px(右上)、1440px(下)】媒体查询(mediaquery)——通过@media规则声明样式,不同下屏幕尺寸或媒体类型(如打印机或显示器),触发相应的样式控件。这是响应式设计的关键要素。有关详细信息,请参见代码片段2.15中的此示例,我将在第8章中更深入地讨论媒体查询的主题。为了实现上述效果,请将您的样式代码更改为此。[代码片段2.15]:root{1font-size:0.75em;1}1@media(min-width:800px){2:root{2font-size:0.875em;2}2}2@media(min-width:1200px){3:root{3font-size:1em;3}3}1适用于所有屏幕,但在较大的屏幕上会被覆盖2适用于宽度大于800px的屏幕,覆盖默认样式代码3适用于宽度大于1200px的屏幕覆盖上面两组样式代码。第一组样式规则声明小屏幕的默认字体大小。这是我们希望在较小的屏幕上看到的字体大小。然后使用mediaqueries以800px和1200px为两个分水岭逐级增加字体大小,覆盖默认代码。将这些字号用于页面的根元素,响应式的重新定义em和rem对应的值,从而达到响应式改变整个页面的效果。即使您没有直接对面板进行任何更改,它现在也是响应式的。在手机等小屏幕上,字体会变小(12px)。然后,在更大的屏幕上,如果宽度大于800px和大于1200px,组件的字体大小将分别被放大到14px和16px。更改您的浏览器窗口并查看组件如何更改。如果您在整个页面中严格使用这样的相对单位,整个页面将随着视口大小缩放。这将是您响应策略的重要组成部分。以上两套媒体查询声明代码可以帮助你省去在页面其他部分使用媒体查询的额外代码。但是,如果您在元素中以像素为单位声明字体大小,则不会有任何效果。同样,如果你的老板或客户认为网站当前的字体太小或太大,你可以随时修改一行代码来影响全局元素,而这种变化会影响页面上的其他元素不费吹灰之力。2.3.3缩放单个组件您还可以使用ems缩放页面上的单个组件。有时,您可能需要界面上的某些组件才能具有大版本。让我们在我们的面板上这样做,首先你需要给面板添加一个large的类名:。在图2.9中,我们看到了面板的普通版和大版的比较。效果类似于响应式面板,但两种尺寸可以同时在同一页面中使用。[图2.9一页上的正常大小的面板和大大小的面板]让我们对面板的字体大小的声明方式做一个小的修改。您仍在使用相对单位,但需要调整它们的基值。第一点是定义每个panel的父元素的字体大小为font-size:1rem。这里的意思是不管这个面板用在什么地方,每个面板的字体大小都是一定的值。第二点是用em重新声明title的字号而不是rem,这样title就可以关联到刚刚声明的父元素字号1rem。下面是相应的代码,更新你的样式表代码。[Snippet2.16createsalargeversionofapanel].panel{font-size:1rem;1个填充:1em;边框:1px实心#999;border-radius:0.5em;}.panel>h2{margin-top:0;字体大小:0.8em;2字体粗细:粗体;text-transform:uppercase;}1为组件声明一定的字体大小2其他元素的字体大小与父元素的字体大小相关联。影响面板的风格,但是现在你已经准备好了,制作一个大面板只需要一行代码。您需要做的是将父元素的字体大小重写为1rem以外的值。因为其他元素的计算方式取决于父元素的字体大小,只要修改一下,整个面板的相关大小就会发生变化。将下一个CSS片段添加到您的样式表以定义一个大面板。[Snippet2.17使用一行代码放大整个面板].panel.large{1font-size:1.2rem;}1组合选择器指向同时具有面板和大类的元素现在,您可以将class="添加到normalpanelpanel”并将class="panellarge"添加到大面板。同样,你也可以定义一个小版本,只需要将父元素的字体大小设置为小于1rem即可。如果面板是一个更复杂的组件,具有多种字体大小或填充,只要所有子元素都使用em声明,则只需一个声明即可调整它的大小。《别说你懂CSS相对单位》系列译文:如何更愉快地使用em如何更愉快地使用rem【本文】视口相关单位的应用无单位数字和行高CSS自定义属性章节:2.1相对单位值的魔力2.1.1完美像素与完美像素设计作斗争2.1.2完美像素网页的结尾像素、点和pc(pica)2.2em和rem2.2.1将em用于字体大小当我们在元素中使用em时em同时声明font-size等属性字体大小缩小问题2.2.2font-size使用rem可用性:font-size使用相对长度单位2.3停止使用像素思维,好好想想2.3.1合理设置字体大小默认值2.3。2使此面板“响应式”2.3.3调整各个组件的大小2.4视口相关单位CSS32.4.1在字体大小上使用vw2.4.2在字体大小上使用calc()2.5无单位数字和行高2.6自定义属性(也称为《CSS变量》)2.6.1动态改变自定义属性的值2.6.2通过JavaScriptValue改变自定义属性的值2.6.3自定义属性初探总结原创版权信息:作者:KeithJ.Grant书籍:CSSin深度篇:与相关单位打交道作者@YuyingWu,前端爱好者/励志老师/新西兰打工度假/铲屎官。目前就职于某大型电商公司B2B前端团队。感谢您阅读此处。如果您对以上内容有任何疑问或建议,欢迎留言。如果你和我一样喜欢前端,喜欢鼓捣独立博客或前沿技术,或者有任何专业问题,欢迎关注我,与我交流。独立博客:wuyuying.com知乎ID:@YuyingWuGithub:YuyingWu