随着手机等移动设备的普及,移动端带来的流量已经不可忽视,一个网站不只是只有pc的页面就足够了,移动端的适配已经势在必行。但是移动设备种类繁多,屏幕尺寸也千奇百怪,能不能找到一种方式可以适配所有的手机屏幕呢?

答案就是rem。

俗话说 “授人以鱼不如授人以渔”,但今天我就反其道而行,就是授人以鱼的。因为要跟你说什么设备像素比、css像素、ppi等东西,估计你会晕的(主要是我也搞不懂)。废话不多说,先上代码。

 /*移动端适配 width|height|font-size = 视觉稿量出来的值 / 100rem;@lbl*/
@media screen and (max-width:359px) and (min-width:320px) {
html,body{
font-size: 50px !important;
}
}
@media screen and (max-width:374px) and (min-width:360px) {
html,body{
font-size: 56.25px !important;
}
}
@media screen and (max-width:413px) and (min-width:375px) {
html,body{
font-size: 58.5px !important;
}
}
@media screen and (max-width:639px) and (min-width:414px){
html,body{
font-size: 64.6px !important;
}
}@media screen and (min-width:640px) {
html,body{
font-size: 100px !important;
}
}

 

rem顾名思义就是root element,这个是一个相对的单位,与em的差别在于rem相对的是根节点html的font-size,em相对的是父元素font-size。使用rem其实是用媒体查询修来改html的font-size,那么使用rem的元素的大小也会相应的改变,所以我们只要写一份css就可以适配所有手机的屏幕了。虽然rem在某些浏览器下面不够精准,但那也只是极少数,如果需要非常精准的适配,那么可以使用js来计算html的font-size。

很多开发者听到适配的第一反应就是手机的屏幕宽度多少多少,物理像素多少多少,然后考虑适配。这是从设配的角度入手,拿视觉稿去适配手机。难道我们就不能抛开设备从视觉稿入手吗?那么就来看看。

设计师给的视觉稿,一般都是按照640px来设计的。当我们拿到视觉稿时,首先把视觉稿的宽度转换为rem,我们并不需要考虑设备的分辨率,只需要按照 视觉稿宽度 = font-size x rem 这个公式来计算就好了。视觉稿的宽度是给定的,我们以640px为例,font-size 与rem是两个变量,我们只需要它们的乘积等于640即可。我们采用定一变一的方式,假定rem=6.4,那么初始值font-size就必须等于 100px,我们就可以根据需要适配的屏幕宽度来等比例调整font-size。那么如果我们640px的视觉稿需要显示成320px呢,我们只需要把font-size对应的缩小一半就可以了。其他的什么375px、414px、各种的屏幕,只需要等比例缩放就好了。比如:

 320px: font-size = 320 / 640 * 100 = 50px;
360px:font-size = 360 / 640 * 100 = 56.25px;
.........
800px:font-size = 800 / 640 * 100 = 125px;

其实按照比例算出来的font-size,我都是向下取小数点,这样可以保证元素的宽度不会超过总宽度。只是如果我们的视觉稿宽度给的是640px,但是需要在大于640的设备下显示的话,那么就会出现图片模糊等现象了,所以我们一般都使用大的视觉稿来适配小的屏幕。比如需要适配比640px大的屏幕,你可以让设计师根据宽度为960px来设计,然后转换为9.6rem,初始值font-size=100px;再根据需要适配的屏幕宽度来等比例调整font-size的大小就好了。

