移动端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文件,称之为视觉稿. 对于移动端开发而言,为了做到页面高清的效果,视觉稿的规范 ...
随机推荐
- 【布局技巧】Flex 布局下居中溢出滚动截断问题
在页面布局中,我们经常会遇到/使用这么一类常见的布局,也就是列表内容水平居中于容器中,像是这样: <ul class="g-contaner"> <li>& ...
- Pattern类和Matcher类的使用
1.先看好数据源 先将一个String对象确定为程序要对其进行操作的数据源. String b="hello,good morning"; 2.建立Pattern类的对象 Stri ...
- 解决k8s删除pod后又重新创建了新的pod
1.问题现象 2.原因 在Kubernetes中,当你删除一个Pod时,如果该Pod是由Deployment.ReplicaSet或PodController创建的,那么这个Pod会被标记为" ...
- 2023-12-23:用go语言,一支n个士兵的军队正在趁夜色逃亡,途中遇到一条湍急的大河 敌军在T的时长后到达河面,没到过对岸的士兵都会被消灭 现在军队只找到了1只小船,这船最多能同时坐上2个士兵。
2023-12-23:用go语言,一支n个士兵的军队正在趁夜色逃亡,途中遇到一条湍急的大河 敌军在T的时长后到达河面,没到过对岸的士兵都会被消灭 现在军队只找到了1只小船,这船最多能同时坐上2个士兵. ...
- .Net中的AutoScrollPosition问题 (panel 滚动条的位置设定)
本文转自:http://www.cnblogs.com/h2appy/archive/2008/04/23/1167400.html 有Panel类型的窗体panel1,其AutoScroll设为了T ...
- 【源码系列#05】Vue3响应式原理(Ref)
Ref & ShallowRef ref:接受一个参数值并返回一个响应式且可改变的 ref 对象.ref 对象拥有一个指向内部值的单一属性 .value 可以将 ref 看成 reactive ...
- 打造 VSCode 高效 C++ 开发环境的必备插件
工欲善其事,必先利其器 C++ clangd:代码补全.跳转.clang-tidy 检查,自带 clang-format CodeLLDB:LLVM 的调试器(类比 GDB) CMake CMake ...
- Guava常用工具类总结
=== -"我想写得更优雅,可是没人告诉我怎么写得更优雅" -"Null的含糊语义让人很不舒服.Null很少可以明确地表示某种语义,例如,Map.get(key)返回Nu ...
- Visual Studio使用Web Deploy发布.NET Web应用到指定服务器的IIS中
前言 今天要讲的是在Window 2008 R2版本的服务器下如何配置Web Deploy,和Visual Studio使用Web Deploy发布.NET Web应用到指定服务器的IIS中. 因为历 ...
- 去哪儿网 (Qunar) DevOps 实践分享
这是 2017 年王晓翔在 msup 全球软件案例研究峰会上的分享,重点分享了提高工程效率过程中存在的问题.取得的成果和要做的事情.内容详实,具有可操作性.我有幸看到了,所以在征得晓翔的同意下重新截图 ...