H5 android老人機(jī)適配方案

前言

部門(mén)移動(dòng)端布局采用的是rem+font-size的方案,這種方案中font-size的值至關(guān)重要滔金。正常情況下頁(yè)面不會(huì)出現(xiàn)布局錯(cuò)亂現(xiàn)象圈澈,但是部分android機(jī),通過(guò)改變系統(tǒng)默認(rèn)字號(hào)(若改成大號(hào)字體)會(huì)導(dǎo)致font-size值被放大按价,相當(dāng)于乘了一個(gè)放大因子scale惭适,從而導(dǎo)致頁(yè)面布局錯(cuò)亂,本文就是解決這個(gè)問(wèn)題楼镐。
(所謂老人機(jī)癞志,這里指手動(dòng)修改了系統(tǒng)默認(rèn)字體或縮放設(shè)置)

舉例

數(shù)據(jù)來(lái)源:三星S8手機(jī)

系統(tǒng)縮放設(shè)置 系統(tǒng)字體設(shè)置 clientWidth font-size(clientWidth/7.5) 布局是否正常
412 54.93
412 54.93
412 54.93
360 48
360 48
360 48
320 42.67
320 42.67
320 42.67

結(jié)論:
1、系統(tǒng)縮放設(shè)置(部分手機(jī)能設(shè)置該項(xiàng))可改變clientWidth(取自document.documentElement.clientWidth)框产;
2凄杯、同縮放下,系統(tǒng)默認(rèn)字體被修改后茅信,雖然font-size值沒(méi)變盾舌,但在渲染時(shí)實(shí)際上被隱式放大或縮小了,記為縮放因子scale蘸鲸;

方案

思路:這個(gè)縮放因子scale很重要妖谴,它是導(dǎo)致頁(yè)面布局錯(cuò)亂的罪魁禍?zhǔn)祝绻肋@個(gè)scale酌摇,那么取其倒數(shù)膝舅,就可以恢復(fù)正常。
先看看rem+font-size的布局套路:

<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no">
    <title>墨粉club</title>
    <script>
    (function() {
        var maxLimitW = 768,
            remCount = 7.5,
            clientW = document.documentElement.clientWidth||document.body.clientWidth;
        var initFontSize = Math.min(maxLimitW, clientW) / remCount;
        document.documentElement.style.fontSize = initFontSize + 'px';
    })();
    </script>
</head>

由上表可知窑多,縮放程度為中仍稀,默認(rèn)字體為小時(shí),頁(yè)面正常顯示」∠ⅲ現(xiàn)在考慮縮放程度為中技潘,默認(rèn)字體為中的情形:
字面上計(jì)算的font-size沒(méi)變(記為F1),但實(shí)際上渲染時(shí)的font-size是被放大了的千康,記為(F1=F2*scale)享幽,得出scale=F1/F2;
關(guān)鍵點(diǎn):scale還可以這么計(jì)算,正常情況下拾弃,我們認(rèn)為頁(yè)面寬度被分為7.5份值桩,但縮放后頁(yè)面肯定不是7.5份了,假設(shè)縮放后頁(yè)面寬度被分為N份豪椿,則scale*N=7.5奔坟,得scale=7.5/N携栋;所以有7.5/N=F1/F2,從而有F2=F1*N/7.5咳秉;只要計(jì)算出N婉支,就能計(jì)算出F2。
下面就是如何計(jì)算N:

 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 N = (render.width.slice(0, -2) / render.height.slice(0, -2)).toFixed(1);
            setTimeout(function() {
                remFixDom.style.cssText = "height:0";
            }, 1000)
        });

