当前位置: 首页 > news >正文

rem是什么?

rem这是个低调的css单位,近一两年开始崭露头角,有许多同学对rem的评价不一,

有的在尝试使用,有的在使用过程中遇到坑就弃用了。但是我对rem综合评价是用来

做web app它绝对是最合适的人选之一。

rem是什么?

    rem(font size of the root element)是指相对于根元素的字体大小的单位。

简单的说它就是一个相对单位。看到rem大家一定会想起em单位,

em(font size of the element)是指相对于父元素的字体大小的单位。它们之间

其实很相似,只不过一个计算的规则是依赖根元素一个是依赖父元素计算。

为什么web app要使用rem

    这里我特别强调web app,web page就不能使用rem吗,其实也当然可以,不过

出于兼容性的考虑在web app下使用更加能突显这个单位的价值和能力,接下来

我们来看看目前一些企业的web app是怎么做屏幕适配的。

1、实现强大的屏幕适配布局:

    最近iphone6一下出了两款尺寸的手机,导致的移动端的屏幕种类更加的混乱,

记得一两年前做web app有一种做法是以320宽度为标准去做适配,超过320的

大小还是以320的规格去展示,这种实现方式以淘宝web app为代表作,但是近期

手机淘宝首页进行了改版,采用了rem这个单位,首页以内依旧是和以前一样各

种混乱,有定死宽度的页面,也有那种流式布局的页面。

    我们现在在切页面布局的使用常用的单位是px,这是一个绝对单位,web app的

屏幕适配有很多中做法,例如:流式布局、限死宽度,还有就是通过响应式来做,

但是这些方案都不是最佳的解决方法。

    例如流式布局的解决方案有不少弊端,它虽然可以让各种屏幕都适配,但是显示

效果极其的不好,因为只有几个尺寸的手机能够完美的显示出视觉设计师和交

互最想要的效果,但是目前行业里用流式布局切web app的公司还是挺多的,

看看下面我收集的一些案例:

1.亚马逊:

2.携程:

3.兰亭


上面的网站都是采用的流式布局的技术实现的,他们在页面布局的时候都是通过

百分比来定义宽度,但是高度大都是用px来固定住,所以在大屏幕的手机下显示

效果会变成有些页面元素宽度被拉的很长,但是高度还是和原来一样,实际显示

非常的不协调,这就是流式布局的最致命的缺点,往往只有几个尺寸的手机下

看到的效果是令人满意的,其实很多视觉设计师应该无法接受这种效果,因为

他们的设计图在大屏幕手机下看到的效果相当于是被横向拉长来一样。

    流式布局并不是最理想的实现方式,通过大量的百分比布局,会经常出现许多

兼容性的问题,还有就是对设计有很多的限制,因为他们在设计之初就需要考虑

流式布局对元素造成的影响,只能设计横向拉伸的元素布局,设计的时候存在

很多局限性。

2.固定宽度做法

    还有一种是固定页面宽度的做法,早期有些网站把页面设置成320的宽度,超出

部分留白,这样做视觉,前端都挺开心,视觉在也不用被流式布局限制自己的

设计灵感了,前端也不用在搞坑爹的流式布局。但是这种解决方案也是存在

一些问题,例如在大屏幕手机下两边是留白的,还有一个就是大屏幕手机下看

起来页面会特别小,操作的按钮也很小,手机淘宝首页起初是这么做的,但近期

改版了,采用了rem

3.响应式做法

    响应式这种方式在国内很少有大型企业的复杂性的网站在移动端用这种方法去

做,主要原因是工作大,维护性难,所以一般都是中小型的门户或者博客类站点会

采用响应式的方法从web page到web app直接一步到位,因为这样反而可以

节约成本,不用再专门为自己的网站做一个web app的版本。

4.设置viewport进行缩放

天猫的web app的首页就是采用这种方式去做的,以320宽度为基准,进行缩放,

最大缩放为320*1.3 = 416,基本缩放到416都就可以兼容iphone6 plus的

屏幕了,这个方法简单粗暴,又高效。说实话我觉得他和用接下去我们要讲的rem

都非常高效,不过有部分同学使用过程中反应缩放会导致有些页面元素会糊的情况。

  1. <meta name="viewport" content="width=320,maximum-scale=1.3,user-scalable=no">
复制代码

rem能等比例适配所有屏幕

    上面讲了一大堆目前大部分公司主流的一些web app的适配解决方案,接下

来讲下rem如何工作的。

    上面说过rem是通过根元素进行适配的,网页中的根元素指的是html我们

