Created
February 22, 2018 08:28
-
-
Save roshanca/3f87393c10c35202877d1c79f2325e8a to your computer and use it in GitHub Desktop.
移动端根据屏幕尺寸计算 rem
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
;(function(win, lib) { | |
var doc = win.document; | |
var docEl = doc.documentElement; | |
var metaEl = doc.querySelector('meta[name="viewport"]'); | |
var flexibleEl = doc.querySelector('meta[name="flexible"]'); | |
var dpr = 0; | |
var scale = 0; | |
var tid; | |
var flexible = lib.flexible || (lib.flexible = {}); | |
if (metaEl) { | |
console.warn('将根据已有的meta标签来设置缩放比例'); | |
var match = metaEl.getAttribute('content').match(/initial\-scale=([\d\.]+)/); | |
if (match) { | |
scale = parseFloat(match[1]); | |
dpr = parseInt(1 / scale); | |
} | |
} else if (flexibleEl) { | |
var content = flexibleEl.getAttribute('content'); | |
if (content) { | |
var initialDpr = content.match(/initial\-dpr=([\d\.]+)/); | |
var maximumDpr = content.match(/maximum\-dpr=([\d\.]+)/); | |
if (initialDpr) { | |
dpr = parseFloat(initialDpr[1]); | |
scale = parseFloat((1 / dpr).toFixed(2)); | |
} | |
if (maximumDpr) { | |
dpr = parseFloat(maximumDpr[1]); | |
scale = parseFloat((1 / dpr).toFixed(2)); | |
} | |
} | |
} | |
if (!dpr && !scale) { | |
var isAndroid = win.navigator.appVersion.match(/android/gi); | |
var isIPhone = win.navigator.appVersion.match(/iphone/gi); | |
var devicePixelRatio = win.devicePixelRatio; | |
if (isIPhone) { | |
// iOS下,对于2和3的屏,用2倍的方案,其余的用1倍方案 | |
if (devicePixelRatio >= 3 && (!dpr || dpr >= 3)) { | |
dpr = 3; | |
} else if (devicePixelRatio >= 2 && (!dpr || dpr >= 2)){ | |
dpr = 2; | |
} else { | |
dpr = 1; | |
} | |
} else { | |
// 其他设备下,仍旧使用1倍的方案 | |
dpr = 1; | |
} | |
scale = 1 / dpr; | |
} | |
docEl.setAttribute('data-dpr', dpr); | |
if (!metaEl) { | |
metaEl = doc.createElement('meta'); | |
metaEl.setAttribute('name', 'viewport'); | |
metaEl.setAttribute('content', 'initial-scale=' + scale + ', maximum-scale=' + scale + ', minimum-scale=' + scale + ', user-scalable=no'); | |
if (docEl.firstElementChild) { | |
docEl.firstElementChild.appendChild(metaEl); | |
} else { | |
var wrap = doc.createElement('div'); | |
wrap.appendChild(metaEl); | |
doc.write(wrap.innerHTML); | |
} | |
} | |
function refreshRem(){ | |
var width = docEl.getBoundingClientRect().width; | |
if (width / dpr > 540) { | |
width = 540 * dpr; | |
} | |
var rem = width / 7.5; | |
docEl.style.fontSize = rem + 'px'; | |
flexible.rem = win.rem = rem; | |
} | |
win.addEventListener('resize', function() { | |
clearTimeout(tid); | |
tid = setTimeout(refreshRem, 300); | |
}, false); | |
win.addEventListener('pageshow', function(e) { | |
if (e.persisted) { | |
clearTimeout(tid); | |
tid = setTimeout(refreshRem, 300); | |
} | |
}, false); | |
// 以将这块写在基础样式里 | |
// if (doc.readyState === 'complete') { | |
// doc.body.style.fontSize = 12 * dpr + 'px'; | |
// } else { | |
// doc.addEventListener('DOMContentLoaded', function(e) { | |
// doc.body.style.fontSize = 12 * dpr + 'px'; | |
// }, false); | |
// } | |
refreshRem(); | |
flexible.dpr = win.dpr = dpr; | |
flexible.refreshRem = refreshRem; | |
flexible.rem2px = function(d) { | |
var val = parseFloat(d) * this.rem; | |
if (typeof d === 'string' && d.match(/rem$/)) { | |
val += 'px'; | |
} | |
return val; | |
} | |
flexible.px2rem = function(d) { | |
var val = parseFloat(d) / this.rem; | |
if (typeof d === 'string' && d.match(/px$/)) { | |
val += 'rem'; | |
} | |
return val; | |
} | |
})(window, window['lib'] || (window['lib'] = {})); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment