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. MongoDB入门级别教程全(Windows版,保姆级教程)

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

  2. ij社区版如何创建spring项目

    他们说是使用spring  init什么什么的,那个都是老版的名称了,你去插件里面搜找是肯定搜不到的,现在叫spring boot helper,用这个,安装一下就好了(注意本次是在2022/11/1 ...

  3. DC静态时序分析之时钟篇

    DC静态时序分析之时钟篇博主微信:flm13724054952,不懂的有疑惑的也可以加微信咨询,欢迎大家前来投稿,谢谢! 引言介绍在芯片设计或者FPGA设计里面,根据有无时钟,将电路设计分为时序逻辑电 ...

  4. Protobuf的使用,结合idea

    安装Protobuf并配置idea Protocol Buffers(又名 protobuf)是 Google 的中立语言, 平台中立.可扩展的结构化数据序列化机制. 官网: https://gith ...

  5. 【YOLOv5】实现扑克牌的点数识别

    前言 其实年初的时候,我也跟着别人的源码,用 Tensoflow 实现过扑克牌的目标检测.虽然也通过博文的方式记录了,但是那个项目使用的 TF 版本比较旧,自身对 TF 并不熟.后期如果说要升级或修改 ...

  6. 容器网络Cilium:DualStack双栈特性分析

    本文分享自华为云社区<容器网络Cilium入门系列之DualStack双栈特性分析>,作者: 可以交个朋友. 一 . 关于IPV6/IPV4 双栈 目前很多公司开始将自己的业务由ipv4切 ...

  7. 聊聊GLM基座模型的理论知识

    概述 大模型有两个流程:预训练和推理. 预训练是在某种神经网络模型架构上,导入大规模语料数据,通过一系列的神经网络隐藏层的矩阵计算.微分计算等,输出权重,学习率,模型参数等超参数信息. 推理是在预训练 ...

  8. 2024年 为什么不建议新人学习ABAP

    引言 每个应届生都希望自己有良好的职业发展,当他们发现前路难通时,便会寻找更好的出路. "转码"曾经是个很火热的话题.在互联网行业高速发展的年代,转行学代码,入职大厂,升职加薪,是 ...

  9. KNN算法实战——海伦约会(KDtree优化)

    本文通过海伦约会的例子来测试之前写的KDTree的效果,并且探讨了特征是否进行归一化对整个模型的表现的影响.最后发现在机器学习中,特征归一化确实对模型能提供非常大的帮助. 1 from KDTree ...

  10. 【C#】【命名空间(namespace)】.NET6.0后支持的顶级语句使用问题

    创建C#项目且使用.Net6.0以上的版本时,默认code会使用顶级语句形式: 1.略去static void Main(String[ ] args)主方法入口: 2.隐式使用(即隐藏且根据代码所需 ...