1. 程式人生 > >移動端適配之rem.js

移動端適配之rem.js

移動端網頁適配是一個麻煩事, 常見做法有媒體查詢, 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>

實際效果:
rem.js測試效果

可以看出:

在DPR為1時, 其實用什麼都可以的, 也就是我們正常在pc頁面上的寫法.
在DPR為2時:

  1. 不使用rem.js, 實際顯示效果就會是我們寫的2倍.
    這也就是為什麼我們寫的1px的邊框在iPhone手機上常常看起來比較粗的原因.
  2. 使用rem.js, 效果才是我們預期的.

: 谷歌瀏覽器如何新增自定義模擬裝置
谷歌瀏覽器如何新增自定義模擬裝置

總結:
使用這裡的rem.js後, 可以不用媒體查詢,
方便全域性控制, 而且還可以解決iPhone下"1px邊框的問題".
如果再結合postcss-pxtorem, sublime cssrem等外掛的協助,
就可以像pc上一樣以px作為單位來書寫, 非常方便.

歡迎補充指正!