如果想需要更准确的适配,可以使用js动态计算窗口的宽度来改变font-size的大小,阿里手淘使用的flexible也是这样的方式,以下是趴下来的一份flexible的简化版

 (function(win) {
var remCalc = {};
var docEl = win.document.documentElement,
tid; function refreshRem() {
// 获取当前窗口的宽度
var width = docEl.getBoundingClientRect().width;
// 大于640px 按640算
if (width > 640) { width = 640 }
// 把窗口的宽度固定分为10份 也就是10rem
// 按视觉稿640算 640/10=64px 那么1rem = 64px
// 640视觉中 80px*80px的按钮 转换为rem 80/64 = 1.25rem
// 按钮的宽高固定为 1.25rem * 1.25rem
// 当窗口宽度缩放为 320px的时候
// 那么 1rem = 32px
// 原来 80px*80px的按钮现在变为 1.25rem * 32px = 40px
// 按钮变为 40px * 40px
// 其他宽度也类似
//
// cms做法也类似
// 只是我们把窗口宽度固定分为 6.4份,即6.4rem
// 所以 1rem = 100px
// 640视觉中 80px*80px的按钮 转换为rem 80/100 = 0.8rem
// ....其他也差不多
//
//
// 对比
// 其实也就是计算rem的问题 视觉稿量出来的值 除64 或 100的问题
// 除100 总比 除64 好口算
// 就算用sass写个 @function px2rem代替口算
// .8rem 总比输入 px2rem(80)少几个字符
//
//
var rem = width / 10; // cms 只要把这行改成 var rem = width /640 * 100
docEl.style.fontSize = rem + "px";
remCalc.rem = rem;
//误差、兼容性处理
var actualSize = parseFloat(window.getComputedStyle(document.documentElement)["font-size"]);
if (actualSize !== rem && actualSize > 0 && Math.abs(actualSize - rem) > 1) {
var remScaled = rem * rem / actualSize;
docEl.style.fontSize = remScaled + "px"
}
} //函数节流,避免频繁更新
function dbcRefresh() {
clearTimeout(tid);
tid = setTimeout(refreshRem, 100)
} //窗口更新动态改变font-size
win.addEventListener("resize", function() { dbcRefresh() }, false); //页面显示的时候再计算一次 难道切换窗口之后再切换来窗口大小会变?....
win.addEventListener("pageshow", function(e) {
if (e.persisted) { dbcRefresh() }
}, false);
refreshRem();
remCalc.refreshRem = refreshRem;
remCalc.rem2px = function(d) {
var val = parseFloat(d) * this.rem;
if (typeof d === "string" && d.match(/rem$/)) { val += "px" }
return val
};
remCalc.px2rem = function(d) {
var val = parseFloat(d) / this.rem;
if (typeof d === "string" && d.match(/px$/)) { val += "rem" }
return val
};
win.remCalc = remCalc
})(window); // 考拉移动端全站使用rem的不是很多
// 主要用100%布局 比如width、height、padding
// 也有直接用px 字体大小使用px固定不变
// 还有使用em的 基于font-size 定line-height
// 全站元素使用 box-sizing: border-box
// 多行省略号 text-overflow: ellipsis; -webkit-line-clamp: 2;
// 非主要页面很多都是图片 影响seo 看得出很缺前端
// 使用rem 最好文字都指定字体大小 不然会继承html的font-size