通过设置html的字体大小就可以控制rem的大小。举个例子:

  1. html{
  2.     font-size:20px;
  3. }
  4. .btn {
  5.     width: 6rem;
  6.     height: 3rem;
  7.     line-height: 3rem;
  8.     font-size: 1.2rem;
  9.     display: inline-block;
  10.     background: #06c;
  11.     color: #fff;
  12.     border-radius: .5rem;
  13.     text-decoration: none;
  14.     text-align: center;   
  15. }
复制代码

上面代码结果按钮大小如下图:

我把html设置成10px是为了方便我们计算,为什么6rem等于60px。如果这个时候

我们的.btn的样式不变,我们再改变html的font-size的值,看看按钮发生上面变化:

  1. html{
  2.     font-size:40px;
  3. }
复制代码

按钮大小结果如下:

上面的width,height变成了上面结果的两倍,我们只改变了html的font-size,

但.btn样式的width,height的rem设置的属性不变的情况下就改变了按钮在

web中的大小。

其实从上面两个案例中我们就可以计算出1px多少rem:

第一个例子:

120px = 6rem * 20px(根元素设置大值)

第二个例子:

240px = 6rem * 40px(根元素设置大值)

推算出:

10px  = 1rem 在根元素(font-size = 10px的时候);

20px  = 1rem 在根元素(font-size = 20px的时候);

40px  = 1rem 在根元素(font-size = 40px的时候);

    在上面两个例子中我们发现第一个案例按钮是等比例放大到第二个按钮,

html font-size的改变就会导致按钮的大小发生改变,我们并不需要改变先前给

按钮设置的宽度和高度,其实这就是我们最想看到的,为什么这么说?接下来

我们再来看一个例子:

  1. <!DOCTYPE html>
  2. <html lang="zh">

  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>rem phone test</title>
  6.     <meta name="viewport" content="user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
  7.     <style>
  8.         html {
  9.             height: 100%;
  10.             width: 100%;
  11.             font-family: 'Heiti SC', 'Microsoft YaHei';
  12.             font-size: 20px;
  13.             overflow: hidden;
  14.             outline: 0;
  15.             -webkit-text-size-adjust:none;
  16.         }
  17.         body {
  18.             height: 100%;
  19.             margin: 0;
  20.             overflow: hidden;
  21.             -webkit-user-select: none;
  22.             position: relative;
  23.         }
  24.         header,
  25.         footer {
  26.             width: 100%;
  27.             line-height: 1.5rem;
  28.             font-size: 1rem;
  29.             color: #000;
  30.             border: 1px solid #ccc;
  31.             text-align: center;
  32.             background-color: #ccc;
  33.         }
  34.         .bd {
  35.             margin-top: 1rem;
  36.             margin-bottom: .5rem;
  37.             margin-right: -.5rem;
  38.             font-size: 0;
  39.         }
  40.         .box {
  41.             width: 5rem;
  42.             height: 5rem;
  43.             display: inline-block;
  44.             margin-right:.5rem;
  45.             margin-bottom: .5rem;
  46.         }
  47.         .blue-box {
  48.             background-color: #06c;
  49.         }
  50.         .org-box {
  51.             background-color: #1fc195;
  52.         }
  53.     </style>
  54.    
  55. </head>

  56. <body>

  57.     <header>我是头部</header>


  58.     <div class="bd">
  59.         <div class="box blue-box"></div>
  60.         <div class="box org-box"></div>
  61.         <div class="box blue-box"></div>
  62.         <div class="box org-box"></div>
  63.         <div class="box blue-box"></div>
  64.         <div class="box org-box"></div>
  65.     </div>


  66.     <footer>我是页脚</footer>
  67.    
  68.     <script>
  69.         (function (doc, win) {
  70.           var docEl = doc.documentElement,
  71.             resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',
  72.             recalc = function () {
  73.               var clientWidth = docEl.clientWidth;
  74.               if (!clientWidth) return;
  75.               docEl.style.fontSize = 20 * (clientWidth / 320) + 'px';
  76.             };

  77.           if (!doc.addEventListener) return;
  78.           win.addEventListener(resizeEvt, recalc, false);
  79.           doc.addEventListener('DOMContentLoaded', recalc, false);
  80.         })(document, window);
  81.     </script>
  82. </body>

  83. </html>
复制代码

由上面两个的demo中我们知道改变html的font-size可以等比改变所有用了rem

单位的元素,所以大家可以通过chrome浏览器的调试工具去切换第三个的demo

在不同设备下的展示效果,或者通过缩放浏览器的宽度来查看效果,我们可以看

到不管在任何分辨率下,页面的排版都是按照等比例进行切换,并且布局没

