学习前端有一段时间,看博客一直是自己的学习习惯,今天我也来分享一下,从此以后,开始我的博客之旅(废话了几句),下面进入正题:
移动端适配,对于我来说,一直是一个头疼的问题;经过长期的挣扎,终于花了一整块时间去研究了一下rem布局;
我在网上看了很多关于rem的文章,大多都是介绍手淘团队的flexible.js,相信大多数人都读过大漠老师写的这篇文章,请仔细阅读文章;
flexible.js的原理
通过移动设备的dpr(设备像素比:设备像素比 = 物理像素 / 设备独立像素 ;window.devicePixelRatio)和屏幕宽度(document.document.clientWidth)来动态的改变html的font-size的大小
手淘团队flexibe github源码,中间有几个地方不明白;也看了很多解释得文章,也没能很好的理解
1.上面的那一句注释是不是写错了,ios下不是分2、3屏。他干嘛注释说用2倍方案???
2.如果是iPhone5.则其dpr为2,scale=0.5,则,如果是安卓手机则其dpr为1,相应的则其scale=1;
接着下面的html 的font-size的大小为:
var rem = width / 10;
docEl.style.fontSize = rem + 'px';;
为什么除以10呢,,大漠老师的文章里谁的是为了以后更好的兼容vh和vw这两个强大的新单位,
现在写样式的时候只需把设计图上的尺寸/75(iphone6的设计图),单位为rem即可,
即1rem等于屏幕宽度的十分之一。
现在设计图的px转换为rem可以通过sublime3的插件,或用less函数(我至今不会用),
但我觉得,让 var rem = width/750 *100(iphonr6设计图),
这样写的1rem就等于你在设计图上测量的尺寸除以100即可3.
确实是这样,应用了flexible移动端布局简单多了,可以像写pc端那样愉快的玩耍了
4、我现在一直搞不明白dpr是用来做什么的,
网上有很多文章说主要解决了border: 1px问题,图片高清问题,
我写的代码不多没有遇到这两个问题,,所以没有切身的体会,
那个retina高清屏显示的问题我也搞的一知半解的,
布局中,字体不适用于rem单位,可以由dpr的不同设置不同字体,
flexible对字体的处理方案 我觉得,flexible里面dpr是不是只是用来解决高清屏显示,border:1px问题,
源码我也是看的不太懂,
另外说一说dpr存在的问题,看到另一篇博客点击打开链接,
说小米4,检测是会弹出iphone,还有应用了dpr之后媒体查询可能问题,
(就是媒体查询的宽度会和设备的宽度*dpr,相等),
即在rem布局时,慎用媒体查询/ 默认写上dpr为1的
fontSize
[data-dpr="2"]
div { font-size: 24px;}
[data-dpr="3"]
div { font-size: 36px;}
if (!dpr && !scale) {
var isAndroid = win.navigator.appVersion.match(/android/gi);
var isIPhone = win.navigator.appVersion.match(/iphone/gi);
var devicePixelRatio = win.devicePixelRatio;
if (isIPhone) {
// iOS下,对于2和3的屏,用2倍的方案,其余的用1倍方案
if (devicePixelRatio >= 3 && (!dpr || dpr >= 3)) {
dpr = 3;
} else if (devicePixelRatio >= 2 && (!dpr || dpr >= 2)){
dpr = 2;
} else {
dpr = 1;
}
} else {
// 其他设备下,仍旧使用1倍的方案
dpr = 1;
}
scale = 1 / dpr;
}
docEl.setAttribute('data-dpr', dpr);
if (!metaEl) {
metaEl = doc.createElement('meta');
metaEl.setAttribute('name', 'viewport');
metaEl.setAttribute('content', 'initial-scale=' + scale + ', maximum-scale=' + scale + ', minimum-scale=' + scale + ', user-scalable=no');
if (docEl.firstElementChild) {
docEl.firstElementChild.appendChild(metaEl);
} else {
var wrap = doc.createElement('div');
wrap.appendChild(metaEl);
doc.write(wrap.innerHTML);
}
}
function refreshRem(){
var width = docEl.getBoundingClientRect().width;
if (width / dpr > 540) {
width = 540 * dpr;
}
var rem = width / 10;
docEl.style.fontSize = rem + 'px';
flexible.rem = win.rem = rem;
}
可能是我没有深入的理解dpr这个问题,
我现在就觉得,我就可以只根据屏幕宽度,来动态改变html font-size大小,不去考虑,dpr的问题,
现在我这样写也没出现什么问题,显示效果也还行,真的有必要使用dpr吗???
我看到了这篇文章想法和我一样点击打开链接,真的有必要吗?
现在我是这样做的,写一段这样的js,仅仅只靠,屏幕宽度来改变html font-size大小,
我是按phone6设计图来的,只需在设计图上量取尺寸,除以100 ,写在css样式里,单位为rem,方便极了,至今还没发现问题
(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{
alert(clientWidth);
docEl.style.fontSize = 100 * (clientWidth / 750) + 'px';
}
};
if (!doc.addEventListener) return;
win.addEventListener(resizeEvt, recalc, false);
doc.addEventListener('DOMContentLoaded', recalc, false);
})(document, window);
3、我还用过,用css3zoom ,缩放,对元素进行缩放也是根据屏幕宽度的通过,zoom属性根据不同屏幕尺寸,按照不同比例进行缩放,也能达到移动端适配效果,
但zoom这个属性,的支持程度实在太差,写的是时候字体缩放出现了问题,
安卓字体缩放正常,ios无法缩放,最后通过 -webkit-text-adjust:auto;虽然勉强达到了效果,应付了那次项目上线,最后心里还是挺害怕的
第一次写博客,写完之后,才发现文章是那么难写,感觉从头到尾写的驴唇不对马嘴,太难受,估计也不会有人看了,,,谨以此移动端适配来纪念我的第一篇博客,,以后我会慢慢完善它的