移动端h5中rem适配
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适配的更多相关文章
- 最佳移动端h5自适应rem适配方案
一.利用lib-flexible.postcss-plugin-px2rem插件 进行移动端rem适配. 1.第一 引入lib-flexible . 安装lib-flexible: npm i lib ...
- 移动端H5多终端适配解决方案
推荐三篇文章: 1.来自手淘团队的开源技术flexibal.js github地址:https://github.com/isHelenaChan/flexible 2.来自“大漠”(就职于淘宝,也是 ...
- H5中REM中使用的规则
/*REM单位换算方法 iphone6适配*/ function resizeRoot(){ var Dpr = 1, uAgent = window.navigator.userAgent; var ...
- 移动端设备中1px适配
方式1:伪类+transform实现,主要用transform中的scale缩放,缩放默认中心点是以x,y轴的50%处,因此需要用transform-origin调整中心点 html代码: <d ...
- 移动端h5模拟长按事件
为啥写这篇文章 最近接了个需求,要求长按某个标签显示删除一个悬浮的删除按钮.这个需求其实在app上很常见,但是在移动端h5中,我们没有长按的事件,所以就需要自己模拟这个事件了. 大概效果如下: ps: ...
- H5 端 rem 适配方案与 viewport 适配
H5 端 rem 适配方案与 viewport 适配 rem rem 是 CSS3 新增的一个相对单位(root em,根 em) 只根据当前页面 HTML 页面的 font-size 设置,如果根目 ...
- 基于rem的移动端响应式适配方案(详解) 移动端H5页面的设计稿尺寸大小规范
基于rem的移动端响应式适配方案(详解) : https://www.jb51.net/article/118067.htm 移动端H5页面的设计稿尺寸大小规范 http://www.tuyiyi.c ...
- H5移动端rem适配
/** * 移动端自适应 */ <meta name="viewport" content="width=device-width,user-scalable=no ...
- vue中使用第三方UI库的移动端rem适配方案
需求:使用vue-cli脚手架搭建项目,并且使用第三方的UI库(比如vant,mint ui)的时候,因为第三方库用的都是用px单位,无法使用rem适配不同设备的屏幕. 解决办法:使用px2rem-l ...
- 移动端H5页面高清多屏适配方案
背景 开发移动端H5页面 面对不同分辨率的手机 面对不同屏幕尺寸的手机 视觉稿 在前端开发之前,视觉MM会给我们一个psd文件,称之为视觉稿. 对于移动端开发而言,为了做到页面高清的效果,视觉稿的规范 ...
随机推荐
- SQL Server 自动增长清零的方法
方法一: truncate table TableName 删除表中的所有的数据的同时,将自动增长清零.如果有外键参考这个表,这个方法会报错(即便主键表和外键表都已经没有数据),请参考方法2. 方法二 ...
- 36. 干货系列从零用Rust编写负载均衡及代理,内网穿透中内网代理的实现
wmproxy wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器,四层TCP/UDP转发,七层负载均衡,内网穿透,后续将实现websocket代 ...
- 华企盾DSC邮件服务器测试连接提示Server has closed the connection(端口不对)
解决方法:邮件服务器端口填错了,应该是smtp.126.com:s465,或者smtp.126.com:s587 其他邮箱同理.
- Windows和Linux下通过go实现自删除
自删除在攻防中都挺常见的,自写远控通常也有需要.可是在度娘里搜不到什么办法,于是就查查Windows api学习记录一回. linux 先获得当前程序的文件名,再使用syscall这个包中的Unlin ...
- 字符集(Character Set)和编码(Encoding)的历史演化
字符集(Character Set)和编码(Encoding)是两个相关但不同的概念,它们在计算机和信息技术领域用于处理文本数据. 字符集(Character Set): 字符集是一种定义了一组字符. ...
- 关于开放签CA数字证书设计的思考
这几天在调研CA数字证书以及思考如何在产品中集成使用CA数字证书,主要的目的和方向有以下几点: 有法律效力的电子文件的签署需要使用权威的证书颁发机构(CA)颁发的数字证书: 我们希望找到更便宜的证书方 ...
- C语言之检验三边能否构成三角形
要求: 编写程序检验由三边能否构成三角形,检验方法是任意两边和均要大于第三边. 输出格式:若结果可以构成,输出YES,否则输出ERROR DATA 其实很简单,运用与逻辑运算符&&判断 ...
- 在线编辑Word——插入内容控件
内容控件是可添加和自定义的以在模板.窗体和文档中使用的单个控件.Word中支持添加多种类型的控件用于不同文档的设计需求.本文,将通过在线编辑的方式展示如何在Word中插入内容控件,这里使用的在线编辑器 ...
- 数据库开发实战教程:使用Python连接Kerberos的Presto
[摘要]本文将为大家带来Python连接presto开源的两个实践案例. Python连接presto开源提供了以下两个库可以使用 presto-python-client:https://githu ...
- 摆平各类目标检测识别AI应用,有它就够了!
摘要:在计算机视觉领域,CANN最新开源的通用目标检测与识别样例,通过其强大的可定制.可扩展性,为AI开发者们提供了良好编程选择. 本文分享自华为云社区<摆平各类目标检测识别AI应用,有它就够了 ...