rem从去年的手淘双11开始火起来之后一直就想去使用,但是苦于学习途径有限,工作任务也比较繁忙导致一度延后。

那么现在对相关知识的学习与初步的项目实践之后,在这里记录一下使用rem解决各屏幕适配问题。废话不多说~~一步步来

首先是从设计师那边拿过来的设计稿可能是640,或是750的,这些都不重要。

然后我们要引用一个JS,adaptive.js

github地址:https://github.com/finance-sh/adaptive,先从这儿引用一段文字:

最最理想的解决方案当然是设计图和手机屏幕的像素点一一对应,就像我们在PC端所做的一样。拿750px宽的设计图来说,如果手机屏幕的水平分辨率是750px,那么这样是最理想最完美的,对于水平分辨率不是750px的屏幕呢?这个时候我们把设计图进行缩放,使其宽度刚好与屏幕的分辨率相等,即是等比例缩放设计图,使其宽度刚好覆盖手机屏幕。
如果我们使用<meta content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no,minimal-ui" name="viewport">这种常用标签,视觉同学经常会抱怨1px过粗的问题,这个时候我们需要缩放viewport来达到真正还原1px的效果。
开发的便捷性也是理想解决方案的一部分,大部分rem解决方案,是把设计图分成100份,1rem等于10份,总宽度10rem。如果设计图是750px,1rem就等于75px,切图的时候需要将px转换为rem,这个时候就需要用设计图的px值除以75得到rem的值,得到的rem值基本都是带几位小数的,虽然我们可以用less,sass这类css预处理语言来统一处理,但是如果我们让1rem等于100px,在切图的时候就可以更加快速方便了。比如设计图宽度为100px,css则书写为1rem即可。
要实现1rem等于设计图100px,页面的总的宽度就不是10rem了,而是随设计图的宽度而变化了。拿750px的设计图来说,总的宽度就是7.5rem。我们先根据设备像素比来缩放viewport,布局视口的宽度就调整好了,布局视口同样的宽度是7.5rem,我们就可以计算出html根元素的像素值,这样就大功告成了。
如果是文字,我们也建议使用rem。 对于iphone的retina高清显示屏,基本版本(adaptive.js)我们做了缩放处理,以达到最佳显示效果。 对于快速开发版本(adaptive-version2.js),viewport的width等于设备宽度,不会缩放
如果只是webview里,可以使用 adaptive-version3.js 在IOS和安卓下都会缩放,否则还是谨慎使用此版本,抱歉

至于这个JS主要用来根据当前分辨率动态设置html的font-size的值以及viewport。

开始根据PSD在JS里进行配置,我把这一块的配置直接放到JS文件里了,加载完就可以执行,实际项目中如下:

/*立即调用*/
window['adaptive'].desinWidth = 750;// 设计图宽度
//window['adaptive'].baseFont = ".28rem";// 默认body字体大小,在这里我们不要设置固定默认字体大小,故将对应代码注释,通过body设置 .28rem设置字体大小
window['adaptive'].init();// 调用初始化方法

设置完了之后我们把基数(制作页面的时候一个参考项)定为100px(别问为什么,因为好用,相比其他的基数,我更愿意直接简单的缩进两位)。

实际“堆砖”过程当中是这个样子的。设计稿上我们看到一个div,用以前的写法假设是这样

div{

  width:200px;

  height:150px;

  margin:44px auto;

  padding:0 10px; 

}

那么你现在需要这样写

div{

  width:2rem;

  height:1.5rem;

  margin: .44rem auto;

  padding:0 .1rem;

}

写完了,就这样就可以了,那你本来的px值除以100,就是你要的rem的值。

针对1px的border问题,直接写1px就好了,因为就算你在缩小也小不过1px。

好了别看了,赶紧拿个设计稿来玩玩,再测一下不同的设备显示情况。

还是引用上面的那个部分兼容性解决方案:

1,部分chrome版本局部刷新时字体过大问题
插入数据后调用方法:
window.adaptive.reflow();
2,后端模板渲染是刚开始字体过大问题
可以给body设置一个初始字体大小值,就不会出现此问题了

最后最后附上js代码。我的修改版本,删掉了设置body字体大小功能(因为不想每一处的字体都得自己去定义):

!function(e, t) {
function i() {
o = 1,
e.devicePixelRatioValue = o,
s = 1 / o;
var t = a.createElement("meta");
if (t.setAttribute("name", "viewport"), t.setAttribute("content", "initial-scale=" + s + ", maximum-scale=" + s + ", minimum-scale=" + s + ", user-scalable=no"), d.firstElementChild) d.firstElementChild.appendChild(t);
else {
var i = a.createElement("div");
i.appendChild(t),
a.write(i.innerHTML)
}
}
function n() {
var e = Math.min(d.getBoundingClientRect().width, 540);
r = 100 * e / t.desinWidth,
d.style.fontSize = r + "px"
}
var a = e.document,
d = a.documentElement,
o = (e.devicePixelRatio, 1),
s = 1;
i();
var l, r = 100;
t.desinWidth = 640,
t.baseFont = 18,
t.init = function() {
e.addEventListener("resize",
function() {
clearTimeout(l),
l = setTimeout(n, 300)
},
!1),
e.addEventListener("pageshow",
function(e) {
e.persisted && (clearTimeout(l), l = setTimeout(n, 300))
},
!1),
"complete" === a.readyState ? a.body.style.fontSize = t.baseFont * o + "px": a.addEventListener("DOMContentLoaded",
function() {
//a.body.style.fontSize = t.baseFont * o + "px"
},
!1),
n(),
d.setAttribute("data-dpr", o)
}
} (window, window.adaptive || (window.adaptive = {}));
/*立即调用*/
window['adaptive'].desinWidth = 750;// 设计图宽度
//window['adaptive'].baseFont = ".28rem";// 默认body字体大小,在这里我们不要设置固定默认字体大小,故将对应代码注释,通过body设置 .28rem设置字体大小
window['adaptive'].init();// 调用初始化方法

