移动端自适应方案

自适应需要从以下几个方面入手:
布局、字体、retina带来的问题

一、布局:

1. 用%做单位
老方案,兼容性高
在制作落地页的时候,一般会有一屏展示的需求,就是不需要滚动就展示全部内容,我的解决方案是通过

html,body{height:100%} /*设置body高度为屏幕高度*/
.section-header{height:30%}
.section-content{height:60%}
.section-footer{height:10%}

2. 用flex方案 (推荐)
这里有兼容第一版本和第三版本flex的库 https://github.com/lzxb/flex.css
比%精准,而且灵活

3. 用rem做单位(不推荐)
需要设置基准font-size,见下面自适应字体的解决方案

二、字体

1. 使用rem,设置基准font-size (有的说法说rem有问题)
可以设置动态基准font-size = clientWidth / 10,将clientWidth平均划成10份,模拟vw作为单位,弥补vw的兼容性

2. 根据dpr动态生成
用js判断出dpr之后,设置body的属性dpr,根据不同的dpr来设置不同的字体大小

3. 根据设计稿的尺寸
可以根据设计稿来设置基准clientWidth / designWidth * designFontSize,然后使用css编译工具来编译。

tips:
方案1和方案2可以用postcss的px2rem一起实现

三、retina屏幕

当dpr为2的时候,一个抽象像素要用到122个物理像素来显示;当dpr为3的时候,一个抽象像素要用到133个物理像素来显示。

retina屏带来的问题:

① 图片高清问题

当一张位图的1个抽象像素用4个物理像素(dpr=2)展示的时候,每个物理像素需要取该颜色和亮度的近似值,所以会产生模糊的问题;相反,一张位图的4个抽象像素用1个物理像素展示的时候,图像显示的锐度会降低(downsampling)。

解决方案:
1. 动态viewport (只解决了blur的问题,而downsampling我觉得这个肯定会有吧?)
根据设备的dpr用图片服务器生成1x、2x、3x的图片

2. 阿里lib.img
https://github.com/amfe/article/issues/8

问题延伸:icon的高清问题以及解决方案
https://github.com/amfe/article/issues/2

② 1px问题

设置1px的时候,用了4个物理像素(dpr=2)展示,会显得比较粗

解决方案:
1. 见动态viewport
2. 设置transform scale

transform:scaleX(0.5);
transform:scaleY(0.5);

总结:

淘宝方案lib-flexible使用了使用了动态viewport、rem布局、根据dpr动态生成字体大小(自行postcss)
可以参考以下文章:
https://github.com/amfe/lib-flexible
http://div.io/topic/1092
https://github.com/amfe/article/issues/17
http://huodong.m.taobao.com/act/yibo.html

其实有时候如果对1px和高清图片要求不是很高,只需要考虑设置scale为1,然后选用flex,动态设置font-size即可

参考:http://f2e.souche.com/blog/yi-dong-duan-zi-gua-ying-fang-an/


相关基础知识:

  1. retina相关
    http://www.w3cplus.com/css/viewports.html
    https://github.com/riskers/blog/issues/17
    ①设备像素比(device pixel ratio ) = 物理像素(physical pixel) / 设备独立像素(density-independent pixel)
    ②pc的viewport大小恒等于浏览器窗口的大小
    ③移动端的viewport分为layoutviewport和visualviewport,viewport的本质是html元素的wrapper,它限制了html的宽度。但是viewport不在HTML范畴内,所以不可以通过html的css来设置viewport的宽度。layoutviewportde的默认值一般在 768px ~ 1024px 之间,最常见的宽度是 980px。而visualviewport是控制meta viewport的scale程度的
    ④如果设置的meta viewport width="device-width",layoutviewport的宽度就会变为对应的物理大小(注意不是物理像素),这样就是理想视口,用户一加载进来的时候不用缩放来浏览。
    ⑤设置了initial-scale=1,就会触发width="device-width"
    ⑥meta viewport的width的值是dip,就算它的值为“device-width”

  2. 加载相关
    ①onload和onpageshow的区别:当页面是从缓存中读取的,onload就不执行,而onpageshow仍然执行;
    ②document.readyState有三种状态:loading、interactive、complete
    ③domcontentloaded、onload的区别

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容