1. 程式人生 > >【web】強大的螢幕適配佈局rem響應式 實現一套web程式碼多端自適應適配

【web】強大的螢幕適配佈局rem響應式 實現一套web程式碼多端自適應適配

強大的螢幕適配佈局rem響應式 實現一套web程式碼多端自適應適配

實現強大的螢幕適配佈局

   流式的佈局、固定的寬度,還有響應式來做,但是這些方案都不是最佳的解決方法。->->rem

rem是什麼?

  rem(font size of the root element)是指相對於根元素的字型大小的單位。簡單的說它就是一個相對單位。看到rem大家一定會想起em單位,em(font size of the element)是指相對於父元素的字型大小的單位。它們之間其實很相似,只不過一個計算的規則是依賴根元素一個是依賴父元素計算。


--動態計算方案: 通過網頁的縮放動態更改網頁DOM的fontSize值
// 動態計算螢幕的寬度,從而得到網頁的fontSize大小
(function (doc, win) {
    var docEl = doc.documentElement,
resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',
recalc = function () {
            var clientWidth = docEl.clientWidth;
if (!clientWidth) return;
docEl.style.fontSize = 10 * (clientWidth / 
320) + 'px'; }; if (!doc.addEventListener) return; win.addEventListener(resizeEvt, recalc, false); doc.addEventListener('DOMContentLoaded', recalc, false); })(document, window);
--原理:根據網頁的尺寸更改,計算出相對的字型大小 那麼問題來了,假如使用者用PC端打開了移動端的網頁,那字型豈不是牛逼牛逼大咧@@。 換句話說,不限最大的寬度,那螢幕寬1920px時,字型不是很大了? 所以修改bug:
// 動態計算螢幕的寬度,從而得到網頁的fontSize大小
(function (doc, win) { var docEl = doc.documentElement, resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize', recalc = function () { var clientWidth = docEl.clientWidth; if (!clientWidth) return; if(clientWidth>750) clientWidth=750;//這裡限制最大的寬度尺寸,從而實現PC端的兩邊留白等docEl.style.fontSize = 10 * (clientWidth / 320) + 'px'; }; if (!doc.addEventListener) return; win.addEventListener(resizeEvt, recalc, false); doc.addEventListener('DOMContentLoaded', recalc, false); })(document, window);

執行效果:執行到 ipad下的動態更改
執行前提:
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> 
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">   

meta原理:
1.如果支援Google Chrome Frame:GCF,則使用GCF渲染;
如果系統安裝ie8或以上版本,則使用最高版本ie渲染;
否則,這個設定可以忽略  至於你講的新版chrome,本身就是在Chrome中,當然網頁以Chrome的方式來渲染。
2.width - viewport的寬度 height - viewport的高度
initial-scale - 初始的縮放比例
minimum-scale - 允許使用者縮放到的最小比例
maximum-scale - 允許使用者縮放到的最大比例
user-scalable - 使用者是否可以手動縮放

接下來就是呼叫了     那麼問題來了,如何計算出網頁中元素的rem值? 我們知道  rem x fontsize = 網頁中的實際畫素; 那麼我們可以知道 rem 等於 網頁中的畫素 / fontsize.
所以,假如你的層div的寬度100px,那麼他的rem 等於多少? UI中常見的以ios端的尺寸進行,那麼我們可以參考ios端的螢幕尺寸和解析度進行適配
>>尺寸及解析度<<    
iPhone介面尺寸:320*480640*960640*1136(單位都是畫素:px)
當然在設計當中我們並不需要每一種尺寸都做一套圖,建議取用640*960的尺寸設計。
所以當我們方案中的clientWidth = 640 fontSize自然等於20,於是我們可以得到 100px /20 = 5.0 rem  所以我們可以這麼寫 div{ width:5.0rem; } 從而將px完全代替為rem

rem的相容性:

 

 可以看出相容性還是ok!

於是就有了淘寶的改版了! 手機淘寶web頁面就是rem 筆者被有人私信問到,假如單純用css進行rem控制,那麼如何做到? 那麼等先統計有哪些主流的螢幕裝置 然後通過媒體元素進行適配: (不過建議用js動態控制)
譬如
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;
}
}