有乱。我只是通过一段js根据浏览器当前的分辨率改变font-size的值,就简单

的实现了上面的效果,页面的所有元素都不需要进行任何改变。

到这里肯定有很多人会问我是怎么计算出不同分辨率下font-size的值?

    首先假设我上面的页面设计稿给我时候是按照640的标准尺寸给我的前提下,

(当然这个尺寸肯定不一定是640,可以是320,或者480,又或是375)来看一组表格。


上面的表格蓝色一列是Demo3中页面的尺寸,页面是以640的宽度去切的,怎么

计算不同宽度下font-site的值,大家看表格上面的数值变化应该能明白。举个

例子:384/640 = 0.6,384是640的0.6倍,所以384页面宽度下的font-size

也等于它的0.6倍,这时384的font-size就等于12px。在不同设备的宽度计算

方式以此类推。

    Demo3中我是通过JS去动态计算根元素的font-size,这样的好处是所有设备

分辨率都能兼容适配,淘宝首页目前就是用的JS计算。但其实不用JS我们也

可以做适配,一般我们在做web app都会先统计自己网站有哪些主流的屏幕

设备,然后去针对那些设备去做media query设置也可以实现适配,例如下面这样:

  1. html {
  2.     font-size : 20px;
  3. }
  4. @media only screen and (min-width: 401px){
  5.     html {
  6.         font-size: 25px !important;
  7.     }
  8. }
  9. @media only screen and (min-width: 428px){
  10.     html {
  11.         font-size: 26.75px !important;
  12.     }
  13. }
  14. @media only screen and (min-width: 481px){
  15.     html {
  16.         font-size: 30px !important;
  17.     }
  18. }
  19. @media only screen and (min-width: 569px){
  20.     html {
  21.         font-size: 35px !important;
  22.     }
  23. }
  24. @media only screen and (min-width: 641px){
  25.     html {
  26.         font-size: 40px !important;
  27.     }
  28. }
复制代码

上面的做的设置当然是不能所有设备全适配,但是用JS是可以实现全适配。具体

用哪个就要根据自己的实际工作场景去定了。

    下面推荐两个国内用了rem技术的移动站,大家可以上去参考看看他们的

做法,手机淘宝目前只有首页用了rem,淘宝native app的首页是

内嵌的web app首页。

淘宝首页:m.taobao.com

D X:m.dx.com

最后我们再来看一看他的兼容性:



转载自:http://isux.tencent.com/web-app-rem.html

转载于:https://www.cnblogs.com/zhp404/articles/4276831.html

相关文章:

  • SYSOPER和SYSDBA特权的区别与联系
  • 混沌的艺术--- YChaos通过数学公式生成混沌图像
  • 高维数据的重要属性
  • andorid中xml相关
  • linux 下压缩大批量文件
  • 跟着实例学习ZooKeeper的用法: Curator扩展库
  • 如何从github上面拷贝源码
  • C++标准 bind函数用法与C#简单实现
  • 混合云服务哪家强? “天翼混合云”欲挑大梁
  • [LeetCode] Sort List
  • 等待超时,请打开设备管理器查看苹果驱动是否正常!
  • 【POJ】2096 Collecting Bugs
  • 【Linux】linux经常使用基本命令
  • [JAVA设计模式]第二部分:创建模式
  • nyoj86-找球号(一) 【set 二分查找 hash】
  • #Java异常处理
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • CSS 专业技巧
  • Idea+maven+scala构建包并在spark on yarn 运行
  • java中的hashCode
  • mysql 5.6 原生Online DDL解析
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • Vue组件定义
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 实现菜单下拉伸展折叠效果demo
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • ​低代码平台的核心价值与优势
  • !$boo在php中什么意思,php前戏
  • # .NET Framework中使用命名管道进行进程间通信
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (4.10~4.16)
  • (待修改)PyG安装步骤
  • (二)linux使用docker容器运行mysql
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (三)docker:Dockerfile构建容器运行jar包
  • (三分钟)速览传统边缘检测算子
  • (循环依赖问题)学习spring的第九天
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • ./configure,make,make install的作用(转)
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
  • .NETCORE 开发登录接口MFA谷歌多因子身份验证
  • .NetCore项目nginx发布
  • .NET国产化改造探索(一)、VMware安装银河麒麟
  • .net网站发布-允许更新此预编译站点
  • .NET下的多线程编程—1-线程机制概述
  • .net专家(张羿专栏)
  • .set 数据导入matlab,设置变量导入选项 - MATLAB setvaropts - MathWorks 中国
  • /usr/local/nginx/logs/nginx.pid failed (2: No such file or directory)
  • @ConditionalOnProperty注解使用说明