rem 是相对文档根元素(html)字体大小的尺寸单位,当元素的尺寸或文字字号等使用 rem 单位时,会随着根元素的 font-size 变化而变化,那么在不同分辨率的设备下动态设置根元素的字体大小就可以实现页面自适应。那么如何动态设置呢,看到很多文章都讲的是使用js获取设备屏幕尺寸来操作,而我在工作中一直使用的方法是通过设置文档根元素 font-size: calc(100vw/18.75) 来实现 rem 自适应。

  以常见的750px的设计稿为例,如果想要规定1rem = 40px(基准值,后面会讲到),便是设置 html { font-size: calc(100vw / 18.75) }

  其中,100vw是设备视口的总宽度,当设备的宽与设计稿的等宽时,则此时有:

  100vw = 750px => 1px = 100vw / 750

  如果设置基准值为 1px,则 1rem = 1px,代码则是 html { font-size: calc(100vw / 750) }

  但是一般不会设置为1px,而是设置10px、20px或者40px,即1 rem等于10px、20px 或者 40px ,以 1rem = 40px为例,则此时有:

  40px = 40 * 100vw / 750 => 40px = 100vw / (750 /40) => 40px = 100vw / 18.75 即 1rem = 100vw / 18.75,所以设置 根元素字体大小为 calc(100vw / 18.75) 即可。

  现在 750px的设计稿中有一个400*200的div元素,我们在样式中如果写

  div {
  width: 400px;
  height: 200px;
  }

  那么无论设备的尺寸如何,这个元素的宽高始终都是固定的400*200,缺少灵活性,所以需要使用 rem 单位做自适应,现在设置文档根元素字体大小为 calc(100vw / 18.75) },即 文档中 1rem = 100vw / 18.75 ,

  div {
  width: 10rem;
  height: 5rem;
  }

  当屏幕尺寸为 750px时,该元素的宽为:

  10rem = 10 * 100vw /18.75

  =>10rem = 10 * 750px / 18.75

  =>10rem = 10 * 750px / (750 / 40)

  =>10rem = 400px

  当屏幕尺寸为 375px时,该元素的宽为:

  10rem = 10 * 100vw / 18.75

  =>10rem = 10 * 375px / (750 / 40)

  =>10rem = 200px

  可以看到,元素尺寸随着设备尺寸的变化,同时发生了变化,这就是 rem 自适应的能力。

  第一次看这个方法,会觉得有点绕,为什么写样式的时候明明已经知道1rem等于多少px了,实际的rem却不是我们写样式时用来换算的那个值呢?根据我的理解,写样式时换算用的1 rem = 40px,称为基准值,先用这个基准值把设计稿的尺寸全部换算成单位为rem 的大小,然后当页面渲染时,根元素的字体大小会决定样式表生效时 1rem到底等于多少px,这时再把样式中的尺寸换算成以px 为单位的值。而我们设置根元素的字体大小时假定的1rem = 40px,也是用于换算的基准值40px,并不是页面渲染时1rem真的就等于 40px。

  总结一下就是,在写样式时,我们不知道设计稿与实际显示设备的宽度关系,先假定设计稿与设备同宽,此时我们需要一个基准值来将设计稿上元素的尺寸换算成rem,同时设置根元素字体大小时也使用该设计稿本身的宽和相同的基准值,即我们换算用40px,那么在写calc时也是40px,即:

  100vw = 750px => 1px = 100vw / 750=> 40px = 40 * 100vw / 750

  其中750是设计稿的宽,当设计稿是其它尺寸时,记得要换成设计稿对应的宽,如1920px。当设备与设计稿不同宽时,通过rem会等比例变化元素的尺寸而自适应。

  感觉自己懂了,但是写出来又感觉没讲清楚,有待进一步学习。

