rem布局在webview中頁面錯(cuò)亂解決辦法

前一段做活動(dòng)頁鲫凶,在公司運(yùn)營同事手機(jī)上替废,活動(dòng)頁布局是亂的,在瀏覽器和絕大部分手機(jī)上也正常绎晃,這位同事的手機(jī)是安卓蜜唾,在自家app的webview中的打開頁面就錯(cuò)亂了,公司測(cè)試android機(jī)webview中的打開頁面就沒問題庶艾,查看代碼袁余,html的font-size設(shè)置正常,考慮是rem布局的問題咱揍,替換為百分比布局頁面就正常了颖榜,網(wǎng)上搜了搜發(fā)現(xiàn)原來是系統(tǒng)字體大小的問題,這類問題常見于安卓設(shè)備上煤裙,而且是內(nèi)嵌在APP里面的H5頁面掩完,用的解決方案3,安卓同事在APP內(nèi)直接設(shè)置webview的默認(rèn)字體大小硼砰,這樣以后所有的webview打開H5都可以解決這個(gè)問題且蓬。




以下為轉(zhuǎn)載
https://blog.csdn.net/u013778905/article/details/77972841

解決方案

方案一(獲取系統(tǒng)字體大小)

一般設(shè)計(jì)稿750px题翰,為了便于計(jì)算恶阴,設(shè)1rem = 100px; 也就是1rem = 1 * htmlFontSize (htmlFontSize 為 html 元素的字體大小)豹障,在iPhone6 375px寬的屏幕上冯事,htmlFontSize 為50px。

其實(shí)血公,htmlFontSize 除了以px為單位外桅咆,還可以用百分比作為單位,比如你可以設(shè)置htmlFontSize的大小為312.5%坞笙,頁面的布局效果與設(shè)置htmlFontSize 大小為50px是一樣的效果岩饼。

那么問題來了,設(shè)置為百分比單位的時(shí)候薛夜,這個(gè)百分比值是怎么計(jì)算出來的呢籍茧?

瀏覽器默認(rèn)字體大小為 16px,當(dāng)我們使用百分比作為根節(jié)點(diǎn) html 的字體大小時(shí)梯澜,rem 的計(jì)算方式就會(huì)改為

defaultFontSize = 16px
1rem = 1 * htmlFontSize * defaultFontSize

比如375像素寬設(shè)備上:

1rem = 1 * 312.5% *16 = 50 px

這與我們的實(shí)際情況相符寞冯,但是在有些 Android 手機(jī)上,瀏覽器或 webview 的默認(rèn)字體是隨著系統(tǒng)設(shè)置的字體改變的晚伙。

這樣就會(huì)導(dǎo)致默認(rèn)字體大于或小于16px吮龄。從這個(gè)思路出發(fā),我們只需要找到系統(tǒng)設(shè)置的字體大小就可以正確的計(jì)算htmlFontSize的值了咆疗。

于是寫一個(gè)函數(shù)來獲取defaultFontSize的值:

//獲取系統(tǒng)默認(rèn)字體大小
//designWidth 設(shè)計(jì)稿的寬度
//rem2px 設(shè)計(jì)稿寬度下漓帚,1rem的寬度
function adapt(designWidth, rem2px){
    var d = window.document.createElement('p');
    d.style.width = '1rem';
    d.style.display = "none";
    var head = window.document.getElementsByTagName('head')[0];
    head.appendChild(d);
    var defaultFontSize = parseFloat(window.getComputedStyle(d, null).getPropertyValue('width'));
    return defaultFontSize
};

然后再結(jié)合我們之前計(jì)算 htmlFontSize 的函數(shù)可以得到完整的計(jì)算方式:

!(function(doc, win, designWidth, rem2px) {
    var docEl = doc.documentElement,
       defaultFontSize = /*adapt(designWidth, rem2px),*/16,
       resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',
       recalc = function() {
           var clientWidth = win.innerWidth
                        || doc.documentElement.clientWidth
                        || doc.body.clientWidth;
 
           if (!clientWidth) return;
           if (clientWidth < 750) {
               docEl.style.fontSize = clientWidth / designWidth * rem2px / defaultFontSize * 100 + '%';
 
           } else {
               docEl.style.fontSize = '625%';
           }
       };
    if (!doc.addEventListener) return;
    win.addEventListener(resizeEvt, recalc, false);
    doc.addEventListener('DOMContentLoaded', recalc, false);
})(document, window, 750, 100);

親測(cè)有效,可以一試午磁!

方案二(獲取html元素實(shí)際寬度)

