Open jiangjiu opened 6 years ago
分享过一个keynote,大部分的内容都在keynote里,以下内容是个简单的补充。 移动端适配方案探究.zip
使用vw实现全尺寸适配布局,不支持vw单位的使用JS动态设置font-size优雅降级。 业务组件开发时,使用rem单位开发。
因运营活动的特殊性,暂不考虑:
Viewport units又称视口单位,指的是浏览器的可视区域。
根据CSS3规范,视口单位主要包括以下4个:
视口单位区别于%单位,视口单位是依赖于视口的尺寸,根据视口尺寸的百分比来定义的;而%单位则是依赖于元素的祖先元素。 例如,在桌面端浏览器视口尺寸为650px,那么 1vw = 650 * 1% = 6.5px(这是理论推算的出,如果浏览器不支持0.5px,那么实际渲染结果可能是7px)。
可以看到,ios6.1+及安卓4.4+原生支持。
QA团队测试机器,以下兼容性较差机型的手百端内测试已通过:
一句话总结:大部分机型在大部分浏览器环境中都可以很好的支持,有少数机型在特定浏览器下存在兼容性问题。
既然vw可以作为大小的单位,为什么不单独使用,而是和rem方案协同呢? 理由有三个:
谈到优缺点,就和春玩内容节的实现(rem动态计算)来做个对比吧。
想不出来
源码:
// 测试是否支持vw (function (doc, win) { var dummy = doc.createElement('_').style; dummy.width = '1vm'; if (dummy.width) { return; } // 不支持的动态设置font-size var docEl = doc.documentElement, resizeEvt = 'orientationchange' in win ? 'orientationchange' : 'resize', recalc = function () { var clientWidth = docEl.clientWidth; if (!clientWidth) { return; } // 12份 docEl.style.fontSize = (clientWidth / 20) + 'px'; }; recalc(); win.addEventListener(resizeEvt, recalc, false); })(document, window);
压缩版
!function(e,n){var t=e.createElement("_").style;if(t.width="1vm",!t.width){var i=e.documentElement,o="orientationchange"in n?"orientationchange":"resize",a=function(){var e=i.clientWidth;e&&(i.style.fontSize=e/20+"px")};a(),n.addEventListener(o,a,!1)}}(document,window);
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no"> <style> html { font-size: 5vw; } p { width: 12rem; height: 12rem; font-size: 5rem; } </style> </head> <body> <script> let start, end; (function () { start = performance.now(); function fixAutoResetRem() { document.documentElement.style.fontSize = document.documentElement.clientWidth / 12 + 'px'; setTimeout(function () { var oDiv = document.createElement('div'); oDiv.style.width = '100%'; document.body.appendChild(oDiv); var bDiv = document.createElement('div'); bDiv.style.width = '12rem'; document.body.appendChild(bDiv); var rfs = document.documentElement.clientWidth / 12; document.documentElement.style.fontSize = oDiv.clientWidth / bDiv.clientWidth * rfs + 'px'; document.body.removeChild(oDiv); document.body.removeChild(bDiv); end = performance.now(); console.log('异步执行完毕: ' + (end - start)); }, 0); } window.addEventListener('resize', fixAutoResetRem); fixAutoResetRem(); })(); </script> <p>hhh</p> </body> </html>
上图可知,内联script标签执行完毕平均耗时在40-70ms,除了解析html,另外引发了一次layout。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no"> <script> (function (doc, win) { var start = performance.now(); var dummy = doc.createElement('_').style; dummy.width = '1vw'; if (dummy.width) { var end = performance.now(); console.log('支持:' + (end - start)); return; } var docEl = doc.documentElement, resizeEvt = 'orientationchange' in win ? 'orientationchange' : 'resize', recalc = function () { var clientWidth = docEl.clientWidth; if (!clientWidth) { return; } docEl.style.fontSize = (clientWidth / 20) + 'px'; }; recalc(); win.addEventListener(resizeEvt, recalc, false); var end = performance.now(); console.log(end - start); })(document, window); </script> <style> html { font-size: 5vw; } p { width: 12rem; height: 12rem; font-size: 5rem; } </style> </head> <body> <p>hhh</p> </body> </html>
上图可知,内联script标签执行完毕平均耗时在1-5ms,没有额外的layout。
分享过一个keynote,大部分的内容都在keynote里,以下内容是个简单的补充。 移动端适配方案探究.zip
运营活动布局方案
思路
使用vw实现全尺寸适配布局,不支持vw单位的使用JS动态设置font-size优雅降级。 业务组件开发时,使用rem单位开发。
因运营活动的特殊性,暂不考虑:
Viewport units 单位
简介
Viewport units又称视口单位,指的是浏览器的可视区域。
根据CSS3规范,视口单位主要包括以下4个:
视口单位区别于%单位,视口单位是依赖于视口的尺寸,根据视口尺寸的百分比来定义的;而%单位则是依赖于元素的祖先元素。 例如,在桌面端浏览器视口尺寸为650px,那么 1vw = 650 * 1% = 6.5px(这是理论推算的出,如果浏览器不支持0.5px,那么实际渲染结果可能是7px)。
兼容性
可以看到,ios6.1+及安卓4.4+原生支持。
QA团队测试机器,以下兼容性较差机型的手百端内测试已通过:
一句话总结:大部分机型在大部分浏览器环境中都可以很好的支持,有少数机型在特定浏览器下存在兼容性问题。
vw + rem 协同
既然vw可以作为大小的单位,为什么不单独使用,而是和rem方案协同呢? 理由有三个:
优缺点
谈到优缺点,就和春玩内容节的实现(rem动态计算)来做个对比吧。
vw+rem方案的优点:
vw+rem方案的劣势:
相比内容节方案的优势:
相比内容节方案的劣势:
想不出来
code
源码:
压缩版
对比测试及分析
测试环境
内容节方案
内容节方案测试情况
上图可知,内联script标签执行完毕平均耗时在40-70ms,除了解析html,另外引发了一次layout。
vw+rem 方案
vw+rem 方案测试情况
上图可知,内联script标签执行完毕平均耗时在1-5ms,没有额外的layout。
性能总结