測試同窗忽然拿着一部手機過來講,H5渲染各個元素都變大了,有些元素撐出了屏幕外面。css
原本覺得是某個Webview的渲染兼容問題,結果發現全部的瀏覽器都這樣。html
莫名其妙,隱約感受是 rem計算出了問題,開始一點點查。前端
由於,組內移動端項目,統一約束了寬度滿屏7.5rem,因此,先看看這個比例:瀏覽器
$("body").append("<div id='flag' style='width:100%;height:1rem;'></div>");
alert($("#flag").width()/$("#flag").height());
以下圖,正常是7.5,測試同窗拿來的bug機,6.52。。。尼瑪,什麼鬼。 app
其實,最開始,並無想爲啥會不是7.5,當時只是解決問題,頁面開始渲染的時候,我先偷偷算一下當前渲染的是否是7.5,若是不是,我給強行掰過來。佈局
正常狀況下:測試
根節點的 fontsize=屏幕寬度/7.5字體
如今出了異常,系統實際寬度滿屏6.52個rem的狀況下,渲染效果變大了。在初始計算的fontsize基礎上作了比例放大加持,那解決方案應該是:spa
相應比例縮小一下初始的fontsize,改成fontsize=fontsize*這個比例(即6.52/7.5)3d
代碼以下:
/* * html 頭部最先執行的js片斷 用於rem計算等 */ (window.onresize = function() { var maxLimitW = 768, remCount = 7.5, clientW = document.documentElement.clientWidth, hasReadyInit; var initFontSize = Math.min(maxLimitW, clientW) / remCount; document.documentElement.style.fontSize = initFontSize + 'px'; // 修正系統設置了字號以後,支持動態字體的APP會強制調整網頁font-size,致使rem方式的適配亂版問題 @2017.8 if (clientW >= maxLimitW) return; if (hasReadyInit) return; //已經註冊過ready修正事件了 document.addEventListener('DOMContentLoaded', function() { var remFixDom = document.createElement("div"); remFixDom.style.cssText = "width:100%;height:1rem;opacity:0;position:absolute;z-index:-9999;"; document.body.appendChild(remFixDom); var render = window.getComputedStyle(remFixDom); var rRate = (render.width.slice(0, -2) / render.height.slice(0, -2)).toFixed(1); if (rRate != remCount) document.documentElement.style.fontSize = initFontSize * (rRate / remCount) + "px"; hasReadyInit = true; }); })();
這個時候,我忽然意識到,尼瑪,是否是改了系統裏的字號設置,一看,果真是。。。
雖然解決了問題,可是,其實這樣並非太好,由於畢竟用戶改了系統字號設置,他就是想看更大的東西的。
因此,原則上來講,css的佈局上,應該更流式佈局一些,而不是所有rem作等比縮放。
可是呢,這樣下來,UI和前端開發成本就都高了。
得不償失,收益比低呢。
哈哈。