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. STM32外设:定时器TIM

    主要外设: TIM:Timer 定时器 TIM中的基本电路 定时器 计数器的基本功能 复位:计数器值=初值.产生一个输出脉冲.产生更新事件(UEV)脉冲.更新中断标志UIF=1 计数:计数器值递增或递 ...

  2. MongoDB入门级别教程全(Windows版,保姆级教程)

    下载mongodb 进入官网: Download MongoDB Community Server | MongoDB 选择msi,Windows版本 下载完后直接双击: 选择complete 这里建 ...

  3. ubuntu 22.04搭建本地源

    ubuntu 22.04搭建本地源 基于服务器无法联网的情况下,从一台可以上网的服务器下载软件包和依赖,再在无法联网的服务器中搭建本地源,安装环境. 下载(包括依赖): cd /root mkdir ...

  4. Mybatis-Flex核心功能之@Id

    1.是什么? 在 Entity 类中,MyBatis-Flex 是使用 @Id 注解来标识主键的 2.怎么玩? public @interface Id { /** * ID 生成策略,默认为 non ...

  5. transformer模型

    Transformer由谷歌团队在论文<Attention is All You Need>提出,是基于attention机制的模型,最大的特点就是全部的主体结构均为attention. ...

  6. 解析$nextTick魔力,为啥大家都爱它?

    1.为什么需要使用$nextTick? 首先我们来看看官方对于$nextTick的定义: 在下次 DOM 更新循环结束之后执行延迟回调.在修改数据之后立即使用这个方法,获取更新后的 DOM. 由于vu ...

  7. 这些 git 高级命令你知道几个

    大家好,我是 dom 哥.今天给大家分享几个 git 的高级应用. git 是目前最流行的版本控制工具.git 玩的 6 不 6,轻则影响自己的开发幸福指数 ,重则影响下班时间 .本文介绍一些日常开发 ...

  8. Kubernetes架构及安装

    K8s架构 k8s内部是有几个组件的,分别是controller manager,api-server,scheduler,kubelet以及etcd,kube-proxy还有k8s客户端kubect ...

  9. 看MindSpore加持下,如何「炼出」首个千亿参数中文预训练语言模型?

    摘要:千亿参数量的中文大规模预训练语言模型时代到来. 本文分享自华为云社区< MindSpore开源框架加持,如何「炼出」首个千亿参数.TB级内存的中文预训练语言模型?>,原文作者:che ...

  10. Redis现网那些坑:用个缓存,还要为磁盘故障买单?

    摘要:向业务查询超时say goodbye! 本文分享自华为云社区<Redis现网那些坑:用个缓存,还要为磁盘故障买单?>,作者: GaussDB 数据库 . 近日,网上一些电商用户出现了 ...