微信搜索superit|邀请体验:大数据, 数据管理、OLAP分析与可视化平台 | 赞助作者:赞助作者

移动端rem自适应布局(切图)

前端 aide_941 24℃

移动端rem自适应布局(切图)

原文链接:https://segmentfault.com/a/1190000007276635

简介:
本篇适用于初次使用rem为单位切图而无从下手的童鞋。核心是根据屏幕动态改变根元素字体大小,以达到适配各种屏幕。这只是一个拿来就用的教程。很多东西没有详细说明。不过对于快速做手机端切图很有帮助。

模板Github

使用
1.下载完成后首先修改js文件中的基本单位:psd宽度是640就写640,是750就写750.现在的设计稿大部分是以iphone 6 为基准设计的,也就是750px。
图片描述

2.切图时,我们以100px为基本单位(至于为什么是100px,自己看看我的js代码就知道了),每个元素的宽高,字体等等就直接用rem来写,不用执行减半等操作,设计稿是多少就写多少。下面是一张750px的设计稿

图中那个690px*336PX元素css样式如下:

  1. .box{
  2. width: 6.9rem;
  3. height: 3.36rem;
  4. margin: 0 auto;
  5. background: #ffffff;
  6. }

因为我们用了动态改变根字体大小,所以.box会自动适应各种屏幕。现在我们就可以愉快的切图了。
使用方法就这么简单。其中最重要的就是那段js代码。。后面的文字,想看的就看看吧。

3.这句是废话,如果你够牛逼就可以直接用px来写各个元素的宽高,字体等等,之后直接用sass或者less转换成rem就行了。

4.调试时记得把浏览器默认最小字体设置为最小。手机端是支持12px以下的字体的。
图片描述
图片描述
图片描述

5.对于不是750px的设计稿,我们其实是可以将其等比缩放到750px的
图片描述
图片描述
说明:

一、头部加入最常用的meta内容
<meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no,minimal-ui">

width viewport的宽度
initial-scale 初始化缩放比例
minimum-scale 最小缩放比例
maxinum-scale 最大缩放比例
user-scalable 用户是否可以缩放
minimal-ui ios7以上隐藏浏览器导航栏
具体关于viewport的说明请看慕课网

二、css样式重置
  1. html, body, div, span, applet, object, iframe,
  2. h1, h2, h3, h4, h5, h6, p, blockquote, pre,
  3. a, abbr, acronym, address, big, cite, code,
  4. del, dfn, em, img, ins, kbd, q, s, samp,
  5. small, strike, strong, sub, sup, tt, var,
  6. b, u, i, center,
  7. dl, dt, dd, ol, ul, li,
  8. fieldset, form, label, legend,
  9. table, caption, tbody, tfoot, thead, tr, th, td,
  10. button,article, aside, canvas, details, embed, figure,
  11. figcaption, footer, header, hgroup, menu, nav,
  12. output, ruby, section, summary, time, mark,
  13. audio, video {
  14. margin: 0;
  15. padding: 0;
  16. border: 0;
  17. vertical-align: baseline;
  18. background: transparent;
  19. outline: none;
  20. -webkit-box-sizing: border-box;
  21. -moz-box-sizing: border-box;
  22. box-sizing: border-box;
  23. }
  24. article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section { display: block; }
  25. ol, ul { list-style: none; }
  26. button{background: transparent;}
  27. blockquote, q { quotes: none; }
  28. blockquote:before, blockquote:after, q:before, q:after { content: ; content: none; }
  29. strong { font-weight: bold; }
  30. table { border-collapse: collapse; border-spacing: 0; }
  31. img { border: 0; max-width: 100%; }
  32. html{
  33. line-height: initial;
  34. }
  35. body{
  36. font-size: 0.32rem;
  37. }

特别注意下面这段代码必不可少。

  1. html{
  2. line-height: initial;
  3. }
  4. body{
  5. font-size: 0.32rem;
  6. }

