rem在手机移动端app中的兼容适配问题。

这是我之前一直使用的第一种rem方案。贴代码

<script>
    // 适用于750的设计稿
    var iScale = 1;
    // 通过页面加载的时候去获取用户设备的物理像素比
    iScale = iScale / window.devicePixelRatio;
    // 然后来设置html的<meta>表现的缩放属性,从而达到在任意页面实现页面布局的自适应的效果
        document.write('<meta name="viewport" content="width=device-width,' +
            'initial-scale=' + iScale + ',minimum-scale=' + iScale + ',maximum-scale=' + iScale + ',user-scalable=no" />')
    // 获取浏览器窗口文档显示区域的宽度,不包括滚动条。
        var iWidth = document.documentElement.clientWidth;
    // 设置页面基础的字体大小
        document.getElementsByTagName('html')[0].style.fontSize = iWidth / 15 + 'px';
</script>
  1. 这段代码的意思就是,通过页面加载的时候去获取用户设备的物理像素比,然后来设置html的<meta>表现的缩放属性,从而达到在任意页面实现页面布局的自适应的效果,下面的设置页面基本字体的我设置的除以15,在iPhone6上面的font-size = 50px;也就是1rem = 50px;别问我为什么这么设置,全是因为个人习惯。
  2. 关于设备的物理像素比,如果有不懂的同学,我推荐大家去研读一下张鑫旭老师写的一篇文档,关于设备物理像素比的,里面说的很详细,下面是物理像素比的介绍

下面说一下我在使用第一种方案遇到的问题。

  1. 在我平时在任何的手机浏览器的页面中,不管是pc端的浏览器,还是手机自带的浏览器,都是可以自适应的缩放页面,达到的效果也是理想的。这个就不跟demo了。
  2. 后来我再工作中一直也是这么用的,在一次和app开发的小伙伴合作的时候,因为页面是内嵌在app里面,app开发的时候,会默认的对浏览器的使用会做一些默认的设置,就比如下面的这一条属性:WebSettings.setUseWideViewPort(true);//设置此属性,可任意比例缩放,一般的安卓的app的开发者都会默认禁止这条属性;说是会对其他的东西有影响。那么这样的话,就不能够实现任意比例的缩放了,也当然达不到我们想要的结果。

后来我又找到我现在使用的第二种rem方案。贴代码

    <script>
        var docEl = document.documentElement,
            //当设备的方向变化(设备横向持或纵向持)此事件被触发。绑定此事件时,
            //注意现在当浏览器不支持orientationChange事件的时候我们绑定了resize 事件。
            //总来的来就是监听当前窗口的变化,一旦有变化就需要重新设置根字体的值
            resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',
            recalc = function () {
                //设置根字体大小1:50适用于375的设计稿,需要变更,就更改基础字体的数值
                docEl.style.fontSize = 100 * (docEl.clientWidth / 750) + 'px';
            };

        //绑定浏览器缩放与加载时间
        window.addEventListener(resizeEvt, recalc, false);
        document.addEventListener('DOMContentLoaded', recalc, false);
    </script>

第二个方案相比第一个方案来说有两个有点。

  1. 更加的方便,因为监听了当前窗口的变化而执行js代码,更加的便捷。
  2. 不用依赖标签<meta>的缩放大小的属性,可以直接写为<meta name="viewport" content="width=device-width,initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">这样就可以了。这样就避免了在app中安卓禁止页面任意比例缩放后,页面不能自适应的这个bug。

给大家上一个小的demo希望给大家一些直观的感受,不要问为什么不给链接!

<!DOCTYPE html>
<html>

