原本想寫一篇,webapp使用Rem的問題,查了一下相關rem的介紹以後,發現不少平臺已經解釋的很清楚了,圖文並茂,因而我便想將其解釋資源整理一些,方便之後本身查閱。javascript
騰訊ISUX:web app變革之rem(解釋的最精闢了)css
大漠博客:CSS3的REM設置字體大小 html
小黑成長錄:關於webapp中的文字單位的一些搗騰前端
前端觀察站:px em rem在WEB前端開發中的區別java
這裏面須要注意的一點就是,ren是根據根元素的字體大小來肯定的:android
咱們可能常常設置html{font-size:20px}或者font-size:16px,這些其實都沒有錯,可是可能咱們有更好的設置方法:css3
html{font-size:62.5%;} /* font-size 62.5% = 10px =1rem */ body{font-size:100%;} /* font-size 100% = 10px = 1rem */ .rem-1{font-size:1.2rem;} .rem-2{font-size:1.4rem;} .rem-3{font-size:1.6rem;}
經過設置html的font-size:62.5%,咱們就能夠很方便的計算出px所對應的rem值,簡單粗暴。web
經常使用的調節rem的視口尺寸:chrome
html { font-size : 20px; } @media only screen and (min-width: 401px){ html { font-size: 25px !important; } } @media only screen and (min-width: 428px){ html { font-size: 26.75px !important; } } @media only screen and (min-width: 481px){ html { font-size: 30px !important; } } @media only screen and (min-width: 569px){ html { font-size: 35px !important; } } @media only screen and (min-width: 641px){ html { font-size: 40px !important; } }
最後分享一段淘寶手機屏幕尺寸判斷改變字體大小的js(淘寶首頁好像如今沒有用rem了仍是採用定寬px):瀏覽器
!function(x) { //x 爲window function w() { //document.documentElement.getBoundingClientRect().width; var a = r.getBoundingClientRect().width; //先計算 a / v>540而後 && (a =540*v) a / v > 540 && (a = 540 * v), x.rem = a / 16, r.style.fontSize = x.rem + "px" } //s = window.document ,r = document.documentElement,q = document.querySelector('meta[name = "viewport"]'),p = document.querySelector("meta[name = 'flexible']") var v, u, t, s = x.document, r = s.documentElement, q = s.querySelector('meta[name="viewport"]'), p = s.querySelector('meta[name="flexible"]'); if (q) { console.warn("將根據已有的meta標籤來設置縮放比例"); var o = q.getAttribute("content").match(/initial\-scale=(["']?)([\d\.]+)\1?/); o && (u = parseFloat(o[2]), v = parseInt(1 / u)) } else { if (p) { var o = p.getAttribute("content").match(/initial\-dpr=(["']?)([\d\.]+)\1?/); //v是meta[name = "viewport"] dpi值大小 o && (v = parseFloat(o[2]), u = parseFloat((1 / v).toFixed(2))) } } if (!v && !u) { var n = (x.navigator.appVersion.match(/android/gi), x.navigator.appVersion.match(/iphone/gi)), v = x.devicePixelRatio; v = n ? v >= 3 ? 3 : v >= 2 ? 2 : 1 : 1, u = 1 / v } if (r.setAttribute("data-dpr", v), !q) { if (q = s.createElement("meta"), q.setAttribute("name", "viewport"), q.setAttribute("content", "initial-scale=" + u + ", maximum-scale=" + u + ", minimum-scale=" + u + ", user-scalable=no"), r.firstElementChild) { r.firstElementChild.appendChild(q) } else { var m = s.createElement("div"); m.appendChild(q), s.write(m.innerHTML) } } x.dpr = v, x.addEventListener("resize", function() { clearTimeout(t), t = setTimeout(w, 300) }, !1), x.addEventListener("pageshow", function(b) { b.persisted && (clearTimeout(t), t = setTimeout(w, 300)) }, !1), "complete" === s.readyState ? s.body.style.fontSize = 12 * v + "px" : s.addEventListener("DOMContentLoaded", function() { s.body.style.fontSize = 12 * v + "px" }, !1), w() }(window);
(function () { var b = document.documentElement, a = function () { var a = b.getBoundingClientRect().width; //b.style.fontSize = 20 * (640 <= a ? 640 : a)/320 + "px" 這裏設置的爲根元素節點大小爲20px,必須與樣式裏面的根節點樣式大小一致,貌似不能經過document.documentElement.style.fontSize獲取根節點元素字體大小隻能手寫,根元素大小*視口比例 b.style.fontSize = .0625 * (640 <= a ? 640 : a) + "px" }, c = null; window.addEventListener("resize", function () { clearTimeout(c); c = setTimeout(a, 300) }); a() })();
根元素大小設置爲多少,子元素的rem單位跟着一塊兒變化擴大。咱們這樣設置:
html {font-size: 62.5%;/*10 ÷ 16 × 100% = 62.5%*/} body {font-size: 1.4rem;/*1.4 × 10px = 14px */} h1 { font-size: 2.4rem;/*2.4 × 10px = 24px*/}
達到的目的只是方便咱們去計算,等同於如今html 的fontsize:10px; 可是元素h1大小爲20px 那麼咱們就能夠把h1設置爲2rem
最後我還想談一下,關於h5佈局活動頁面的問題:
先來兩張圖作對比吧:
chrome控制檯 iphone4s
看到這兩張圖,可能咱們不由要問,問什麼320*480下正常,到了微信上面爲何不正常了,主要是由於微信底部有個頂部條致使的高度爲65px(320下),爲了解決這個問題,咱們可能就要經過視口@media query去媒介調整,但每次未免也太麻煩了。
爲了解決這個問題,咱們分析一下,一般設計師給個人設計稿可能有兩種大小一種640*960 ,640*1136,若是說設計師在設計稿下大部分都填充了,那確定會出現擁擠。其實咱們應該這樣作將佈局分層三部分,頂部,中部,底部,讓三者內容挨近保證能在帶有微信底部條的960px下面不溢出,那麼這樣,咱們就會少出現這些狀況了。
可是咱們即便基於如上我說的設計稿要求去作也會遇到問題,那就是咱們作出來的在320*480下是展示正常的,可是在微信下頂部bar+電量高度爲64px,則實際變成了320*416的尺寸,因此一般來講要進行縮放,咱們能夠單獨基於iphone4s來作一個處理:
/* 兼容iphone4/4s */ @media (device-height:480px) and (-webkit-min-device-pixel-ratio:2){ .page1inner{padding-top: 5rem;} .page2inner{padding-top: 4%;} .img-zhong{margin-bottom: 0} .page3inner{padding-top: 10%;} .img-jj{margin-bottom: 5%} .img-shu{width: 66%; margin-bottom: 6%} .page5inner{padding-top: 0;} .page6inner{ padding-top: 1rem;} .img-hua{width: 35%; margin-bottom: 0} .page8inner{padding-top: .5rem} .page8-title{ margin-bottom: 1rem;} .page7-text{top: 10%} }
用zoom增強,對元素進行縮放
<script type="text/javascript"> !function(){ var cw=document.documentElement.clientWidth||document.body.clientWidth,zoom=cw/320; var ch= document.documentElement.clientHeight || document.body.clientHeight; zoom = Math.min(cw/320,ch/500); document.write('\ <style id="htmlzoom">\ html{font-size:'+(zoom*20)+'px;}\ .svn_wrp{zoom:'+(zoom/2)+';}\ </style>\ '); }(); </script>
另外兩種經過縮放解決多屏下,元素尺寸縮放問題:
經過zoom解決的縮放問題:
<script> (function () { var b = document.documentElement, a = function () { var a = b.getBoundingClientRect().width; //b.style.fontSize = 20 * (640 <= a ? 640 : a)/320 + "px" 這裏設置的爲根元素節點大小爲20px,必須與樣式裏面的根節點樣式大小一致,貌似不能經過document.documentElement.style.fontSize獲取根節點元素字體大小隻能手寫,根元素大小*視口比例 // b.style.fontSize = .0625 * (640 <= a ? 640 : a) + "px" b.style.cssText="-webkit-transform: translate3d(0px, 0px, 0px);zoom:"+(640 <= a ? 640 : a)/320; }, c = null; window.addEventListener("resize", function () { clearTimeout(c); c = setTimeout(a, 300) }); a() })(); </script>
基於transform中scale進行縮放
<script> (function () { var b = document.documentElement, a = function () { var a = b.getBoundingClientRect().width; //b.style.fontSize = 20 * (640 <= a ? 640 : a)/320 + "px" 這裏設置的爲根元素節點大小爲20px,必須與樣式裏面的根節點樣式大小一致,貌似不能經過document.documentElement.style.fontSize獲取根節點元素字體大小隻能手寫,根元素大小*視口比例 // b.style.fontSize = .0625 * (640 <= a ? 640 : a) + "px" var p = (640 <= a ? 640 : a)/320; b.style.webkitTransform = "scale(" + p + ")"; }, c = null; window.addEventListener("resize", function () { clearTimeout(c); c = setTimeout(a, 300) }); a() })(); </script>
這裏這兩種縮放必定要注意一個問題,就是html,body,容器都是width:100%,height:100%
//判斷瀏覽器支持那個,而後加前綴 prefix=function(){ var style=document.body.style,vendor=["t","webkitT","mozT","oT","msT"],i=vendor.length; while(i--) { if(typeof style[vendor[i]+"ransition"]!="undefined") return vendor[i]; } return vendor[0]; }();