移動端適配之rem.js
阿新 • • 發佈:2018-12-23
移動端網頁適配是一個麻煩事, 常見做法有媒體查詢, js控制等.
媒體查詢個人感覺比較冗餘, 可少量使用, 偏愛於js來控制.
下面是我自己總結的rem.js:
(function(doc, win) {
// html元素字型
// 這裡基礎字型設定為10在uc, WX上沒效果, 不知道為什麼
// 設定為10時, dpr=1的手機, 寬度360, 計算出來html的字型大小為5px, 可能是字型太小了
// 儘量設定大一些, 這樣避免12px字型大小的限制
var _rootFontSize = window._rootFontSize || 25;
// 預設不支援縮放
var _remMetaScalable = typeof window._remMetaScalable === 'undefined'
? false
: !!window._remMetaScalable;
var docEl = doc.documentElement,
isIOS = navigator.userAgent.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/),
// 只針對IOS裝置
dpr = isIOS ? Math.min(win.devicePixelRatio, 3) : 1,
// 計算縮放比
scale = 1 / dpr,
// 檢測支援的"縮放"事件
resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize';
docEl.dataset.dpr = dpr;
// 被iframe引用時,禁止縮放
dpr = window.top === window.self ? dpr : 1;
var metaEl = doc.createElement('meta');
metaEl.name = 'viewport';
var metaElContent = 'width=device-width, ' ;
// 支援縮放
if (_remMetaScalable) {
metaElContent += 'initial-scale=' + scale;
} else {
metaElContent += (
'initial-scale=' + scale
+ ',maximum-scale=' + scale
+ ', minimum-scale=' + scale
+ ', user-scalable=no');
}
metaEl.content = metaElContent;
docEl.firstElementChild.appendChild(metaEl);
// 縮放/旋轉裝置檢測函式
var recalc = function() {
var width = docEl.clientWidth;
// 750為設計用的寬度, 比如它以iphone6標準(寬750)
// 此時, 按照設計稿的尺寸寫就可以了
// 如: 設計稿為100px, 那麼就寫4rem(100 / 25), 25是自己設定的
// 也可以設定成100, 這樣就寫100px就寫1rem
docEl.style.fontSize = _rootFontSize * (width / 750) + 'px';
};
recalc();
if (!doc.addEventListener) return;
win.addEventListener(resizeEvt, recalc, false);
})(document, window);
使用示例:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="viewport"
content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no">
<title>rem</title>
<style type="text/css">
.c1 {
border: 2px solid black;
font-size: 32px;
}
.c2 {
border: 2px solid black;
font-size: 1.28rem;
}
.c3 {
border: 1px solid black;
font-size: 1.28rem;
}
</style>
<script type="text/javascript" src="rem.js"></script>
</head>
<body>
<pre class="c1">
.c1 {
border: 2px solid black;
font-size: 32px;
}
</pre>
<pre class="c2">
.c2 {
border: 2px solid black;
font-size: 1.28rem;
}
</pre>
<pre class="c3">
.c3 {
border: 1px solid black;
font-size: 1.28rem;
}
</pre>
</body>
</html>
實際效果:
可以看出:
在DPR為1時, 其實用什麼都可以的, 也就是我們正常在pc頁面上的寫法.
在DPR為2時:
- 不使用rem.js, 實際顯示效果就會是我們寫的2倍.
這也就是為什麼我們寫的1px的邊框在iPhone手機上常常看起來比較粗的原因. - 使用rem.js, 效果才是我們預期的.
附: 谷歌瀏覽器如何新增自定義模擬裝置
總結:
使用這裡的rem.js後, 可以不用媒體查詢,
方便全域性控制, 而且還可以解決iPhone下"1px邊框的問題".
如果再結合postcss-pxtorem, sublime cssrem等外掛的協助,
就可以像pc上一樣以px作為單位來書寫, 非常方便.
歡迎補充指正!