<head>
    <meta HTTP-EQUIV="Pragma" CONTENT="no-cache">
    <meta HTTP-EQUIV="Cache-Control" CONTENT="no-cache">
    <meta HTTP-EQUIV="Expires" CONTENT="0">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" charset="utf-8">
    <title>我姓李名乾坤</title>
    <script type="text/javascript">
        var docEl = document.documentElement,
            //当设备的方向变化(设备横向持或纵向持)此事件被触发。绑定此事件时,
            //注意现在当浏览器不支持orientationChange事件的时候我们绑定了resize 事件。
            //总来的来就是监听当前窗口的变化,一旦有变化就需要重新设置根字体的值
            resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',
            recalc = function () {
                //设置根字体大小
                docEl.style.fontSize = 100 * (docEl.clientWidth / 750) + 'px';
            };

        //绑定浏览器缩放与加载时间
        window.addEventListener(resizeEvt, recalc, false);
        document.addEventListener('DOMContentLoaded', recalc, false);
    </script>
    <style type="text/css">
        * {
            margin: 0;
            padding: 0;
        }

        ul,
        li {
            list-style: none;
            background: white;
            margin-top: .01rem;
        }

        html,
        body {
            font-family: "微软雅黑";
            width: 100%;
            height: 100%;
            background: #E9E9E9;
        }

        .left {
            float: left;
        }

        .loan {
            width: 7.2rem;
        }

        .loan>li {
            width: 7.5rem;
            height: 1.99rem;
            border-bottom: 1px solid #E9E9E9;
        }

        .logoBox {
            width: 1.45rem;
            height: 1.57rem;
            padding-left: .3rem;
            padding-top: .4rem;
        }

        .logoBox>img {
            width: 1.17rem;
            height: 1.17rem;
        }

        .contentBox {
            width: 4.5rem;
            height: 1.17rem;
            padding-top: .4rem;
        }

        .Name {
            width: 4.5rem;
            height: .5rem;
            line-height: .5rem;
            font-size: .3rem;
            color: #333333;
        }

        .description {
            width: 4.5rem;
            height: .22rem;
            line-height: .22rem;
            font-size: .22rem;
            color: #666666;
            margin-bottom: .1rem;
        }

        .contentBox>span {
            padding: .05rem .06rem;
            font-size: .14rem;
            line-height: .14rem;
            color: #fc936d;
            background: #fff4f0;
            margin-right: .05rem;
        }

        .optBtn {
            width: 1.1rem;
            height: .4rem;
            line-height: .4rem;
            text-align: center;
            background: #FFFFFF;
            font-size: .22rem;
            color: #fc936d;
            margin-top: 1rem;
            border-radius: .1rem;
        }
    </style>
</head>

<body>
    <ul class="loan">
        <li id="paipaidai">
            <div class="logoBox left">
                ![](1.png)
            </div>
            <div class="contentBox left">
                <p class="Name">贴代码</p>
                <p class="description">贴代码,贴代码</p>
                <span class="left">贴代码</span>
                <span class="left">贴代码</span>
                <span class="left">贴代码</span>
            </div>
            <div class="optBtn left">喜欢代码</div>
        </li>
        <li id="paipaidai">
            <div class="logoBox left">
                ![](1.png)
            </div>
            <div class="contentBox left">
                <p class="Name">贴代码</p>
                <p class="description">贴代码,贴代码</p>
                <span class="left">贴代码</span>
                <span class="left">贴代码</span>
                <span class="left">贴代码</span>
            </div>
            <div class="optBtn left">喜欢代码</div>
        </li>
        <li id="paipaidai">
            <div class="logoBox left">
                ![](1.png)
            </div>
            <div class="contentBox left">
                <p class="Name">贴代码</p>
                <p class="description">贴代码,贴代码</p>
                <span class="left">贴代码</span>
                <span class="left">贴代码</span>
                <span class="left">贴代码</span>
            </div>
            <div class="optBtn left">喜欢代码</div>
        </li>
    </ul>
</body>

</html>

其实第二个方案来说还有一个缺点,第一个方案也同样具有:就是当app的开发者禁止调用我们前端开发的界面使用js的时候,那我们的rem方案就有不能自适应了,因为我们知道我们是设置了页面的基础字体的大小来达到自适应的目的,那么浏览器默认的rem和px的比例应该是1:16的比例。当静止js的时候,页面就还原成为原始的比例,而我们设置的一般,为了更好的计算都是1:50或者是1:100,那这样页面就会整体的显得缩小了很多,但是页面布局还是没有乱的。(那么有同学问了,既然我们知道问题所在了,那为什么不把页面基础字体的大小设置成和默认的差不多然后不就无敌了?那下面就有了第三种的方案)

这是第三种rem方案。贴代码

window.onload=function(){var e=(document.documentElement.clientWidth>=640?640:document.documentElement.clientWidth)/320*12;document.documentElement.clientHeight;document.getElementsByTagName("html")[0].style.fontSize=e+"px"};

这种方案的的好处是它的rem和px比值在浏览器模拟机器上面的比值是1:12,其数值大小也同样是可以调整的,这样的做的好处就是,在安卓原生的app上面,即使app的开发者禁止了js的使用,也可以做到一个相对的自适应,效果要比前面的两个要好一点,但是缺点就是px和rem之间的换算有点麻烦。

总结

不知道上面的分享有没有帮助到你,你要是问我有没有推荐的,我已经把适用的场景说的很明白了。你可以自己选择,我现在一般是用的第二种的。
希望能帮助到你们~如果有什么问题,请大家多多指出。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容