是为了解决我们由js动态设置html字体过大时,他的line-height对子孙元素的不良影响,请自行体会。
重要三、引入动态改变根节点字体大小的js文件

  1. (function(doc, win) {
  2. var docEl = doc.documentElement,
  3. resizeEvt = ‘orientationchange’ in window ? ‘orientationchange’ : ‘resize’,
  4. recalc = function() {
  5. var clientWidth = docEl.clientWidth;
  6. if (!clientWidth) return;
  7. if (clientWidth >= 750) {
  8. docEl.style.fontSize = ‘100px’;
  9. } else {
  10. docEl.style.fontSize = 100 * (clientWidth / 750) + ‘px’;
  11. }
  12. };
  13. if (!doc.addEventListener) return;
  14. win.addEventListener(resizeEvt, recalc, false);
  15. doc.addEventListener(‘DOMContentLoaded’, recalc, false);
  16. })(document, window);

这是rem布局的核心代码,这段代码的大意是:

如果页面的宽度超过了750px,那么页面中html的font-size恒为100px,否则,页面中html的font-size的大小为: 100 * (当前页面宽度 / 750)。
我们刚开始切图时,如果在手机端使用固定宽高px,那么我们的宽高都要减半,以上图的设计稿为例,使用固定px时的代码:

  1. .box{
  2. width: 345px;
  3. height: 168px;
  4. margin: 0 auto;
  5. background: #ffffff;
  6. }

使用rem时的代码:

  1. .box{
  2. width: 6.9rem;
  3. height: 3.36rem;
  4. margin: 0 auto;
  5. background: #ffffff;
  6. }

对应公式,我们的iPhone 6 是375px宽度,所以此时的字体为50px。自己算一算是不是和减半的效果一样。
图片描述

我们在切图时,自己根据设计稿设置是640px宽度或者750px宽度或者其他的
四、移动端还有好多解决体验性问题的东西。可以看看这个


移动端rem切图

1.为什么用rem

根据屏幕大小,自动调整大小

2.如何使用rem

分以下几步

a.用ps把设置稿弄成640px或者750px的(记得等比例缩放)

b.调试时记得把浏览器默认最小字体设置为最小。手机端是支持12px以下的字体的

c.引入meta头

    <meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no,minimal-ui">

d.引入reset文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td,
button,article, aside, canvas, details, embed, figure,
figcaption, footer, header, hgroup, menu, nav,
output, ruby, section, summary, time, mark,
audio, video {
margin0;
padding0;
border0;
vertical-alignbaseline;
backgroundtransparent;
outlinenone;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section { displayblock; }
ol, ul { list-stylenone; }
button{backgroundtransparent;}
blockquote, q { quotesnone; }
blockquote:before, blockquote:after, q:before, q:after { content''contentnone; }
strong { font-weightbold; }
table { border-collapsecollapseborder-spacing0; }
img { border0max-width100%; }
html{
line-height: initial;
}
body{
font-size0.32rem;
}

 

e.引入js媒体查询文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
(function(doc, win) {
var docEl = doc.documentElement,
resizeEvt = 'orientationchange' in window ? 'orientationchange' 'resize',
recalc = function() {
var clientWidth = docEl.clientWidth;
if (!clientWidth) return;
if (clientWidth >= 750) {
docEl.style.fontSize = '100px';
else {
docEl.style.fontSize = 100 * (clientWidth / 750) + 'px';
}
};
if (!doc.addEventListener) return;
win.addEventListener(resizeEvt, recalc, false);
doc.addEventListener('DOMContentLoaded', recalc, false);
})(document, window);

 

f.直接在750px或640px的情况下切图,单位也直接用px

g.到http://www.520ued.com/把px转为rem,html的字体大小填100px。

H.收工!!

 

 

参考资料:

http://www.520ued.com/

http://bbs.it-home.org/thread-64920-1-1.html

转载请注明:SuperIT » 移动端rem自适应布局(切图)

喜欢 (0)or分享 (0)