移动端的web前端开发其实经常会有一些令人头疼的问题,比如屏幕适配、1像素问题等,rem也是之前在屏幕适配上比较完善的一套方案,但是随着业务的深入,任何方案都有其优秀与不足的地方,rem这套方案也一样,笔者今就来从自身项目的角度,简单的聊聊rem这整套方案的得与失。

  首先,介绍下原理:

  rem是什么?它是css3新推出的相对单位,英文全称为font size of the root element,意思就是根据网页的根元素来设置字体大小,和另一个em(font size of the element)根据父元素的字体大小来者是不同,它是根据根节点,也就是html元素来设置大小,举个简单的例子:

html{
font-size: 12px;
}
p{
width: 1rem; //实际长度 1 * 12 = 12px;
}

  也正由于这个机制,我们就能根据只改变根元素的fontSize这一个点的方式就能改变全局的设置了rem单位的元素的样式。

  但是,正如前面提到的,没有什么方案是没有副作用的,rem也是有副作用的:

  1、移动端对于浮点数的计算其实并不像pc那么精确。实际工作中我们经常会碰到根节点fontSize设置为10px,实际元素的属性值(如border: .1rem solid #000)有小数点的情况,这种情况下,虽然理论上的px值应该为1px,但是实际上很有可能就变成了0px(也就是视觉上不可见),也就是这个原因,也导致了rem的borderRadius的设置的圆看着像椭圆,所以'px'这个单位在这个背景下还是有它自己的使用空间,虽然这看上去甚至有一些违背使用rem的初衷。

  2、css绘制的图形可以rem,但是图片却不行。我们都知道,图片的清晰度需要在它的实际分辨率范围内才能够保证,如果任由rem设置图片宽高,被肆意拉伸的图片其实并不是我们想要的,所以在设置图片的时候还需要有另外的考量。

  3、有关rootElemenet元素的fontSize,并不是一直都那么准确,也即这套方案是有兼容性问题的。笔者的实际工作中就发现,有一些比较“另类”的手机在使用rem的实际效果很奇怪,它们内部的计算颇有些令人发指,所以,即使大范围使用了rem作为主要单位,但是很多场景下,'%'这个比例单位还是有使用空间的。

  说完了rem的功过,我们来聊一下替代方案:

  笔者有了解过的方案有两套:

  1、基于vh,vw的方案:

    其实相关的单位总共有4个,vh、vw、vmin、vmax,它们统称为视窗(Viewport,也称作视口)单位,vw、vh分别表示相对于视窗宽度/高度的百分比(如1vw表示视窗宽度的1%),读到这里,聪明的读者应该就能想象,如果能相对于视窗的百分比来设置,不就是能够自适应各种屏幕了么?没错,看上去确实是这样,但是,再一细想还是会有不能覆盖的场景,比如fontSize(其实有没有想过,说不定委员会制定vh、vw、rem等单位,其实初衷是想结合使用?),而且本身也有一些兼容问题,所以实践得并不算太多。

  2、基于meta中设置viewport scale的方案:

  这个方案也是源于移动端那个著名的1像素问题,实现其实很简单,主要是这样:

<!--
服务器端根据前端第一次请求页面时带的客户端信息,判断客户端是几倍屏,然后对应的设置viewport的scale
-->
<meta name="viewport" content="initial-scale=0.5, maximum-scale=0.5, minimum-scale=0.5, user-scalable=no">

  这样设置了之后,就可以在样式中正常的使用'px'单位,但是在物理上它会表现为对应的实际像素,通过scale来弥补逻辑像素到物理像素的差异,将实际的使用场景拉回了之前的我们熟悉的“正常”场景,然后在需要适配的场景依然沿用之前的rem的方案,因为含有小数点的场景可以通过“真”的px去覆盖,几乎完整的补齐了rem的缺憾。

  第一套方案因为有兼容性的隐形坑,所以实际使用得并不算多,而第二种方案,再结合rem可谓是当今的主流实现了,不过它本身也有一个小缺陷,这种设置相当于前端页面就需要服务端直出了(不过为了SEO,SSR其实也是大前端的时代的一个趋势吧),不能简单的发布静态页面。

  简单的总结一下,其实移动端由于性能上和pc的一些差距和使用环境上的一些区别,在浏览器设计之初就会有一些针对移动端的做一些特殊的实现,本文简单总结了一些笔者最近在调研的一些适配方案,只是移动端这些“特性”的一些方面,而最近开始逐渐普及的android 7还有着更多的“特性”等着我们去适配,前端还是任重而道远。

【css】rem及其替换方案的更多相关文章

  1. Microsoft.AspNet.Web.Optimization.Bundle的完美替换方案

    Web应用程序中包含大量的样式(css)和脚本(js)文件,这些文件的引用.管理和发布有很多解决方案.在Asp.Net MVC应用程序中,大家最熟悉的解决方案应属Microsoft.AspNet.We ...

  2. css - rem和vw

    css - rem和vw 物理像素 物理像素在不同的设备中1px里可以容纳的像素颗粒是不相同的,所以1px这个单位其实也是有N个像素颗粒填充的.同一尺寸屏幕的每个像素点所能容纳的像素颗粒越多显示效果越 ...

  3. Google Earth API 替换方案

    众所周知,GE API将会在15年12月25日结束服务,对于众多采用该API的软件,需要一些替换方案. 例如google map或者cesiumjs http://cesiumjs.org/ 或者尝试 ...

  4. arguments.callee的作用及替换方案

    arguments.callee的作用 arguments 的主要用途是保存函数参数, 但这个对象还有一个名叫 callee 的属性,返回正被执行的 Function 对象,也就是所指定的 Funct ...

  5. UIActionSheet上加入UIPickerView iOS8替换方案

    此套替换方案採用"UIView+动画"方式实现(将UIActionSheet替换为UIView) 界面层级例如以下: 第一层:view(这一层充满整个屏幕,初始化时颜色为透明.us ...

  6. switch...case...之替换方案一

    很多时候,当switch中有N个分支,且分支数已达10+,每个分支都是一个不小的方法体,那我们是不是应该考虑换一种方式来实现这个分支. 而我目前所能想到的是会用到如下几种方法. 1.Action 2. ...

  7. mobile css & rem & em & px

    mobile css & rem & em & px 1 rem === 16px 任意浏览器的默认字体高都是 16px, 所有未经调整的浏览器都符合: 1em=16px, 那 ...

  8. PostCSS的插件 -- 关于vue rem适配布局方案

    PostCSS的插件 作用:用于自动将像素单元生成rem单位 记以下三种 postcss-plugin-px2rem postcss-pxtorem postcss-px2rem 任选一种,最近大家推 ...

  9. css透明背景兼容方案

    css透明是一个技术活,因为这里面涉及到了IE8及以下版本不兼容opacity这个css3属性,而filter:alpha(opacity=80)这个值则是不兼容IE6.网上比较流行的透明css是这样 ...

随机推荐

  1. Spring Data JPA 入门篇

    Spring Data JPA是什么 它是Spring基于ORM框架(如hibernate,Mybatis等).JPA规范(Java Persistence API)封装的一套 JPA应用框架,可使开 ...

  2. Java调用WSDL接口

    1.首先准备jar包: 2.代码调用如下: String url="url地址"; QName qName=new QName("命名空间","接口名 ...

  3. css实现文字渐变

    css文件渐变虽然兼容性比较差,但是用在移动端和chrome中还是没有问题的. 实现文件渐变的方法有两种 1. 使用 background 的属性 2. 使用 mask 属性 方式一. <!DO ...

  4. Java入门 第一季第五章 编程练习解析

    这是我学习慕课网Java课程的笔记.原视频链接为:http://www.imooc.com/learn/85 5-1 基本写法 自己主动补全快捷键:alt + / 5-2 输入输出 使用Scanner ...

  5. 【甘道夫】并行化频繁模式挖掘算法FP Growth及其在Mahout下的命令使用

    今天调研了并行化频繁模式挖掘算法PFP Growth及其在Mahout下的命令使用,简单记录下试验结果,供以后查阅: 环境:Jdk1.7 + Hadoop2.2.0单机伪集群 +  Mahout0.6 ...

  6. 在Linux环境下使用TCP的keepalive机制

    Linux内置支持keepalive机制,为了使用它,你须要使能TCP/IP网络,为了可以配置内核在执行时的參数.你还须要procfs和sysctl的支持. 这个过程涉及到keepalive使用的三个 ...

  7. hdu1133 Buy the Ticket (卡兰特数应用+java大数)

    题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=1133 [题意] 电影票50块一张 有m个人手里正好有50块,n个人手里正好有100块,售票厅開始没有 ...

  8. 使用命令行工具提升cocos2d-x开发效率 之CocosBuilder篇

    http://www.cnblogs.com/flyFreeZn/p/3617983.html 假设你正在使用CocosBuilder或者是其它基于CocosBuilder源代码改装而成的工具为你的游 ...

  9. web 开发之js---ajax 异步处理

    本文介绍了如何创建能够适应不同浏览器的XMLHttpRequest实例,建立和发送请求,并响应服务器.您将开始接触最基本和基础性的有关Ajax的全部对象和编程方法:XMLHttpRequest对象.该 ...

  10. [IT学习]Python 小项目 通讯录 思路

    建立一个通讯录查询软件,暂时只支持按姓名检索.出发点:无需登录企业门户,即可检索.要注意保护员工手机号,除非他自己同意显示. 欢迎您访问www.cnblogs.com/viphhs.转载请联系作者授权 ...