1 (function (win, lib) {
2 var doc = win.document;
3 var docEl = doc.documentElement;
4 var metaEl = doc.querySelector('meta[name="viewport"]');
5 var flexibleEl = doc.querySelector('meta[name="flexible"]');
6 var dpr = 0;
7 var scale = 0;
8 var tid;
9 var flexible = lib.flexible || (lib.flexible = {});
10
11 if (metaEl) {
12 console.warn("将根据已有的meta标签来设置缩放比例");
13 var match = metaEl
14 .getAttribute("content")
15 .match(/initial\-scale=([\d\.]+)/);
16 if (match) {
17 scale = parseFloat(match[1]);
18 dpr = parseInt(1 / scale);
19 }
20 } else if (flexibleEl) {
21 var content = flexibleEl.getAttribute("content");
22 if (content) {
23 var initialDpr = content.match(/initial\-dpr=([\d\.]+)/);
24 var maximumDpr = content.match(/maximum\-dpr=([\d\.]+)/);
25 if (initialDpr) {
26 dpr = parseFloat(initialDpr[1]);
27 scale = parseFloat((1 / dpr).toFixed(2));
28 }
29 if (maximumDpr) {
30 dpr = parseFloat(maximumDpr[1]);
31 scale = parseFloat((1 / dpr).toFixed(2));
32 }
33 }
34 }
35 if (!dpr && !scale) {
36 var isAndroid = win.navigator.appVersion.match(/android/gi);
37 var isIPhone = win.navigator.appVersion.match(/iphone/gi);
38 var devicePixelRatio = win.devicePixelRatio;
39 if (isIPhone) {
40 // iOS下,对于2和3的屏,用2倍的方案,其余的用1倍方案
41 if (devicePixelRatio >= 3 && (!dpr || dpr >= 3)) {
42 dpr = 3;
43 } else if (devicePixelRatio >= 2 && (!dpr || dpr >= 2)) {
44 dpr = 2;
45 } else {
46 dpr = 1;
47 }
48 } else {
49 // 其他设备下,仍旧使用1倍的方案
50 dpr = 1;
51 }
52 scale = 1 / dpr;
53 }
54 docEl.setAttribute("data-dpr", dpr);
55 if (!metaEl) {
56 metaEl = doc.createElement("meta");
57 metaEl.setAttribute("name", "viewport");
58 metaEl.setAttribute(
59 "content",
60 "initial-scale=" +
61 scale +
62 ", maximum-scale=" +
63 scale +
64 ", minimum-scale=" +
65 scale +
66 ", user-scalable=no"
67 );
68 if (docEl.firstElementChild) {
69 docEl.firstElementChild.appendChild(metaEl);
70 } else {
71 var wrap = doc.createElement("div");
72 wrap.appendChild(metaEl);
73 doc.write(wrap.innerHTML);
74 }
75 }
76 function refreshRem() {
77 var width = docEl.getBoundingClientRect().width;
78 if (width / dpr > 540) {
79 width = 540 * dpr;
80 }
81 var rem = width / 7.5; // 屏幕分为7.5等分
82 docEl.style.fontSize = rem + "px";
83 flexible.rem = win.rem = rem;
84 }
85 win.addEventListener(
86 "resize",
87 function () {
88 clearTimeout(tid);
89 tid = setTimeout(refreshRem, 300);
90 },
91 false
92 );
93 win.addEventListener(
94 "pageshow",
95 function (e) {
96 if (e.persisted) {
97 clearTimeout(tid);
98 tid = setTimeout(refreshRem, 300);
99 }
100 },
101 false
102 );
103 if (doc.readyState === "complete") {
104 doc.body.style.fontSize = 12 * dpr + "px";
105 } else {
106 doc.addEventListener(
107 "DOMContentLoaded",
108 function (e) {
109 doc.body.style.fontSize = 12 * dpr + "px";
110 },
111 false
112 );
113 }
114
115 refreshRem();
116 flexible.dpr = win.dpr = dpr;
117 flexible.refreshRem = refreshRem;
118 flexible.rem2px = function (d) {
119 var val = parseFloat(d) * this.rem;
120 if (typeof d === "string" && d.match(/rem$/)) {
121 val += "px";
122 }
123 return val;
124 };
125 flexible.px2rem = function (d) {
126 var val = parseFloat(d) / this.rem;
127 if (typeof d === "string" && d.match(/px$/)) {
128 val += "rem";
129 }
130 return val;
131 };
132 })(window, window["lib"] || (window["lib"] = {}));

