移动端浏览器在设置rem时的区别,用户设置浏览器最大最小字体

 背景:移动端布局时候,在设置html根元素的font-size大小,也就是rem的基准值的时候,我们不同浏览器的表现不同(需要考虑用户缩放最大最小字体)。

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

 

我们平常不考虑放大最大最小字体的时候,或者是在混合开发的时候,我们可以用以下处理方式:

版本1:

(function(doc, win) {
    var docEl = doc.documentElement,
        resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',
        recalc = function() {
            var clientWidth = docEl.clientWidth;
            if (!clientWidth) return;
            docEl.style.fontSize = 75 * (clientWidth / 750) + 'px';
        };
    if (!doc.addEventListener) return;
    win.addEventListener(resizeEvt, recalc, false);
    doc.addEventListener('DOMContentLoaded', recalc, false);
})(document, window);

  

混合开发的时候,仍然需要谨慎某些手机默认字体很大的情况,像某些三星手机默认字体就是很大,所以部分地方需要考虑是否会溢出到下一行。

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

在考虑到不仅是混合开发还得是各种浏览器的时候,通常一种做法是:

1)用户设置最大字体,js等比例缩小到原来字体大小;

2)用户设置最小字体,js等比例放大到原来字体大小;

一般处理如下:

版本2:

(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);

  晚上资料说:部分的安卓手机rem比例不对的问题。

 

升级版,版本3:

此升级版无实际动手实验应用,参考自网上资料。

/*
    作者: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);

结束。

以下说明是基于版本2:

小米自带小米浏览器:在浏览器上调整字体大小,只改变fontSize的大小,不改变width等字体大小。

以下指字体调到最大例子:

console.log("getComputedStyle(document.getElementsByTagName('html')[0],false)['fontSize']---:"+getComputedStyle(document.getElementsByTagName('html')[0],false)['fontSize'])

//打印73.377px

console.log("getComputedStyle-7.5rem--width:"+getComputedStyle(document.getElementsByClassName('page-marquee')[0],false)['width']+"-rem是:"+parseFloat(getComputedStyle(document.getElementsByClassName('page-marquee')[0],false)['width'].replace('px','')/7.5))

//打印,getComputedStyle-7.5rem--width:393px-rem是:52.4  (说明:保持与代码设置的一致了)

console.log("getComputedStyle-0.24rem-fontSize:"+getComputedStyle(document.getElementsByClassName('page-marquee-scroll')[0],false)['fontSize']+"-rem是:"+parseFloat(getComputedStyle(document.getElementsByClassName('page-marquee-scroll')[0],false)['fontSize'].replace('px','')/0.24))

//getComputedStyle-0.24rem-fontSize:17.6105px---rem是:73.377

QQ浏览器:在浏览器上调整字体大小,改变fontSize大小,也改变width等的大小。

console.log("getComputedStyle(document.getElementsByTagName('html')[0],false)['fontSize']---:"+getComputedStyle(document.getElementsByTagName('html')[0],false)['fontSize'])

//打印77.552px

console.log("getComputedStyle-7.5rem--width:"+getComputedStyle(document.getElementsByClassName('page-marquee')[0],false)['width']+"-rem是:"+parseFloat(getComputedStyle(document.getElementsByClassName('page-marquee')[0],false)['width'].replace('px','')/7.5))

//打印,getComputedStyle-7.5rem--width:581.625px-rem是:77.55  (说明:保持与代码设置的一致了)

console.log("getComputedStyle-0.24rem-fontSize:"+getComputedStyle(document.getElementsByClassName('page-marquee-scroll')[0],false)['fontSize']+"-rem是:"+parseFloat(getComputedStyle(document.getElementsByClassName('page-marquee-scroll')[0],false)['fontSize'].replace('px','')/0.24))

//getComputedStyle-0.24rem-fontSize:18.6125px---rem是:77.55

==========

小米不特殊处理(按照放大缩小比例颠倒回来)大致都是好的,qq浏览器不按照比例颠倒回来就不行完全错乱,

 

 

QQ浏览器:字体调到最小:   		不处理

除xs前:39.825px             39.824px
除xs后:52.4px(默认 )       无处理
width:52.4px  				39.824px
font-size:52.4px。          39.824px

说明:默认值指:100 * (document.documentElement.clientWidth / 750) + 'px';  
QQ浏览器设置浏览器字体大小,文档代码所有元素都起作用,都改变。




小米浏览器:字体调到最小:   		不处理

除xs前:36.68px             		36.68px 
除xs后:52.4px(默认 )       	无处理
width:74.8568px 				52.4px
font-size:52.4px          		36.68px 


说明:小米浏览器设置浏览器字体大小,只改变了文档代码的对于font-size属性的值大小,width等不改变。




UC浏览器:字体调到最小:   		不处理

除xs前:41.92px             		41.92px
除xs后:52.4px(默认 )       	无处理
width:65.5px					52.4px
font-size:52.4px          		41.92px 


说明:UC浏览器设置浏览器字体大小,只改变了文档代码的对于font-size属性的值大小,width等不改变。

 

  综上:uc和小米一个特性,改浏览器字体大小,只改font-size的大小,不改变width等大小。

/xs后,所有浏览器的font-size的大小都正常,恢复默认值52.4:即100 * (document.documentElement.clientWidth / 750)。

/xs后,宽度的1rem变成了74.8568px等,所以小米浏览器和UC浏览器等就不能用rem单位来布局了。原本一屏幕刚好的,现在一屏幕放不下了(调到最小的时候)。

同理,调大最大字体,1rem的宽变小了,原本一屏幕刚好的,现在一屏幕只显示了一半左右(调到最大的时候),其余后边一片区域显示空白。

所以:只需要font-size用rem,这种方式宽度用百分比比较合适,具体页面复杂度,具体灵活应用,高度可以使用px。

 

wwwover---未完待续。。。

posted @ 2021-09-08 15:48  仔行天下  阅读(553)  评论(0编辑  收藏  举报