彻底弄懂设置根元素字体大小calc(100vw/18.75) 实现rem自适应的更多相关文章

  1. 字体大小之px、em、rem、pt,字号详解

    PX px像素(Pixel).相对长度单位.像素px是相对于显示器屏幕分辨率而言的. 是一个虚拟长度单位,是计算机系统的数字化图像长度单位,如果px要换算成物理长度,需要指定精度DPI(Dots Pe ...

  2. pycharm设置开发模板/字体大小/背景颜色(3)

    一.pycharm设置字体大小/风格 选择 File –> setting –> Editor –> Font ,可以看到如上界面,可以根据自己的喜好随意调整字体大小,字体风格,文字 ...

  3. Android项目实战(二十三):仿QQ设置App全局字体大小

    一.项目需求: 因为产品对象用于中老年人,所以产品设计添加了APP全局字体调整大小功能. 这里仿做QQ设置字体大小的功能. QQ实现的效果是,滚动下面的seekbar,当只有seekbar到达某一个刻 ...

  4. 【转】android webview设置内容的字体大小

    Enum for specifying the text size. SMALLEST is 50% SMALLER is 75% NORMAL is 100% LARGER is 150% LARG ...

  5. Eclipse设置问题:字体大小、修改注释内容、修改快捷键

    一.设置字体大小,看下图,包括了设计代码字体大小和控制台输出字体大小 二.修改注释内容 选择window---->>preferences 选择Java---->>code s ...

  6. Eclipse Java注释模板设置简介,更改字体大小

    为类添加注释:此为我的模板设置注释模板的入口: Window->Preference->Java->Code Style->Code Template 然后展开Comments ...

  7. js动态设置根元素的rem方案

    方案需求: rem 单位在做移动端的h5开发的时候是最经常使用的单位.为解决自适应的问题,我们需要动态的给文档的根节点添加font-size 值. 使用mediaquery 可以解决这个问题,但是每一 ...

  8. Android textview 设置不同的字体大小和颜色

    在实际应用中,需要将一个字符串已不同的颜色,字体显示出来.当然完全可以通过不同textview拼接出来.也可以通过一个textview来展示. 步骤如下: 1.定义不同style . 不妨如下定义2个 ...

  9. html5移动端页面分辨率设置及相应字体大小设置的靠谱使用方式

    对于html5移动端网页编写CSS网上有很多介绍的文章,但在实际使用过程中还是会纠结. 网上的资料太多,且大多都是技术介绍型,特别是针对android上,网上写的各种麻烦,各种复杂,各种不接地气儿.. ...

随机推荐

  1. Appium 用途和特点

    Appium 是一个移动 App (手机应用)自动化工具. 手机APP 自动化有什么用? 自动化完成一些重复性的任务 比如微信客服机器人 爬虫 就是通过手机自动化爬取信息. 为什么不通过网页.HTTP ...

  2. mybatis基础使用

    MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis .20 ...

  3. vant实现下拉多选组件

    1.最近需要做一个移动端多选的功能,发现vant上没有多选的下拉组件,于是决定写一个,样式如下 调用部分传入值 propsselect-data-opts 传入list数据, disabled 下拉是 ...

  4. osgEarth使用笔记1——显示一个数字地球

    目录 1. 概述 2. 实现 2.1. 三维显示 2.2. 二维显示 1. 概述 osgEarth支持.earth格式的文件,里面保存了数字地球相关信息的配置XML,只需要读取这个配置文件,就可以直接 ...

  5. Java 集合 | 红黑树 | 前置知识

    一.前言 0tnv1e.png 为啥要学红黑树吖? 因为笔者最近在赶项目的时候,不忘抽出时间来复习 Java 基础知识,现在准备看集合的源码啦啦.听闻,HashMap 在 jdk 1.8 的时候,底层 ...

  6. 9.23 T1 tree

    题意描述: 给你一个长度为 \(n\) 的序列,让你从中选出 \(k\) 个数组成一个集合,定义这个集合的极限高度为\(a_i...a_k\) 的最大值. 让你求所有的集合极限高度 之和对 \(100 ...

  7. Jetson AGX Xavier/ubuntu查找文件

    用以下命令查找文件 sudo updatedb locate xxx #xxx是文件名 如果找不到命令,则需要安装mlocate sudo apt-get install mlocate

  8. mac常用指令

    mkdir demo //创建一个文件夹 touch index.html // 创建一个html文件 rm rouch index.html //删除找个index.html文件 rmdir dem ...

  9. 你知道CPU结构也会影响Redis性能吗?

    啦啦啦,我是卖身不卖艺的二哈,ε=(´ο`*)))唉错啦(我是开车的二哈),我又来了,铁子们一起开车呀! 今天来分析下CPU结构对Redis性能会有影响吗? 在进行Redis性能分析的时候,通常我们会 ...

  10. EntityFramwork基础用法

    一.EntityFramework(简称"EF")是什么? 在.NET3.5之前,我们经常编写ADO.NET代码或通过封装好的数据库访问层来与数据库进行交互,进行CRUD操作.这种 ...