問(wèn)題:
起初,按照祖?zhèn)鞯倪m配方案設(shè)置頁(yè)面html的大小芋哭,在所有的瀏覽器中都沒(méi)有適配問(wèn)題沉衣,但是放到APP內(nèi),在安卓手機(jī)上出現(xiàn)適配問(wèn)題减牺,布局全亂豌习。通過(guò)定位頁(yè)面的rem被APP自動(dòng)修改為其他值,造成適配失敗烹植。(頁(yè)面無(wú)其他地方修改rem)
問(wèn)題定位:
1斑鸦、檢查代碼其他地方是否修改rem
2、詢問(wèn)客戶端草雕,排除了他們修改rem的可能性
3巷屿、只有APP內(nèi)的H5頁(yè)面存在這種問(wèn)題
4、無(wú)意間墩虹,自己蛋疼地設(shè)置了一下手機(jī)字體的大小嘱巾,發(fā)現(xiàn)同一臺(tái)問(wèn)題手機(jī),rem被重設(shè)為另外一個(gè)值诫钓。
原因:
通過(guò)問(wèn)題定位發(fā)現(xiàn)只要滿足以下因素就會(huì)出現(xiàn)此bug
1旬昭、在APP中打開(kāi)
2、手機(jī)設(shè)置里可以設(shè)置字體大小
3菌湃、動(dòng)態(tài)設(shè)置rem
解決辦法:
使用動(dòng)態(tài)插入meta標(biāo)簽问拘,在設(shè)置完rem后獲取hml的實(shí)際fontSize,如果不一致,對(duì)頁(yè)面進(jìn)行相應(yīng)的縮放處理骤坐。
具體代碼處理如下:
背后的思考:篡改rem的罪禍魁首
首先從本質(zhì)上說(shuō):
1绪杏、rem的實(shí)際效果是對(duì)頁(yè)面進(jìn)行縮放。
2纽绍、手機(jī)設(shè)置字體大小改變的是html上初始的fontSize蕾久。
問(wèn)題來(lái)了,即使自設(shè)的字體大小改變了hrml的初始fontSize,但是我們?cè)陔S后便對(duì)html的fontSize進(jìn)行了重設(shè)(即根據(jù)屏幕寬度劃分一個(gè)rem的大邪柘摹)僧著,按道理說(shuō),html的fontSize應(yīng)該就是我們最后設(shè)定的值障簿。記住盹愚,現(xiàn)實(shí)總是會(huì)赤裸裸地打你臉。html的fontSize在你重設(shè)后卷谈,它又被重設(shè)了,并且它的遵循一定的比例杯拐。
比例:假設(shè)自設(shè)字體大小為X霞篡,html的初始字體大小為16世蔗,這個(gè)比例為X/16。
那么是誰(shuí)把你的rem篡改了朗兵,就是你正在使用的客戶端污淋。
因?yàn)槟愕目蛻舳藳](méi)有對(duì)webview沒(méi)有加上webview.getSettings().setTextZoom(100);這樣webview里的字體就不會(huì)隨系統(tǒng)字體大小設(shè)置發(fā)生變化。
那么第二種解決辦法來(lái)了余掖,根據(jù) X/16 這個(gè)比例對(duì)rem進(jìn)行相應(yīng)的縮放寸爆。代碼如下:
var userSettingRatio =parseFloat(window.getComputedStyle(document.documentElement).fontSize) /16;//獲取比例
document.getElementsByTagName('html')[0].style.fontSize = wFsize / userSettingRatio +'px';//wFsize 是我們根據(jù)頁(yè)面寬度計(jì)算得rem,根據(jù)比例重新計(jì)算rem的大小盐欺。
這樣我們?cè)O(shè)置rem后赁豆,客戶端對(duì)rem進(jìn)行縮放后會(huì)得到我們正常的rem大小,也就是wFsize 的大小冗美。