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

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

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

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

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

 1 <script>
2 var docEl = document.documentElement,
3 //当设备的方向变化(设备横向持或纵向持)此事件被触发。绑定此事件时,
4 //注意现在当浏览器不支持orientationChange事件的时候我们绑定了resize 事件。
5 //总来的来就是监听当前窗口的变化,一旦有变化就需要重新设置根字体的值
6 resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',
7 recalc = function () {
8 //设置根字体大小1:50适用于375的设计稿,需要变更,就更改基础字体的数值
9 docEl.style.fontSize = 100 * (docEl.clientWidth / 750) + 'px';
10 };
11
12 //绑定浏览器缩放与加载时间
13 window.addEventListener(resizeEvt, recalc, false);
14 document.addEventListener('DOMContentLoaded', recalc, false);
15 </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希望给大家一些直观的感受,不要问为什么不给链接!

  1 <!DOCTYPE html>
2 <html>
3
4 <head>
5 <meta HTTP-EQUIV="Pragma" CONTENT="no-cache">
6 <meta HTTP-EQUIV="Cache-Control" CONTENT="no-cache">
7 <meta HTTP-EQUIV="Expires" CONTENT="0">
8 <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" charset="utf-8">
9 <title>我姓李名乾坤</title>
10 <script type="text/javascript">
11 var docEl = document.documentElement,
12 //当设备的方向变化(设备横向持或纵向持)此事件被触发。绑定此事件时,
13 //注意现在当浏览器不支持orientationChange事件的时候我们绑定了resize 事件。
14 //总来的来就是监听当前窗口的变化,一旦有变化就需要重新设置根字体的值
15 resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',
16 recalc = function () {
17 //设置根字体大小
18 docEl.style.fontSize = 100 * (docEl.clientWidth / 750) + 'px';
19 };
20
21 //绑定浏览器缩放与加载时间
22 window.addEventListener(resizeEvt, recalc, false);
23 document.addEventListener('DOMContentLoaded', recalc, false);
24 </script>
25 <style type="text/css">
26 * {
27 margin: 0;
28 padding: 0;
29 }
30
31 ul,
32 li {
33 list-style: none;
34 background: white;
35 margin-top: .01rem;
36 }
37
38 html,
39 body {
40 font-family: "微软雅黑";
41 width: 100%;
42 height: 100%;
43 background: #E9E9E9;
44 }
45
46 .left {
47 float: left;
48 }
49
50 .loan {
51 width: 7.2rem;
52 }
53
54 .loan>li {
55 width: 7.5rem;
56 height: 1.99rem;
57 border-bottom: 1px solid #E9E9E9;
58 }
59
60 .logoBox {
61 width: 1.45rem;
62 height: 1.57rem;
63 padding-left: .3rem;
64 padding-top: .4rem;
65 }
66
67 .logoBox>img {
68 width: 1.17rem;
69 height: 1.17rem;
70 }
71
72 .contentBox {
73 width: 4.5rem;
74 height: 1.17rem;
75 padding-top: .4rem;
76 }
77
78 .Name {
79 width: 4.5rem;
80 height: .5rem;
81 line-height: .5rem;
82 font-size: .3rem;
83 color: #333333;
84 }
85
86 .description {
87 width: 4.5rem;
88 height: .22rem;
89 line-height: .22rem;
90 font-size: .22rem;
91 color: #666666;
92 margin-bottom: .1rem;
93 }
94
95 .contentBox>span {
96 padding: .05rem .06rem;
97 font-size: .14rem;
98 line-height: .14rem;
99 color: #fc936d;
100 background: #fff4f0;
101 margin-right: .05rem;
102 }
103
104 .optBtn {
105 width: 1.1rem;
106 height: .4rem;
107 line-height: .4rem;
108 text-align: center;
109 background: #FFFFFF;
110 font-size: .22rem;
111 color: #fc936d;
112 margin-top: 1rem;
113 border-radius: .1rem;
114 }
115 </style>
116 </head>
117
118 <body>
119 <ul class="loan">
120 <li id="paipaidai">
121 <div class="logoBox left">
122 ![](1.png)
123 </div>
124 <div class="contentBox left">
125 <p class="Name">贴代码</p>
126 <p class="description">贴代码,贴代码</p>
127 <span class="left">贴代码</span>
128 <span class="left">贴代码</span>
129 <span class="left">贴代码</span>
130 </div>
131 <div class="optBtn left">喜欢代码</div>
132 </li>
133 <li id="paipaidai">
134 <div class="logoBox left">
135 ![](1.png)
136 </div>
137 <div class="contentBox left">
138 <p class="Name">贴代码</p>
139 <p class="description">贴代码,贴代码</p>
140 <span class="left">贴代码</span>
141 <span class="left">贴代码</span>
142 <span class="left">贴代码</span>
143 </div>
144 <div class="optBtn left">喜欢代码</div>
145 </li>
146 <li id="paipaidai">
147 <div class="logoBox left">
148 ![](1.png)
149 </div>
150 <div class="contentBox left">
151 <p class="Name">贴代码</p>
152 <p class="description">贴代码,贴代码</p>
153 <span class="left">贴代码</span>
154 <span class="left">贴代码</span>
155 <span class="left">贴代码</span>
156 </div>
157 <div class="optBtn left">喜欢代码</div>
158 </li>
159 </ul>
160 </body>
161
162 </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之间的换算有点麻烦。

总结

不知道上面的分享有没有帮助到你,你要是问我有没有推荐的,我已经把适用的场景说的很明白了。你可以自己选择,我现在一般是用的第二种的。

希望能帮助到你们~如果有什么问题,请大家多多指出。