有些坑可能没踩到,等我踩到了再及时更新哈。

有涵养的人都会带上出处,对吧

 

完整的REM布局的工作流程与规范的更多相关文章

  1. (淘宝无限适配)手机端rem布局详解(转载非原创)

    从网易与淘宝的font-size思考前端设计稿与工作流 本文结合自己对网易与淘宝移动端首页html元素上的font-size这个属性的思考与学习,讨论html5设计稿尺寸以及前端与设计之间协作流程的问 ...

  2. 关于移动端 rem 布局的一些总结

    [资源一]基础知识恕不回顾 基础知识参考以下两篇博客: http://isux.tencent.com/web-app-rem.html http://www.w3cplus.com/css3/def ...

  3. (淘宝无限适配)手机端rem布局详解

    从网易与淘宝的font-size思考前端设计稿与工作流 本文结合自己对网易与淘宝移动端首页html元素上的font-size这个属性的思考与学习,讨论html5设计稿尺寸以及前端与设计之间协作流程的问 ...

  4. UI 设计的整个工作流程是怎样的?

    作为一个专业UI设计师,不仅仅要了解整个产品在UI界面设计,交互设计中的工作流程,更需要了解整个产品从需求提出到产品上线的整个工作流程. 以下是互联网产品个部门的工作分配及流程: 从图中可以看到,一个 ...

  5. Android中measure过程、WRAP_CONTENT详解以及 xml布局文件解析流程浅析

    转自:http://www.uml.org.cn/mobiledev/201211221.asp 今天,我着重讲解下如下三个内容: measure过程 WRAP_CONTENT.MATCH_PAREN ...

  6. Storm 中什么是-acker,acker工作流程介绍

    概述 我们知道storm一个很重要的特性是它能够保证你发出的每条消息都会被完整处理, 完整处理的意思是指: 一个tuple被完全处理的意思是: 这个tuple以及由这个tuple所导致的所有的tupl ...

  7. Hadoop随笔(一):工作流程的源码

    一.几个可能会用到的属性值 1.mapred.map.tasks.speculative.execution和mapred.reduce.tasks.speculative.execution 这两个 ...

  8. webapp,liveapp: 流式布局和rem布局

    liveapp场景应用,一般针对的是移动端,近来也是很火,颇有一些感受,拿来分享一下. 页面宽度范围: 一般移动端页面我们的像素范围是320px-640px,最大640px,最小320px,所以设计稿 ...

  9. 基于git的工作流程

    本文针对的是追求极致.快速的产品响应团队的.以下的观点和内容都是围绕这个主题,暂时不涉及个人学习和团队学习. 在说工作流程之间,想说一下我们平常工作中遇到的一些困惑或者说现象 在一个团队里,同时有好多 ...

随机推荐

  1. 函数中返回char *类型

    记录一次比较容易引起混淆的地方. #include <stdio.h> char *str(void) { return "nihao\n"; } int main() ...

  2. CentOs7中的网卡配置工具

    CentOs7中的网卡配置工具 摘自:https://blog.51cto.com/13572810/2087991 misslaziness1人评论2715人阅读2018-03-17 22:09:1 ...

  3. efcore 级联删除

    https://docs.microsoft.com/en-us/ef/core/saving/cascade-delete#required-relationships Optional relat ...

  4. predict_proba 的使用

  5. Devexpress VCL Build v2013 vol 13.2.4 发布

    不说了,自己看吧. What's New in 13.2.4 (VCL Product Line)   New Major Features in 13.2 What's New in VCL Pro ...

  6. 【C#】VS2015开发环境的安装和配置(转)

    出处: http://www.cnblogs.com/rainmj/p/5636518.html http://www.cnblogs.com/rainmj/p/5636529.html http:/ ...

  7. Django入门与实践-第19章:主题回复(完结)

    http://127.0.0.1:8000/boards/1/topics/1/reply/ http://127.0.0.1:8000/boards/1/topics/1/ #myproject/u ...

  8. 使用bat批处理文件备份mysql数据库

    @echo offset date_string=%date:~0,4%_%date:~5,2%_%date:~8,2%  //日期set time_string=%time:~0,2%_%time: ...

  9. MOD13A1: MODIS/Terra Vegetation Indices 16-Day L3 Global 500 m SIN Grid V006

    https://lpdaac.usgs.gov/node/838 Description The MOD13A1 Version 6 product provides a Vegetation Ind ...

  10. (线段树)敌兵布阵--hdu--1166 (入门)

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=1166 自己第一次在没有看题解AC出来的线段树,写的可能不是太好,再贴个学长的代码,学习一下 发现自己的U ...