算出F2后滴某,設(shè)置為html的font-size=F2即可修復(fù)該問(wèn)題磅摹。
完整代碼:

 (function() {
        var maxLimitW = 768,
            remCount = 7.5,
            clientW = document.documentElement.clientWidth,
            hasReadyInit;
        // 兼容三星S8 bug,只有第一次進(jìn)入時(shí)才能取得clientW的值霎奢,第二次進(jìn)該值為0户誓,所以用localStorage存起來(lái)
        if (clientW) {
            localStorage.setItem('clientW', clientW);
        } else {
            clientW = localStorage.getItem('clientW');
        }
        var initFontSize = Math.min(maxLimitW, clientW) / remCount;
        document.documentElement.style.fontSize = initFontSize + 'px';
        // 修正系統(tǒng)設(shè)置了字號(hào)之后,支持動(dòng)態(tài)字體的APP會(huì)強(qiáng)制調(diào)整網(wǎng)頁(yè)font-size幕侠,導(dǎo)致rem方式的適配亂版問(wèn)題(比如下面ua)
        //eg. 華為QQ內(nèi)置瀏覽器 Android 7.0; EVA-AL00 Build/HUAWEIEVA-AL00; wv) Mobile MQQBrowser/6.2 QQ/7.1.5.3215
        if (clientW >= maxLimitW) return;
        if (hasReadyInit) return; //已經(jīng)注冊(cè)過(guò)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);
            var finalFontSize = initFontSize * (rRate / remCount);
            if (finalFontSize) {
                localStorage.setItem('finalFontSize', finalFontSize);
            } else {
                finalFontSize = localStorage.getItem('finalFontSize');
            }
            if (rRate != remCount) document.documentElement.style.fontSize = finalFontSize + "px";
            hasReadyInit = true;
            setTimeout(function() {
                remFixDom.style.cssText = "height:0";
            }, 1000)
        });
    })();
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末帝美,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子晤硕,更是在濱河造成了極大的恐慌悼潭,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件舞箍,死亡現(xiàn)場(chǎng)離奇詭異舰褪,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)疏橄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)占拍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人捎迫,你說(shuō)我怎么就攤上這事晃酒。” “怎么了窄绒?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵贝次,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我彰导,道長(zhǎng)蛔翅,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任位谋,我火速辦了婚禮山析,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘倔幼。我一直安慰自己盖腿,他們只是感情好爽待,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布损同。 她就那樣靜靜地躺著翩腐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪膏燃。 梳的紋絲不亂的頭發(fā)上茂卦,一...
    開(kāi)封第一講書(shū)人閱讀 52,268評(píng)論 1 309
  • 那天,我揣著相機(jī)與錄音组哩,去河邊找鬼等龙。 笑死,一個(gè)胖子當(dāng)著我的面吹牛伶贰,可吹牛的內(nèi)容都是我干的蛛砰。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼黍衙,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼泥畅!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起琅翻,我...
    開(kāi)封第一講書(shū)人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤位仁,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后方椎,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體聂抢,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年棠众,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了琳疏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡摄欲,死狀恐怖轿亮,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情胸墙,我是刑警寧澤我注,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站迟隅,受9級(jí)特大地震影響但骨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜智袭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一奔缠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧吼野,春花似錦校哎、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)腰奋。三九已至,卻和暖如春抱怔,著一層夾襖步出監(jiān)牢的瞬間劣坊,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工屈留, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留局冰,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓灌危,卻偏偏與公主長(zhǎng)得像康二,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子勇蝙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

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

  • 問(wèn)答題47 /72 常見(jiàn)瀏覽器兼容性問(wèn)題與解決方案赠摇? 參考答案 (1)瀏覽器兼容問(wèn)題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,759評(píng)論 1 92
  • 移動(dòng)設(shè)備瀏覽器的問(wèn)題中心在于CSS,特別是viewport的尺寸浅蚪。在移動(dòng)設(shè)備上進(jìn)行網(wǎng)頁(yè)的開(kāi)發(fā)藕帜,首先得搞明白的就是移...
    勿以浮沙筑高臺(tái)閱讀 1,748評(píng)論 0 2
  • 在進(jìn)入正文之前,我們需要先了解一些viewport相關(guān)的概念惜傲。 viewport 一般來(lái)說(shuō)洽故,我們?cè)诖a的最開(kāi)始會(huì)寫(xiě)...
    SuperSnail閱讀 6,423評(píng)論 0 19
  • 日精進(jìn)打卡 姓名 朱均 企業(yè)名稱(chēng) 寧波大發(fā)化纖公司 組別 上海盛和塾276期反省一組 【日精進(jìn)打卡第60天】 【知...
    朱均f7c8閱讀 85評(píng)論 0 0
  • 套路還是不夠深,好好看盗誊,好好學(xué) 今日記下一個(gè)智障行為 RecyclerView一定要記得加LayoutManage...
    李汪汪汪俠閱讀 222評(píng)論 0 0