rem在手机移动端app中的兼容适配问题的更多相关文章

  1. 如何在移动端app中应用字体图标icon fonts

    How to use icon fonts in your mobile apps 在任何APP设计中实现可图形的矢量缩放最完美的方式是使用字体图标. 移动端的设计变的越来越复杂.原因在于多样的屏幕尺 ...

  2. 【PC桌面软件的末日,手机移动端App称王】写在windows11支持安卓,macOS支持ios,龙芯支持x86和arm指令翻译

    面对这场突如其来的变革,作为软件开发者,应该如何选择自己今后的发展方向?桌面软件开发领域还有前景吗? 起源 自从苹果发布m1处理器,让自家Mac支持IOS移动端app运行之后,彻底打破了移动端app和 ...

  3. 如何在移动端app中应用字体图标icon fonts (转)

    原文: http://www.cnblogs.com/willian/p/4166757.html?utm_source=tuicool&utm_medium=referral How to ...

  4. 从手机浏览器或者 APP 中跳转到微信并跳转到指定页原理及行业内幕详解

    相信很多朋友遇到过有些网站,可以直接通过一个连接就能让你的手机打开微信且跳转到某个指定的页面,许多程序员很好奇到底是怎么实现的,到处求这种方法的源码,在文本中我会介绍及剖析这种跳转实现的原理. 微信是 ...

  5. C#服务端通过Socket推送数据到Android端App中

    需求: 描述:实时在客户端上获取到哪些款需要补货. 要求: 后台需要使用c#,并且哪些需要补货的逻辑写在公司框架内,客户端采用PDA(即Android客户端 版本4.4) . 用户打开了补货通知页面时 ...

  6. 手机页面或是APP中减少使用setTimeout和setInterval,因为他们会导致页面卡顿

    1.setTimeout致使页面的卡顿或是不流畅,打乱模块的生命周期 ,还有setTimeout其实是很难调试的. 当一个页面有众多js代码的时候,setTimeout就是导致页面的卡顿. var s ...

  7. Vue在移动端App中使用的问题总结

    1.客户端中弹出键盘使得fixed布局错乱 Vue 在移动端中使用,当弹出键盘时,fixed 布局的元素可能会被键盘顶起. 例子图示及解决方法参考:https://blog.csdn.net/qq_3 ...

  8. web app变革之rem(手机屏幕实现全适配)

    以往web移动适配,常规写法是:media only screen @media only screen and (min-device-width: 320px){ //针对iPhone 3 } @ ...

  9. 【js】手机浏览器端唤起app,没有app就去下载app 的方法

    这种功能的作用: 1.一般公司有自己的app,而app是需要不断有新用户涌入才能持续运营,达到不错的收入.就需要使用这种方式进行引入新的用户. 2.一些内容在网页端体验不好,或者一些功能需要app内才 ...

  10. 用Chrome devTools 调试Android手机app中的web页面。

    (1) 手机要满足Android系统为4.4或更高版本,低版本不支持这种方式.(2) 确保App已经开启了webview的debug调试模式,由Android工程师协助.(2) 用usb数据线连接好手 ...

随机推荐

  1. [AI]大模型稳定角色扮演形成“自我认知”

    引言 自我身份认知是人类重要的认知能力之一,它决定着个体在社会中的定位以及与他人的互动方式.了解自我身份认知形成的机理对心理学和认知科学研究具有重要意义.传统上,人类自我认知一直被视为一个个体内在形成 ...

  2. 使用 PyTorch FSDP 微调 Llama 2 70B

    引言 通过本文,你将了解如何使用 PyTorch FSDP 及相关最佳实践微调 Llama 2 70B.在此过程中,我们主要会用到 Hugging Face Transformers.Accelera ...

  3. 使用 Taro 开发鸿蒙原生应用 —— 当 Taro 遇到纯血鸿蒙

    纯血鸿蒙即将到来 在今年 8 月的「2023年华为开发者大会(HDC.Together)」上,华为正式官宣「鸿蒙Next」,这个更新的版本将移除所有的 AOSP 代码,彻底与 Android 切割,使 ...

  4. Maven仓库settings.xml配置信息

    找到你的settings.xml配置文件E:\maven3.6.3\apache-maven-3.6.3\conf # 你的本地依赖仓库路径 <localRepository>E:\mav ...

  5. StingBuilder与StringBuffer包含的常见方法(图示)

    StingBuilder与StringBuffer包含的常见方法

  6. 小姐姐用动画图解Git命令,一看就懂!

    无论是开发.运维,还是测试,大家都知道Git在日常工作中的地位.所以,也是大家的必学.必备技能之一.之前公众号也发过很多git相关的文章: Git这些高级用法,喜欢就拿去用!一文速查Git常用命令,搞 ...

  7. Visual Studio 2022版本17.8中的实用功能

    前言 今天介绍一下Visual Studio 2022版本17.8这一发行版中的4个比较实用功能. 保留大小写查找和替换 这个功能之前就有,不过我觉得对于日常搜索.替换而言还是比较实用的.在执行查找. ...

  8. JavaFx 打包jar(六)

    JavaFx 打包jar(六) JavaFX 从入门入门到入土系列 我们编写了不少javafx,那么如何打包成jar给用户呢?下面我给出比较全的打包方式. 打包jar 下面我给出比较全的打包方式. 1 ...

  9. MySQL 的开窗函数

    开窗函数 (Window Function)提供了行集之间的计算能力,在现代的主流关系型数据库中,基本都提供了相似的功能,这些功能在一些业务开发的过程中很有用,本文将简要介绍这些常用的开窗函数 ROW ...

  10. mysql 数据库 定时 备份到阿里云盘

    仓库地址: gitee:db_backup_script: mysql 数据库 定时/实时 备份数据库到阿里云盘,备份成功后消息可通知到钉钉群.企业微信群.wxpusher (gitee.com gi ...