移动端适配之REM的更多相关文章

  1. 移动端适配单位rem

    0 写在前面 本周惊喜地发现,其他各个老师的软工班(罗杰老师班和欧阳老师班)的软工项目的alpha版本都已经发布了!(然而我们软工项目还没开始写代码…逃…) 十分好奇的我第一时间下载了一些他们的产品进 ...

  2. 移动端适配(rem & viewport)--移动端开发整理笔记(四)

    移动端适配 通过rem适配 em: 根据元素自身的字体大小来计算自己的尺寸 rem: (root em) 根据根节点(html)的字体大小来计算自己的尺寸   我们知道,在不同的手机设备,分辨率大小是 ...

  3. 移动端适配方案-rem(基础篇)

    常见移动web适配方案一般有3种方法,如下图: ①:定高,宽度百分比(一般用来做一些适配性不高的页面,比如主要以一些文字和图片为主的网页或移动端的头部和底部) ②:flex (更多的用于复杂页面的布局 ...

  4. H5移动端适配方案-rem

    为什么移动端要适配: 由于移动设备的尺寸不一,所以移动端的页面要能够适应不同尺寸的设备,即页面的自适应,让页面在视觉上保持一致. rem:rem 是css3的一种相对单位,参考是根元素HMTL的fon ...

  5. 移动端适配(rem单位定义方法)

    注:移动端必须写: <meta name="viewport" content="width=device-width, user-scalable=no, ini ...

  6. 小tips:使用rem+vw实现简单的移动端适配

    首先设置meta属性,如下代码: <meta name="viewport" content="width=device-width, initial-scale= ...

  7. rem移动端适配方案

    一. rem vs em 单位 定义 特点 rem font size of the root element 以根元素字体大小为基准 em font size of the element 以父元素 ...

  8. 移动端适配 后篇(rem+vm)

    涉及到的一些名词, 详细解释可参考 移动端适配前篇--移动端适配 rem 名词解释 [英寸Inch]英寸表示屏幕斜对角线的长度 [像素Pixel]像素是图像的基本采样单位,它不是一个确定的物理量,因为 ...

  9. 移动端适配之雪碧图(sprite)背景图片定位

    为了减少网络请求个数量,提高网站的访问速度,我们一般都会把一些小的图片合并成一张sprite图,然后根据background-position来进行定位.在web端由于是固定的大小与left .top ...

随机推荐

  1. Docker基础速成(一)

    Docker基础速成(一) 给亲爱的写的docker基础速成,按照步骤操作,实践出真知,希望有提纲挈领之功效 1.docker简介 Docker 轻量级容器,如图,类似于一个个集装箱,把复杂或者零散的 ...

  2. static, const 和 static const 变量的初始化问题

    const 常量的在超出其作用域的时候会被释放,但是 static 静态变量在其作用域之外并没有释放,只是不能访问. static 修饰的是静态变量,静态函数.对于类来说,静态成员和静态函数是属于整个 ...

  3. 工作常用shell集合

    <1>日志回滚案例======>[root@localhost test]# cat hbase.sh hbase_rotate_log ()       {    log=$1;  ...

  4. Flask:操作SQLite3(0.1)

    Windows 10家庭中文版,Python 3.6.4,Flask 1.0.2 本文介绍了第一次在Flask框架中操作SQLite3数据库的测试,参考了官网的文档Using SQLite 3 wit ...

  5. Python_oldboy_自动化运维之路_全栈考试(七)

    1. 计算100-300之间所有能被3和7整除的所有数之和 # -*- coding: UTF-8 -*- #blog:http://www.cnblogs.com/linux-chenyang/ c ...

  6. Isolate randomforest检测异常点的非监督方法

    由于异常数据的两个特征(少且不同: few and different) 异常数据只占很少量; 异常数据特征值和正常数据差别很大. iTree的构成过程如下: l  随机选择一个属性Attr: l  ...

  7. Ajax请求中的async:false/true

    Ajax请求中的async:false/trueasync. 默认是 true,即为异步方式,$.ajax执行后,会继续执行ajax后面的脚本,直到服务器端返回数据后,触发$.ajax里的succes ...

  8. SQL2008数据库导出到SQL2000全部步骤过程

    2008转到2000的步骤 1. 在sql2008上生成for 2000版本的数据库脚本 -- 打开"对象资源管理器"(没有的话按F8), 连接到你的实例, 右键要转到2000的库 ...

  9. jmock2.5 基本教程

    目录 第0章 概述 第1章 jmock初体验 第2章 期望 第3章 返回值 第4章 参数匹配 第5章 指定方法调用次数 第6章 指定执行序列 第7章 状态机 第0章 概述 现在的dev不是仅仅要写co ...

  10. 微信小程序地图模块

    微信小程序的地图模块官方提供的API比较少,详情请见   官方文档 以下为一个示例                               <!--pages/location/locati ...