之前搜索了很久尝抖,也沒有看到很好的解決方案,包括像淘寶的flexible適配方案也沒有解決這個(gè)問題迅皇,今天寫文章的時(shí)候在搜索結(jié)果的后面幾頁昧辽,有一篇文章同樣也是介紹這個(gè)問題的,解決思路還是有點(diǎn)不太一樣的登颓,這位同學(xué)是直接去獲取html的實(shí)際大小和理想值的比值搅荞,然后做 htmlFontSize 的相應(yīng)處理,這里一并給大家分享框咙!

一般咕痛,我們動(dòng)態(tài)計(jì)算好html的font-size之后,我們就啥都不干了扁耐,就走了暇检。

但是,我們現(xiàn)在知道了婉称,我們?cè)O(shè)置的大小不一定是真實(shí)的大小块仆,所以,我們需要在設(shè)置完字體大小之后王暗,再去重新獲取一下html的font-size悔据,看看實(shí)際的這個(gè)值,和我們?cè)O(shè)置的是不是一樣俗壹。

如果不一樣科汗,就要根據(jù)比例再設(shè)置一次。

function htmlFontSize(){
    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 > 720 ? 720 : width
    var fz = ~~(width*100000/36)/10000
    document.getElementsByTagName("html")[0].style.cssText = 'font-size: ' + fz +"px";
    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";
    }
}

方案三(客戶端固定webview字體大斜脸)

推動(dòng)移動(dòng)端同學(xué)進(jìn)行處理头滔,在APP內(nèi)直接設(shè)置webview的默認(rèn)字體大小怖亭。

如:在每個(gè)webview配置webview.getSettings().setTextZoom(100)就可以了。

同樣處理方式的有如微信坤检,大家可以先修改下手機(jī)系統(tǒng)字體大小兴猩,然后再去體驗(yàn)微信里面的游戲/購物(這里是用web實(shí)現(xiàn)的),發(fā)現(xiàn)根本不會(huì)受影響(首先我查看源碼看了下里面的頁面早歇,是用了rem布局的)倾芝。

其實(shí)我建議用第三種方案進(jìn)行處理,因?yàn)檫@樣體驗(yàn)更統(tǒng)一箭跳,但是想想晨另,如果用戶確實(shí)有調(diào)大字體的需求,或者有看小字體的習(xí)慣谱姓,用戶設(shè)置字體大小借尿,你就是不給人家任何變化,也是相當(dāng)不好的體驗(yàn)?zāi)亍?/p>

所以微信就在 設(shè)置-通用-字體大小里面內(nèi)置了設(shè)置字體大小的功能逝段,幫助用戶得到更好的閱讀體驗(yàn)垛玻。





最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市奶躯,隨后出現(xiàn)的幾起案子帚桩,更是在濱河造成了極大的恐慌,老刑警劉巖嘹黔,帶你破解...
    沈念sama閱讀 222,378評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件账嚎,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡儡蔓,警方通過查閱死者的電腦和手機(jī)郭蕉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來喂江,“玉大人召锈,你說我怎么就攤上這事』裱” “怎么了涨岁?”我有些...
    開封第一講書人閱讀 168,983評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)吉嚣。 經(jīng)常有香客問我梢薪,道長(zhǎng),這世上最難降的妖魔是什么尝哆? 我笑而不...
    開封第一講書人閱讀 59,938評(píng)論 1 299
  • 正文 為了忘掉前任秉撇,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘琐馆。我一直安慰自己规阀,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評(píng)論 6 398
  • 文/花漫 我一把揭開白布啡捶。 她就那樣靜靜地躺著姥敛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瞎暑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,549評(píng)論 1 312
  • 那天与帆,我揣著相機(jī)與錄音了赌,去河邊找鬼。 笑死玄糟,一個(gè)胖子當(dāng)著我的面吹牛勿她,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播阵翎,決...
    沈念sama閱讀 41,063評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼逢并,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了郭卫?” 一聲冷哼從身側(cè)響起砍聊,我...
    開封第一講書人閱讀 39,991評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎贰军,沒想到半個(gè)月后玻蝌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,522評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡词疼,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評(píng)論 3 342
  • 正文 我和宋清朗相戀三年俯树,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贰盗。...
    茶點(diǎn)故事閱讀 40,742評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡许饿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出舵盈,到底是詐尸還是另有隱情陋率,我是刑警寧澤,帶...
    沈念sama閱讀 36,413評(píng)論 5 351
  • 正文 年R本政府宣布书释,位于F島的核電站翘贮,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏爆惧。R本人自食惡果不足惜狸页,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧芍耘,春花似錦址遇、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至坝初,卻和暖如春浸剩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鳄袍。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評(píng)論 1 274
  • 我被黑心中介騙來泰國打工绢要, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人拗小。 一個(gè)月前我還...
    沈念sama閱讀 49,159評(píng)論 3 378
  • 正文 我出身青樓重罪,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親哀九。 傳聞我的和親對(duì)象是個(gè)殘疾皇子剿配,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容