0.基本概念
以iPhone6为例:
物理像素为 750x1334
设备独立像素为 375x667
所以dpr=2
1.宁馨儿成长记的方案
移动端适配原理:
用下面这段JS动态设置html的font-size大小
Rem是相对于根元素html的font-size来做计算的单位
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| (function(doc, win) { var docEl = doc.documentElement, resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize', recalc = function() { var clientWidth = docEl.clientWidth; if (!clientWidth) return; docEl.style.fontSize = 20 * (clientWidth / 375) + 'px'; }; if (!doc.addEventListener) return; win.addEventListener(resizeEvt, recalc, false); doc.addEventListener('DOMContentLoaded', recalc, false); })(document, window);
|
实例
如果设计稿尺寸是375x667,iphone6的设备独立像素为375x667
所以iPhone6的fontsize是20*(375/375)=20px,即把1em当20px用
设计稿切出的某元素像素为220px,就写成220/20=11em
在线例子:
2.手淘的flexible方案
上面这个例子的字体为什么不使用rem而是采用px呢?
因为字体大小使用rem,由于等比例的存在,在小屏幕下就会存在小屏幕字体更小的情况,不利于我们更好的去阅读,违背了适配的初衷。
所以更好的做法就是使用px和媒体查询来进行适配,比如flexible的方案:
1 2 3 4 5 6 7 8 9 10
| @mixin font-dpr($font-size) { font-size: $font-size; [data-dpr="2"] & { font-size: $font-size * 2; } [data-dpr="3"] & { font-size: $font-size * 3; } }
|
3.图片自适应
方法一:使用 CSS 的 DevicePixelRatio 媒体查询属性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| .photo {background-image: url(image100.png);}
@media screen and (-webkit-min-device-pixel-ratio: 2), screen and (min--moz-device-pixel-ratio: 2) { .photo { background-image: url(image200.png); background-size: 100px 100px; } }
@media screen and (-webkit-min-device-pixel-ratio: 3), screen and (min--moz-device-pixel-ratio: 3) { .photo { background-image: url(image300.png); background-size: 100px 100px; } }
|
方法二:直接使用 IMG 的 SRCSET 属性
1 2 3
| <img width="100" height="100" src="image100.png" srcset="image200.png 2x,image300.png 3x"/>
|
4.响应式和自适应的区别
响应式针对的是不同分辨率设备而进行的适配式设计,以利用@media规则为主要手段,而自适应则忽略@media以比例布局为主,目的是适应不同的浏览器窗口大小。