rem布局在webview中頁面錯亂解決辦法

2022-09-08 14:00:21 字數 1741 閱讀 3779

一般設計稿750px,為了便於計算,設1rem = 100px; 也就是1rem = 1 * htmlfontsize (htmlfontsize 為 html 元素的字型大小),在iphone6 375px寬的螢幕上,htmlfontsize 為50px。

其實,htmlfontsize 除了以px為單位外,還可以用百分比作為單位,比如你可以設定htmlfontsize的大小為312.5%,頁面的布局效果與設定htmlfontsize 大小為50px是一樣的效果。

那麼問題來了,設定為百分比單位的時候,這個百分比值是怎麼計算出來的呢?

瀏覽器預設字型大小為 16px,當我們使用百分比作為根節點 html 的字型大小時,rem 的計算方式就會改為

defaultfontsize = 16px

1rem = 1 * htmlfontsize * defaultfontsize

比如375畫素寬裝置上:

1rem = 1 * 312.5% *16 = 50 px
這與我們的實際情況相符,但是在有些 android 手機上,瀏覽器或 webview 的預設字型是隨著系統設定的字型改變的。

這樣就會導致預設字型大於或小於16px。從這個思路出發,我們只需要找到系統設定的字型大小就可以正確的計算htmlfontsize的值了。

於是寫乙個函式來獲取defaultfontsize的值:

//獲取系統預設字型大小

//designwidth 設計稿的寬度

//rem2px 設計稿寬度下,1rem的寬度

function adapt(designwidth, rem2px);

然後再結合我們之前計算 htmlfontsize 的函式可以得到完整的計算方式:

!(function(doc, win, designwidth, rem2px)  else 

};if (!doc.addeventlistener) return;

win.addeventlistener(resizeevt, recalc, false);

doc.addeventlistener('domcontentloaded', recalc, false);

})(document, window, 750, 100);

親測有效,可以一試!

之前搜尋了很久,也沒有看到很好的解決方案,包括像**的flexible適配方案也沒有解決這個問題,今天寫文章的時候在搜尋結果的後面幾頁,有一篇文章同樣也是介紹這個問題的,解決思路還是有點不太一樣的,這位同學是直接去獲取html的實際大小和理想值的比值,然後做 htmlfontsize 的相應處理,這裡一併給大家分享!

一般,我們動態計算好html的font-size之後,我們就啥都不幹了,就走了。

但是,我們現在知道了,我們設定的大小不一定是真實的大小,所以,我們需要在設定完字型大小之後,再去重新獲取一下html的font-size,看看實際的這個值,和我們設定的是不是一樣。

如果不一樣,就要根據比例再設定一次。

function htmlfontsize()

}

如:在每個webview配置webview.getsettings().settextzoom(100)就可以了。

其實我建議用第三種方案進行處理,因為這樣體驗更統一,但是想想,如果使用者確實有調大字型的需求,或者有看小字型的習慣,使用者設定字型大小,你就是不給人家任何變化,也是相當不好的體驗呢。

Flexible實現H5頁面的rem布局適配

1 使用flexible實現手淘h5頁面的終端適配 2 flexible實現手淘h5頁面的rem布局適配 3 vue移動端flexible.js結合muse ui使用的小坑 4 的flexible適配方案為什麼只對ios進行dpr判斷,對於android始終認為其dpr為1 6 rem 及由此引申出...

小程式中webview內嵌h5頁面

小程式內嵌h5頁面跳轉小程式指定頁面,需要引用 jssdk h5頁面 aaa.htmldoctype html html head meta charset utf 8 meta name viewport content width device width,initial scale 1.0,m...

談談h5頁面中的rem

rem實現思路 rem單位是基於html標籤的font size來進行計算的,預設情況下1rem 16px,有些瀏覽器預設字型是12px,1rem 12px 在移動端通過設定不同的font size來實現頁面整體布局的縮放自適應。原理性的東西不做過多的贅述,網上各位大手都介紹的很詳細了,下面就說說在...