完整的REM布局的工作流程与规范
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布局的工作流程与规范的更多相关文章
- (淘宝无限适配)手机端rem布局详解(转载非原创)
从网易与淘宝的font-size思考前端设计稿与工作流 本文结合自己对网易与淘宝移动端首页html元素上的font-size这个属性的思考与学习,讨论html5设计稿尺寸以及前端与设计之间协作流程的问 ...
- 关于移动端 rem 布局的一些总结
[资源一]基础知识恕不回顾 基础知识参考以下两篇博客: http://isux.tencent.com/web-app-rem.html http://www.w3cplus.com/css3/def ...
- (淘宝无限适配)手机端rem布局详解
从网易与淘宝的font-size思考前端设计稿与工作流 本文结合自己对网易与淘宝移动端首页html元素上的font-size这个属性的思考与学习,讨论html5设计稿尺寸以及前端与设计之间协作流程的问 ...
- UI 设计的整个工作流程是怎样的?
作为一个专业UI设计师,不仅仅要了解整个产品在UI界面设计,交互设计中的工作流程,更需要了解整个产品从需求提出到产品上线的整个工作流程. 以下是互联网产品个部门的工作分配及流程: 从图中可以看到,一个 ...
- Android中measure过程、WRAP_CONTENT详解以及 xml布局文件解析流程浅析
转自:http://www.uml.org.cn/mobiledev/201211221.asp 今天,我着重讲解下如下三个内容: measure过程 WRAP_CONTENT.MATCH_PAREN ...
- Storm 中什么是-acker,acker工作流程介绍
概述 我们知道storm一个很重要的特性是它能够保证你发出的每条消息都会被完整处理, 完整处理的意思是指: 一个tuple被完全处理的意思是: 这个tuple以及由这个tuple所导致的所有的tupl ...
- Hadoop随笔(一):工作流程的源码
一.几个可能会用到的属性值 1.mapred.map.tasks.speculative.execution和mapred.reduce.tasks.speculative.execution 这两个 ...
- webapp,liveapp: 流式布局和rem布局
liveapp场景应用,一般针对的是移动端,近来也是很火,颇有一些感受,拿来分享一下. 页面宽度范围: 一般移动端页面我们的像素范围是320px-640px,最大640px,最小320px,所以设计稿 ...
- 基于git的工作流程
本文针对的是追求极致.快速的产品响应团队的.以下的观点和内容都是围绕这个主题,暂时不涉及个人学习和团队学习. 在说工作流程之间,想说一下我们平常工作中遇到的一些困惑或者说现象 在一个团队里,同时有好多 ...
随机推荐
- Codeforces 599B. Spongebob and Joke 模拟
B. Spongebob and Joke time limit per test 2 seconds memory limit per test 256 megabytes input standa ...
- Executor(二)ThreadPoolExecutor、ScheduledThreadPoolExecutor 及 Executors 工厂类
Executor(二)ThreadPoolExecutor.ScheduledThreadPoolExecutor 及 Executors 工厂类 Java 中的线程池类有两个,分别是:ThreadP ...
- 2018.09.29 bzoj3039: 玉蟾宫(悬线法)
传送门 悬线法的板子题. 悬线法只需要保存当期点向下最多多少个,把这个当成一条线,再处理出线绷直之后最多能向左右延展多少就行了. 代码: #include<bits/stdc++.h> # ...
- 2018.09.28 hdu5434 Peace small elephant(状压dp+矩阵快速幂)
传送门 看到n的范围的时候吓了一跳,然后发现可以矩阵快速幂优化. 我们用类似于状压dp的方法构造(1(1(1<<m)∗(1m)*(1m)∗(1<<m)m)m)大小的矩阵. 然后 ...
- 2018.09.15 hdu1599find the mincost route(floyd求最小环)
传送门 floyd求最小环的板子题目. 就是枚举两个相邻的点求最小环就行了. 代码: #include<bits/stdc++.h> #define inf 0x3f3f3f3f3f3f ...
- 2018.08.29 NOIP模拟 pmatrix(线性筛)
[问题描述] 根据哥德巴赫猜想(每个不小于 6 的偶数都可以表示为两个奇素数之和),定义 哥德巴赫矩阵 A 如下:对于正整数对(i,j),若 i+j 为偶数且 i,j 均为奇素数,则 Ai,j = 1 ...
- Part 4 - Authentication(14-16)
from django.conf.urls import url from django.contrib import admin from django.contrib.auth import vi ...
- IntelliJ IDEA 2017版 springloaded实现热部署
1.配置pom.xml文档 <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&qu ...
- ansible facts 获取硬件信息
facts 指的是 ansible_facts 变量,ansible 中使用 setup 模块来获取,包含系统的大部分基础硬件信息, [root@10_1_162_39 host_vars]# ll ...
- 极小极大搜索方法、负值最大算法和Alpha-Beta搜索方法
1. 极小极大搜索方法 一般应用在博弈搜索中,比如:围棋,五子棋,象棋等.结果有三种可能:胜利.失败和平局.暴力搜索,如果想通过暴力搜索,把最终的结果得到的话,搜索树的深度太大了,机器不能满足, ...