移动端rem布局,用户调整手机字体大小或浏览器字体大小后导致页面布局出错问题

 

一、用户修改手机字体设置大小,影响App里打开的web页面。

手机字体设置大小,影响App的页面。
Android的可以通过webview配置webview.getSettings().setTextZoom(100)就可以禁止缩放,按照百分百显示。

 

二、用户调整浏览器字体大小,影响的是从浏览器打开的web页

 

浏览器设置字体大小,影响浏览器打开的页面。通过js可控制用户修改字体大小,使页面不受影响。

 

2020-12-24 

版本02,解决了部分的安卓手机rem比例不对的问题

/*
    作者:alan
    此版本应用于 750px尺寸的 iOS 设计稿
    rem计算方式:设计图尺寸px / 100 = 实际rem  【例: 100px = 1rem,32px = 0.32rem】
 */
!function (window) {
    /* 设计图文档宽度 */
    var docWidth = 750;
    var doc = window.document,
        docEl = doc.documentElement,
        resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize';
    var recalc = (function refreshRem () {
        /* 窗口当前宽度 */
        var clientWidth = docEl.getBoundingClientRect().width;
        /* 页面宽度大于 750 时不再放大 */
        clientWidth = clientWidth > 750 ? 750 : clientWidth;
        var oldSize = (clientWidth/docWidth*100) + 'px';
        docEl.style.fontSize = oldSize;

        /* 获取设置后的字体大小情况 - 因微信设置APP字体大小后会影响该设置 */
        var nowSize = window.getComputedStyle(document.getElementsByTagName("html")[0]).fontSize;
        var oldSizeValue = parseFloat(oldSize,10);
        var nowSizeValue = parseFloat(nowSize,10);

        /* 当差值大于1时重新按差比计算出正确的px值 */
        if((nowSizeValue - oldSizeValue) > 1 || (nowSizeValue - oldSizeValue) < -1){
            var diff = (oldSizeValue / nowSizeValue);
            docEl.style.fontSize = (clientWidth/docWidth*100*diff) + 'px';
        }
        // 设置app和新闻详情页最低高度
        var aa = window.screen.height;
        if(document.getElementsByClassName("xwxq-body").length>0){
            document.getElementsByClassName("xwxq-body")[0].style.minHeight=(aa-nowSize.split('px')[0])+'px';
        }
        document.getElementById("app").style.minHeight=aa+'px'
        // alert(nowSize.split('px')[0])
        return refreshRem;
    })();
    /* 添加倍屏标识,安卓为1 */
    docEl.setAttribute('data-dpr', window.navigator.appVersion.match(/iphone/gi) ? window.devicePixelRatio : 1);
    if (/iP(hone|od|ad)/.test(window.navigator.userAgent)) {
        /* 添加IOS标识 */
        doc.documentElement.classList.add('ios');
        /* IOS8以上给html添加hairline样式,以便特殊处理 */
        if (parseInt(window.navigator.appVersion.match(/OS (\d+)_(\d+)_?(\d+)?/)[1], 10) >= 8)
            doc.documentElement.classList.add('hairline');
    }
    if (!doc.addEventListener) return;
    window.addEventListener(resizeEvt, recalc, false);
    doc.addEventListener('DOMContentLoaded', recalc, false);

}(window);

 

 

2017~

版本01,最初版

(function(doc, win) {
//      用原生方法获取用户设置的浏览器的字体大小(兼容ie)
        if(doc.documentElement.currentStyle) {
            var user_webset_font=doc.documentElement.currentStyle['fontSize'];
        }
        else {
            var user_webset_font=getComputedStyle(doc.documentElement,false)['fontSize'];
        }
//      取整后与默认16px的比例系数
        var xs=parseFloat(user_webset_font)/16;
//      设置rem的js设置的字体大小
        var view_jsset_font,result_font;
        var docEl = doc.documentElement,
        resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',
        clientWidth,
        recalc = function() {
            clientWidth = docEl.clientWidth;
            if(!clientWidth) return;
            if(!doc.addEventListener) return;
            if(clientWidth<750){
//              设置rem的js设置的字体大小
                view_jsset_font=100 * (clientWidth / 750);
//              最终的字体大小为rem字体/系数
                result_font=view_jsset_font/xs;
//              设置根字体大小
                docEl.style.fontSize = result_font + 'px';
                }
            else{
                docEl.style.fontSize = 100 + 'px';
                }
        };
    win.addEventListener(resizeEvt, recalc, false);
    doc.addEventListener('DOMContentLoaded', recalc, false);
})(document, window);

 

 

 

 

 

参考:https://www.cnblogs.com/Han39/p/7803266.html

 

posted @ 2019-07-23 15:44  泠风lj  阅读(3197)  评论(0编辑  收藏  举报