rem.js //rem是移动端常用的尺寸单位,rem通过控制html的font-size的大小为标准,对页面单位进行调整,//rem布局方式就是,通过监听浏览器窗口大小的改变,从而改变页面单位,使其达到适
//rem是移动端常用的尺寸单位,rem通过控制html的font-size的大小为标准,对页面单位进行调整, //rem布局方式就是,通过监听浏览器窗口大小的改变,从而改变页面单位,使其达到适配所有屏幕的效果 ///////////////////////////////////////下面是 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>=640){ docEl.style.fontSize = '100px'; }else{ docEl.style.fontSize = 100 * (clientWidth / 640) + 'px'; } }; if (!doc.addEventListener) return; win.addEventListener(resizeEvt, recalc, false); doc.addEventListener('DOMContentLoaded', recalc, false); })(document, window); /*********************************************************************/ /** rem中的坑(推荐使用-->本人项目中常用) * 1.在webview中嵌套h5网页的时候使用rem布局,当页面初次加载的时候出现页面混乱问题解决方法 */ (function (doc, win) { var docEl = doc.documentElement, resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize', recalc = function () { var h = Math.max(document.documentElement.clientHeight, window.innerHeight || 0); var w = Math.max(document.documentElement.clientWidth, window.innerWidth || 0); //检测是否为横竖屏 var width = w > h ? h : w; width = width > 640 ? 640 : width var fz = 100 * (width / 640) document.getElementsByTagName("html")[0].style.cssText = 'font-size: ' + fz +"px"; //再次获取html的font-size大小 var realfz = ~~(+window.getComputedStyle(document.getElementsByTagName("html")[0]).fontSize.replace('px','')*10000)/10000 //判断设置的和获取的是不是相同(不相同的话重新设置) if (fz !== realfz) { document.getElementsByTagName("html")[0].style.cssText = 'font-size: ' + fz * (fz / realfz) +"px"; } }; if (!doc.addEventListener) return; //当窗口发生变化的时候调用 window.addEventListener('resize', recalc, false); //在用户水平或者垂直翻转设备(即方向发生变化)时触发的事件。 window.addEventListener('orientationchange', recalc, false); //当初始HTML文档被完全加载和解析完成之后触发事件,而无需等待样式表、图像和子框架完成加载。 document.addEventListener('DOMContentLoaded', recalc, false); })(document, window); /** *rem布局字体不用rem值是因为在Retina屏幕下会变的很大,而这时候我们更希望在大屏幕上显示更多的内容, *在淘宝中是用了dpr是判断 */ //js实现的dpr判断: 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; } document.documentElement.setAttribute('data-dpr', dpr); //css样式中的使用 div { width: 1rem; height: 0.4rem; font-size: 12px; // 默认写上dpr为1的fontSize } [data-dpr="2"] div { font-size: 24px; } [data-dpr="3"] div { font-size: 36px; } /** * 3.页面首次加载出现页面混乱问题解决方法 */ /** * 1.JS加载顺序与加载方法 * 页面加载顺序通常是”从上往下”加载的,所以在内容区域,也就是body以及body包含的DOM还未被浏览器遍历之前, * 我们就应该将html的font-size计算好。 * 于是乎,我们应当把计算字体的js放在body之前,如下所示:推荐——原生写法(优化加载,加快body的显示): */ // jQ写法(不利于加载,不过jquery.min.js体积也不算太大): /** * 2.小技巧——对body进行CSS处理 * 如果不像1一样,让js方法在页面加载到body之前就运行,又能保证加载完成前页面不错乱应该怎么做呢! * 这里运用小技巧,利用css以及js的计时器等进行处理,先让body隐藏,在计算好html的font-size后再令其显示。 * 其实按道理来说,这样的处理方式有点粗暴,但是也不是不可采用,方法如下: * 1.给html中的body添加行内样式 style=”display:none”, 先设置隐藏; * 2.计算js的方法在body之后添加,做到先加载网页文档; */ /** * 1毫秒的时间我们可以忽略不计但是,这样的方法是有缺点的(至于存在多少问题,问题的大小,只能是一步步被发现): * body设置隐藏之后,body元素从页面中被移除,而之后的js在遍历一些元素等偶尔会出现一些问题,比如使用过swiper框架的朋友可以试下, * 在初始化swiper之前设置以上方法试试~!你会发现,swiper无法使用了惊恐,无妨,后续介绍其解决方法! */ /** * 3.优化上面的小技巧——对body进行CSS处理 * 上述方法使用的display:none会有一定的问题,所以,大家不妨使用到display的表兄弟——visibility属性,方法与2 * 几乎一样,如下: * 1. 给html中的body添加行内样式 style=”visibility:hidden”,(就是替换display:none,其他不变) 先设置隐藏; * 计算js的方法在body之后添加,做到先加载网页文档; * 在计算font-size的js方法之后添加showPage 的js (就是替换display:none,其他不变)。 * visibility属性只是将元素隐藏,保留了其原本的位置,相当于它依然存在在页面上,只是隐身了~~~~!!!!!!!相比较2,风险就小多了~! */ ------------------------------------------------------------------------------------ /** * 前端适应布局扩展 * 可以使用vw(等于视口宽度) * 也可以使用640布局(但是需要设计出640稿) * 640布局只需要在head标签中写入(css都用Px处理即可) * *移动端开发法神器可以使用console.log的,下载链接:http://pan.baidu.com/s/1eSKmop0 密码:q1e6 */