深入了解 CSS 中的 rem 单位,它是具有良好浏览器支持的相对大小调整的单位,这里来学习如何有效地使用它们。

什么是 rem 单位?

rem(font size of the root element)是指相对于根元素的字体大小的单位。简单的说它就是一个相对单位。看到rem大家一定会想起em单位,em(font size of the element)是指相对于父元素的字体大小的单位。它们之间其实很相似,只不过一个计算的规则是依赖根元素一个是依赖父元素计算。

根据 W3C 规范,一个对象单位的定义是:

相对于根元素上font-size的计算值。 在根元素的font-size属性中指定时,rem单位是指属性的初始值

这意味着1rem等于html元素的字体大小(对于大多数浏览器而言,其默认值为16px)。

Rem 单位 VS Em 单位

em 单位的主要问题是它们与自己元素的字体大小有关。因此,它们可能会层叠起来并导致意想不到的结果。让我们考虑一下下面的例子,如果根字体大小是默认的16px,我们希望列表的字体大小为12px:

<style type="text/css">html{font-size: 100%;}ul{font-size: 0.75em;}
</style><body><ul>你好<ul>你好</ul></ul>
</body>

上面可以看到我们本来是想让所有列表的字体大小为 12px,但是如果我们在另一个列表中嵌套了一个列表,那么内部列表的字体大小将是其父列表的75% (在本例中为9px)。

我们仍然可以通过以下方法来解决这个问题:

ul ul {font-size: 1em;
}

这里是可以解决问题,但是我们仍然必须得非常注意嵌套变得更深的情况。

有了 rem 单位,事情就简单多了:

html {font-size: 100%;
}ul {font-size: 0.75rem;
}

由于所有大小都是根据字体大小引用的,因此不再需要在单独的声明中覆盖嵌套大小写。

带Rem单位的字体大小

使用rem单位进行字体大小调整的先驱之一是Jonathan Snook,他在2011年5月发表了REM字体大小调整文章。像其他许多CSS开发人员一样,他不得不面对em单位带来的复杂布局问题。

在那个时候,旧版本的 IE 仍然有很大的市场份额,他们不能放大文本的大小与像素。然而,正如我们在前面看到的,使用 em 单位很容易丢失嵌套的轨迹并得到意想不到的结果。

将 rem 用于字体大小调整的主要问题是,这些值有点难以使用。让我们来看一些常见的字体大小的例子,这些字体大小以 rem 单位表示,当然假设基本大小是16px:

10px = 0.625rem
12px = 0.75rem
14px = 0.875rem
16px = 1rem (base)
18px = 1.125rem
20px = 1.25rem
24px = 1.5rem
30px = 1.875rem
32px = 2rem

正如我们所看到的,这些值对于计算来说不是很方便。出于这个原因,Snook使用了一个叫做“62.5% ”的技巧。无论如何,这并不是一个新发现,因为它已经与em单位一起使用:

body { font-size:62.5%; } /* =10px */
h1 { font-size: 2.4em; } /* =24px */
p { font-size: 1.4em; } /* =14px */
li { font-size: 1.4em; } /* =14px? */

由于 rem 单位相对于根元素,Snook 的解决方案变为:

html { font-size: 62.5%; } /* =10px */
body { font-size: 1.4rem; } /* =14px */
h1 { font-size: 2.4rem; } /* =24px */

这里可以看到,实际 px 除以10就可以得到 rem大小。这里还必须考虑到其他不支持 rem 的浏览器。因此上面的代码实际上是这样写的:

html {font-size: 62.5%;
}body {font-size: 14px;
font-size: 1.4rem;
}h1 {font-size: 24px;
font-size: 2.4rem;
}

尽管此解决方案似乎接近“黄金法则”的地位,但有人建议不要盲目使用它。 哈里·罗伯茨(Harry Roberts)就使用 rem 单位发表了自己的看法。 他认为,尽管62.5%的解决方案使计算更加容易(因为px中的字体大小是其rem值的10倍),但它最终迫使开发人员明确地重写他们网站上的所有字体大小。

但是这也是国内移动端布局最常用的一种方法。

我们就在这里结束对 CSS rem 单位的介绍了。我们来说一下他的优点,这里就不用了案例来演示了,大家可以自己尝试一下。

在我们的代码中使用这些单位有很多优点,比如响应性可伸缩性改进的阅读体验以及在定义组件时更大的灵活性。rem 单位不是通用的万能解决方案,但是通过精心部署,它们可以解决许多困扰开发人员多年的问题。这取决于我们每个人去释放 rem 的全部潜力。