移动端h5中rem适配的更多相关文章

  1. 最佳移动端h5自适应rem适配方案

    一.利用lib-flexible.postcss-plugin-px2rem插件 进行移动端rem适配. 1.第一 引入lib-flexible . 安装lib-flexible: npm i lib ...

  2. 移动端H5多终端适配解决方案

    推荐三篇文章: 1.来自手淘团队的开源技术flexibal.js github地址:https://github.com/isHelenaChan/flexible 2.来自“大漠”(就职于淘宝,也是 ...

  3. H5中REM中使用的规则

    /*REM单位换算方法 iphone6适配*/ function resizeRoot(){ var Dpr = 1, uAgent = window.navigator.userAgent; var ...

  4. 移动端设备中1px适配

    方式1:伪类+transform实现,主要用transform中的scale缩放,缩放默认中心点是以x,y轴的50%处,因此需要用transform-origin调整中心点 html代码: <d ...

  5. 移动端h5模拟长按事件

    为啥写这篇文章 最近接了个需求,要求长按某个标签显示删除一个悬浮的删除按钮.这个需求其实在app上很常见,但是在移动端h5中,我们没有长按的事件,所以就需要自己模拟这个事件了. 大概效果如下: ps: ...

  6. H5 端 rem 适配方案与 viewport 适配

    H5 端 rem 适配方案与 viewport 适配 rem rem 是 CSS3 新增的一个相对单位(root em,根 em) 只根据当前页面 HTML 页面的 font-size 设置,如果根目 ...

  7. 基于rem的移动端响应式适配方案(详解) 移动端H5页面的设计稿尺寸大小规范

    基于rem的移动端响应式适配方案(详解) : https://www.jb51.net/article/118067.htm 移动端H5页面的设计稿尺寸大小规范 http://www.tuyiyi.c ...

  8. H5移动端rem适配

    /** * 移动端自适应 */ <meta name="viewport" content="width=device-width,user-scalable=no ...

  9. vue中使用第三方UI库的移动端rem适配方案

    需求:使用vue-cli脚手架搭建项目,并且使用第三方的UI库(比如vant,mint ui)的时候,因为第三方库用的都是用px单位,无法使用rem适配不同设备的屏幕. 解决办法:使用px2rem-l ...

  10. 移动端H5页面高清多屏适配方案

    背景 开发移动端H5页面 面对不同分辨率的手机 面对不同屏幕尺寸的手机 视觉稿 在前端开发之前,视觉MM会给我们一个psd文件,称之为视觉稿. 对于移动端开发而言,为了做到页面高清的效果,视觉稿的规范 ...

随机推荐

  1. RocksDB 在 vivo 消息推送系统中的实践

    作者:vivo 互联网服务器团队 - Zeng Luobin 本文主要介绍了 RocksDB 的基础原理,并阐述了 RocksDB 在vivo消息推送系统中的一些实践,通过分享一些对 RocksDB ...

  2. [ABC233G] Strongest Takahashi

    Problem Statement There is a $N \times N$ grid, with blocks on some squares. The grid is described b ...

  3. Python:单元测试框架unittest

    1.什么是单元测试 测试函数/方法或者一段代码,用于检验被测代码的一个很小的.很明确的功能是否正确,通常是开发做. 在Python中的单元测试框架有Unittest和Pytest,现在总结Unitte ...

  4. 深度学习前沿 | 利用GAN预测股价走势

    本文是对于medium上Boris博主的一篇文章的学习笔记,这篇文章中利用了生成对抗性网络(GAN)预测股票价格的变动,其中长短期记忆网络LSTM是生成器,卷积神经网络CNN是鉴别器,使用贝叶斯优化( ...

  5. ACTF flutter逆向学习

    参考了许多大佬的博客,在此特别诚挚感谢oacia大佬和其他大佬的博客和指导! 1.flutter和apk基础结构介绍 首先下载附件,是一个apk文件,用jadx打开 可以看见flutter字样,而fl ...

  6. Go 语言为什么很少使用数组?

    大家好,我是 frank,「Golang 语言开发栈」公众号作者. 01 介绍 在 Go 语言中,数组是一块连续的内存,数组不可以扩容,数组在作为参数传递时,属于值传递. 数组的长度和类型共同决定数组 ...

  7. Ubuntu 20.04 设置时区、配置NTP同步 timesyncd 代替 ntpd

    本文的服务器环境为 Ubuntu 20.04 系统,一个拥有 sudo 权限的非 root用户,并开启了防火墙. 基本时间命令 要在 Ubuntu 20.04 系统上查看服务器时间,可以使用 date ...

  8. CentOS系统中yum的基本用法

    最小化安装系统时,yum可能会因为网卡配置问题,随机启动配置,导致无法使用, 在shell里面输入:yum --help ,结果显示 yum 已经正常安装了!!到底是哪里出了问题呢?经过网友的提示,我 ...

  9. Vue3中使用TypeScript封装axios遇到的问题(AxiosRequestConfig)

    如果您有更好的解决方法,欢迎评论区评论. 版本 "dependencies": { "axios": "^1.4.0", "van ...

  10. Llama2-Chinese项目:8-TRL资料整理

      TRL(Transformer Reinforcement Learning)是一个使用强化学习来训练Transformer语言模型和Stable Diffusion模型的Python类库工具集, ...