關於rem佈局

我們知道,當使用rem佈局,並配合JS動態按照比例設置HTML標籤上的rem值時,整個頁面是按照屏幕的寬度來整體縮放的。

對於高度不限制的頁面(也就是超出一屏頁面可以滾動),這種方案沒有任何問題,簡單暴力。

但是對於一些需要佈滿一整屏的頁面(比如現在流行的上下/左右滑動的那種),由於一個頁面的元素必須在一個頁面內佈滿,不能超出,那麼問題就來了:

如果你是按照iPhone5的尺寸來做的頁面,尺寸是320*568,那麼當頁面放在寬度較寬,或高度較矮的手機裏(寬高比變大),必定會出現頁面元素在一屏放不下的情況(對於上下絕對定位,中間拉伸的頁面,就會是擠做一堆)。

可以看下面這個例子,這個頁面上面部分是從上往下佈局,下面按鈕採用bottom絕對定位。

頁面是按照標準iphone5尺寸開發的,但是在帶有導航條的iphone4下,高度只有411px,由於iphone4/5都是320px的寬,就會發生頁面擠作一堆的情況。

標準iphone5下 帶瀏覽器導航條的iphone4下

圖1 同一頁面在標準iphone5下與帶導航條的iphone4下

那麼怎麼辦呢?首先我想到的當時是media query。最開始我想當然的使用max-height/min-height來控制樣式,但很快我發現我太單純了...

因爲頁面是整體根據寬度縮放的,不同的寬度下的設備,對應的就是不同的高度比例!在我寫了若干套max-height/min-height,還會冒出各種各樣奇葩分辨率後,我發現這不是辦法。

既然我們的頁面是根據寬度進行等比縮放的,那麼如果能判斷寬高比就好了,一頓查閱文檔,讓我找到了aspect-ratio這個屬性,正是我要的!

下面是MDN上關於aspect-ratio的介紹:

寬高比(aspect-ratio)

值:<ratio>

媒體: visualtactile

是否接受 min/max 前綴:是

描述了輸出設備目標顯示區域的寬高比。該值包含兩個以“/”分隔的正整數。代表了水平像素數(第一個值)與垂直像素數(第二個值)的比例。

Ok,有了它以後,事情就變得簡單了。

先按照正常iphone5尺寸(320px * 568px)進行頁面開發,最後適配時,不需要改變寬度(因爲我們適配的是寬高比,而高度是自動根據寬度縮放的),直接調整高度。

對於上面那個例子,我當時是將頁面劃分爲了幾個高度區域(單位都是px):

  • 568 ~ 510
  • 510 ~ 490
  • 490 ~ 470
  • 470 - 440
  • 440以下

(爲什麼對568以上的尺寸不做調整?因爲我們的頁面是根據寬度縮放的,我們只怕高度小,而不怕高度過大)

然後開始寫media query。下面以568~510區間爲例,看看具體media query : aspect-ratio怎麼寫。

(需要注意的是,aspect-ratio是寬度/高度,而我們關注的是高度,必須要小心高度是分母,對於max-aspect-ratio/min-aspect-ratio不要搞反了,一開始調研的時候我就因爲寫反了,以爲這個屬性不好使...)

@media screen and (max-aspect-ratio: 320/510) and (min-aspect-ratio: 320/568), screen and (-webkit-max-aspect-ratio: 320/510) and (-webkit-min-aspect-ratio: 320/568) {
    // 這裏面的樣式僅會對320/510 ~ 320/568寬高比之間的設備生效
}

匹配到樣式區間了,那麼如何適配?這個嘛,就隨意了,只要調整到在這個高度範圍內顯示正常,那就ok了。

比較簡單暴力的,就是直接對主要頁面區域施加 transform: scale(0.8) 這類樣式,直接縮小。

至於怎麼劃分區間,這個要根據具體的頁面佈局情況、或者具體你們需要適配的幾大機型的寬高比範圍來決定,這裏並沒有一個統一的規定。

總結

rem是個好東西,關於怎麼使用它最愉快,我也還在探索中。在這裏配合aspect-ratio使用,對於簡單的需要鋪滿整屏的移動端頁面,個人目前覺得這是成本最低、最省事、也是最暴力、最徹底的一種方案。

關於rem以及media query: aspect-ratio的兼容性,個人測試是兼容安卓2.3+(加上-webkit-aspect-ratio前綴爲了保險起見),並且已經過生產環境上的線上項目校驗,兼容性可靠。

關於上面的例子,項目還在線上,有興趣的同學可以點開看看(Chrome手機模擬或者直接用手機開打哦~)線上鏈接,並且試着改變不同的寬度、高度來查看效果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章