PageSourceSearch

https://yangheglobal.com/themes/zh-cn/js/plugins/adaptive.js

js yangheglobal.com collected 2026-10-04 13:24:20 UTC 6,341 bytes, 153 lines download raw bytes

1var adaptive = {};
2(function (win, lib) {
3    var doc = win.document;
4    var docEl = doc.documentElement;
5    // 设备像素比
6    var devicePixelRatio = win.devicePixelRatio;
7    // 我们设置的布局视口与理想视口的像素比
8    var dpr = 1; 
9    // viewport缩放值
10    var scale = 1; 
11    // 设置viewport
12    function setViewport() {
13        // 判断IOS
14        var isIPhone = /iphone/gi.test(win.navigator.appVersion);
15        if (lib.scaleType === 2 && isIPhone || lib.scaleType === 3) {
16            dpr = devicePixelRatio;
17        }
18        // window对象上增加一个属性,提供对外的布局视口与理想视口的值
19        win.devicePixelRatioValue = dpr;
20        // viewport缩放值,布局视口缩放后刚好显示成理想视口的宽度,页面就不会过长或过短了
21        scale = 1 / dpr;
22        // 获取已有的viewport
23        var hasMetaEl = doc.querySelector('meta[name="viewport"]');
24        var metaStr = 'initial-scale=' + scale + ', maximum-scale=' + scale + ', minimum-scale=' + scale + ', user-scalable=no';
25        if (dpr === 1) {
26            metaStr = 'width=device-width, '.concat(metaStr);
27        }
28        if (!isIPhone && dpr !== 1) {
29            metaStr = metaStr.concat(', target-densitydpi=device-dpi');
30        }
31        // 如果有,改变之
32        if (hasMetaEl) {
33            hasMetaEl.setAttribute('content', metaStr);
34        }
35        // 如果没有,添加之
36        else {
37            var metaEl = doc.createElement('meta');
38            metaEl.setAttribute('name', 'viewport');
39            metaEl.setAttribute('content', metaStr);
40            
41            if (docEl.firstElementChild) {
42                docEl.firstElementChild.appendChild(metaEl);
43            }
44            else {
45                var containDiv = doc.createElement('div');
46                containDiv.appendChild(metaEl);
47                docEl.appendChild(containDiv);
48            }
49        }
50    }
51    
52    var newBase = 100;
53    lib.errDpr = 1;
54
55    function setRem() {
56        // 布局视口
57        // var layoutView = docEl.clientWidth; 也可以 获取布局视口的宽度
58        var _clientWidth = docEl.clientWidth;
59        var layoutView;
60        if (lib.maxWidth && _clientWidth>lib.maxWidth) {
61            layoutView = Math.min(docEl.getBoundingClientRect().width, lib.maxWidth * dpr);
62        }else if (lib.minWidth && _clientWidth<lib.minWidth) {
63            layoutView = Math.max(docEl.getBoundingClientRect().width, lib.minWidth * dpr);
64        }
65        else {
66            layoutView = docEl.getBoundingClientRect().width;
67        }
68        // 为了计算方便,我们规定 1rem === 100px设计图像素,我们切图的时候就能快速转换
69        // 有人问,为什么不让1rem === 1px设计像素呢?
70        // 设计图一般是640或者750px
71        // 布局视口一般是320到1440
72        // 计算一个值,使layout的总宽度为 (desinWidth/100) rem
73        // 那么有计算公式:layoutView / newBase = desinWidth / 100
74        // newBase = 100 * layoutView / desinWidth
75        // newBase = 介于50到200之间
76        // 如果 1rem === 1px 设计像素,newBase就介于0.5到2之间,由于很多浏览器有最小12px限制,这个时候就不能自适应了
77        newBase = 100 * layoutView / lib.desinWidth * (lib.errDpr || 1);
78        docEl.style.fontSize = newBase + 'px';
79        // rem基准值改变后,手动reflow一下,避免旋转手机后页面自适应问题
80        doc.body&&(doc.body.style.fontSize = lib.baseFont / 100 + 'rem');
81        // 重新设置rem后的回调方法
82        lib.setRemCallback&&lib.setRemCallback();
83        lib.newBase = newBase;
84    }
85    var tid;
86    lib.desinWidth = 750;
87    lib.baseFont = 28;
88    // 局部刷新的时候部分chrome版本字体过大的问题
89    lib.reflow = function() {
90        docEl.clientWidth;
91    };
92    // 检查安卓下rem值是否显示正确
93    function checkRem() {
94        if (/android/ig.test(win.navigator.appVersion)) {
95            var hideDiv = document.createElement('p');
96            hideDiv.style.height = '1px';
97            hideDiv.style.width = '2.5rem';
98            hideDiv.style.visibility = 'hidden';
99            document.body.appendChild(hideDiv);
100            var now = hideDiv.offsetWidth;
101            var right = lib.newBase * 2.5; 
102            if (Math.abs(right / now - 1) > 0.05) {
103                lib.errDpr = right / now;
104                setRem();
105            }
106            document.body.removeChild(hideDiv);
107        }
108    }
109    lib.init = function () {
110        // resize的时候重新设置rem基准值
111        // 触发orientationchange 事件时也会触发resize,故不需要再添加此事件了
112        win.addEventListener('resize', function () {
113            clearTimeout(tid);
114            tid = setTimeout(setRem, 300);
115        }, false);
116        // 浏览器缓存中读取时也需要重新设置rem基准值
117        win.addEventListener('pageshow', function (e) {
118            if (e.persisted) {
119                clearTimeout(tid);
120                tid = setTimeout(setRem, 300);
121            }
122        }, false);
123        // 设置body上的字体大小
124        if (doc.readyState === 'complete') {
125            doc.body.style.fontSize = lib.baseFont / 100 + 'rem';
126            checkRem();
127        }
128        else {
129            doc.addEventListener('DOMContentLoaded', function (e) {
130                doc.body.style.fontSize = lib.baseFont / 100 + 'rem';
131                checkRem();
132            }, false);
133        }
134        setViewport();
135        // 设置rem值
136        setRem();
137        // html节点设置布局视口与理想视口的像素比
138        docEl.setAttribute('data-dpr', dpr);
139    };
140    // 有些html元素只能以px为单位,所以需要提供一个接口,把rem单位换算成px
141    lib.remToPx = function (remValue) {
142        return remValue * newBase;
143    };
144})(window, adaptive);
145if (typeof module != 'undefined' && module.exports) {
146    module.exports = adaptive;
147} else if (typeof define == 'function' && define.amd) {
148    define(function() {
149        return adaptive;
150    });
151} else {
152    window.adaptive = adaptive;
153}

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.