在react next 中使用rem_CSS中的rem:了解和使用rem单位相关推荐

  1. 我如何使用React和Typescript在freeCodeCamp中构建天气应用

    by Kelvin Mai 通过凯文麦 我如何使用React和Typescript在freeCodeCamp中构建天气应用 (How I built the weather app in freeCo ...

  2. [react] 你有在项目中使用过Yeoman脚手架吗?

    [react] 你有在项目中使用过Yeoman脚手架吗? 前端工程化脚手架部分必备的依赖,用于初始化生成规范的项目目录 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放弃很容易, 但坚持一定很酷. ...

  3. react回调函数_React中的回调中自动绑定ES6类函数

    在使用ES6类的React组件时,您必须遇到这种现象,必须显式绑定类函数,然后将其传递给诸如onClick.例如,采用以下示例. import React from 'react';class MyC ...

  4. react dispatch_记 react 项目在 TypeScript 化中的一个坑,以及相应的类型改动

    最近向 @types/react 提交了一个变动,改动了 useReducer 的定义,相信各位读者如果要 TypeScript 化,或者已经 TS 化的话,有可能会收到影响. 通过安装 @types ...

  5. antd中table组件中如何进行换行操作(react中)

    antd中table组件中如何进行换行操作(react中) 说明 效果 数据 代码 说明 react项目,遇到某字段对应的单元格内需要换行. 最初想偷懒,尝试了在数据中加入回车.使用模板字符串.转义字 ...

  6. 大道至简——React Native在直播应用中的实践

    声明:本文来自「七牛云主办的架构师实践日--亿级移动应用架构最佳实践」的演讲内容整理.PPT.速记和现场演讲视频等参见"七牛架构师实践日"官网. 嘉宾:卜赫,七牛云布道师. 责编: ...

  7. C#中Winform程序中如何实现多维表头【不通过第三方报表程序】

    问题:C#中Winform程序中如何实现多维表头. 在网上搜了很多方法,大多数方法对于我这种新手,看的都不是很懂.最后在新浪博客看到了一篇比较易懂的文章:[DataGridView二维表头与合并单元格 ...

  8. 关于python缩进的描述中_关于Python程序中与“缩进”有关的说法中,以下选项中正确的是()...

    关于Python程序中与"缩进"有关的说法中,以下选项中正确的是() 答:缩进在程序中长度统一且强制使用 同文学或同音乐主题的民歌,<_______>是其中之一.此曲经 ...

  9. python中json dumps_python中json.loads,dumps,jsonify使用

    search_info = {'id':132,'user_role':3} print type(search_info) #输出 #转为string用dumps print type(json.d ...

最新文章

  1. c语言程序解决生活中的问题作文,生活中烦恼的事五年级满分作文
  2. Git - 使用指南
  3. 卢克增加服务器,DNF卢克跨区服务器崩溃?策划:暗制造者临时加入安图恩攻坚...
  4. 极致cms1:1精仿资源哟源码
  5. Python数据分析学习笔记01:安装相关软件、导入扩展模块与集成开发环境
  6. 5 thinkpad 黑将评测_ThinkPad L380视频评测:全能型商务助手
  7. pppoe路由桥混合模式_192.168.1.1路由器怎么设置和登陆
  8. 关于sublime出现PyV8binary错误
  9. 揭开互联网金融健康发展意见神秘面纱
  10. 中兴捧月算法-切绳子
  11. java常用单词及解释_Java常用英语单词
  12. ibm大型机服务器虚拟化,PowerVM:IBM小型机虚拟化的利器
  13. BZOJ3560 DZY Loves Math V
  14. 网吧管理系统C语言作业,C语言课程设计-网吧管理系统.doc
  15. 解决QQ或者谷歌不能联网而其他浏览器能运行的问题
  16. Mysql 慢日志查询小于1000ms显示0s问题排查
  17. 心理学统治世界(1)——股民的圣经
  18. JavaScript最全面试题
  19. java clob http传送_JAVA CLOB作为参数传给ORACLE后台
  20. [交互][FWT] UOJ #328. 【UTR #3】量子破碎

热门文章

  1. Numpy与Pandas基础
  2. 史上最全的长读长数据校错方法大比拼
  3. vue element ui 滚动条
  4. windows10安装docker
  5. 大数据分布式集群搭建(7)
  6. 目标检测--Enhancement of SSD by concatenating feature maps for object detection
  7. 【Dual-Path-RNN-Pytorch源码分析】AudioReader
  8. jquery 使用小技巧
  9. 记一次Java多线程程序调试经历:HttpClient 死锁
  10. LeetCode 动态规划(Dynamic programming)系列题目--C++,Python解法