1. 程式人生 > 實用技巧 >移動web開發之rem適配佈局

移動web開發之rem適配佈局

移動web開發之rem適配佈局

方案:

  1. 頁面佈局文字能否隨著螢幕大小變化而變化

  2. 流式佈局和flex佈局主要針對於寬度佈局,那高度如何佈局?

  3. 怎樣讓螢幕發生變化的時候元素高度和寬度等比例縮放?

1. rem基礎

rem單位

rem(root em)是一個相對單位,類似於em,em是父元素字型大小。

不同的是rem的基準是相對於html元素的字型大小。

比如,根元素(html)設定font-size=12px;非根元素設定width:2rem;則換成px表示就是24px.

<body>
<div>
<p></p>
</div>
</body>
 <style>
html {
font-size: 14px;
}

div {
/* font-size: 12px; */
width: 10rem;
height: 10rem;
background-color: blueviolet;

}
p {
/* 1.em相對於父元素 的字型大小來說的 */
/* width: 10em;
height: 10em; */
/* 2.rem相對於html元素的字型大小來說的 */
width: 10rem;
height: 10rem;
background-color: aqua;
/* 3.rem的優點就是可以通過修改html裡面的文字大小來改變頁面中元素的大小 可以整體控制 */

}
</style>

2.媒體查詢

2.1什麼是媒體查詢

媒體查詢(Media Query)是css3新語法。

  • 使用@media查詢,可以針對不同的媒體型別定義不同的樣式

  • @media可以針對不同的螢幕尺寸設定不同的樣式

  • 當你重置瀏覽器大小的過程中,頁面也會根據瀏覽器的寬度和高度重新渲染頁面

  • 目前針對很多蘋果手機、android手機、平板等裝置都用得到多媒體查詢

2.2語法規範

<style>
/* 這句話的意思是:在我們螢幕上 並且 最大的寬度是 800畫素 設定我們想要的樣式 */
@media screen and (max-width: 800px) {
body {
/* 當max-width 小於等於800畫素時螢幕顯示pink色*/
background-color: pink;
}
}
/* 媒體查詢可以根據不同的螢幕尺寸在改變不同的樣式 */
@media screen and (max-width: 500px) {
body {
background-color: red;
}
}
</style>
  • 用@media開頭 注意@符號

  • mediatype媒體型別

  • 關鍵字 and not only

  • media feature 媒體特性 必須有小括號包含

1.mediatype查詢型別

將不同的終端裝置劃分成不同的型別,稱為媒體型別

解釋說明
all 用於所有裝置
print 用於印表機和列印預覽
screen 用於電腦螢幕、平板電腦、智慧手機

2.關鍵字

關鍵字將媒體型別或多個媒體特性連線到一起做為媒體查詢的條件。

  • and:可以將多個媒體特性連線到一起,相當於“且”的意思。

  • not:排除某個媒體型別,相當於“非”的意思,可以省略。

  • only:指定某個特定的媒體型別,可以省略

3.媒體特性

每種媒體型別都是具有各自不同的特性,根據不同媒體型別的媒體特性設定不同的展示風格。我們暫且瞭解三個。

注意他們要加小括號包含

解釋說明
width 定義輸出裝置中頁面可見區域的寬度
min-width 定義輸出裝置中頁面最小可見區域寬度
max-width 定義輸出裝置中頁面最大可見區域寬度

2.3媒體查詢+rem實現元素動態大小變化

  • rem單位是跟著html來走的,有了rem頁面元素可以設定不同大小尺寸

  • 媒體查詢可以根據不同裝置寬度來修改樣式

  • 媒體查詢+rem就可以實現不同裝置寬度,實現頁面元素大小的動態變化

案例:

<style>
* {
margin: 0;
padding: 0;
}

@media screen and (min-width: 320px) {
html {
font-size: 50px;
}
}

@media screen and (min-width: 640px) {
html {
font-size: 100px;
}
}

.top {
height: 1rem;
line-height: 1rem;
font-size: .5rem;
background-color: green;
color: #ffffff;
text-align: center;
}
</style>
<body>
<div class="top">購物車</div>
</body>

2.4引入資源(瞭解)

當樣式比較繁多的時候,我們可以針對不同的媒體使用不同的stylesheets(樣式表)

原理,就是直接在link中判斷裝置的尺寸,然後引用不同的css檔案。

1.語法規範

<link rel="stylesheet" media="mediatype and|not|only (media feature)" href="mystylesheet.css">

案例

分析:

  • 當我們螢幕大於等於640px以上的,我們讓div一行顯示兩個

  • 當我們螢幕小於640px以上的,我們讓div一行顯示一個

  • 建議:我們媒體查詢最好的方法是從小到大

  • 引入資源就是針對不同的螢幕尺寸呼叫不同的css檔案

<head>
<link rel="stylesheet" href="style320.css" media="screen and (min-width:320px)">
<link rel="stylesheet" href="style640.css" media="screen and (min-width:640px)">
</head>
<body>
<div>1</div>
<div>2</div>
</body>
/* style640.css */

div {
float: left;
width: 50%;
height: 100px;
}
div:nth-child(1){
background-color: pink;
}
div:nth-child(2){
background-color: purple;
}
/* style320.css */
div {
width: 100%;
height: 100px;
}
div:nth-child(1){
background-color: pink;
}
div:nth-child(2){
background-color: purple;
}

3.Less基礎

3.1維護css的弊端

css是一門非程式式語言,沒有變數、函式SCOPE(作用域)等概念

  • css需要書寫大量看似沒有邏輯的程式碼,css冗餘度是比較高的

  • 不方便維護及擴充套件,不利於複用

  • css沒有很好的計算能力

  • 非前端開發工程師來講,往往會因為缺少css編寫經驗而很難寫出組織良好且易於維護的css程式碼專案。

3.2Less介紹

  • Less (Leaner Style Sheets的縮寫) 是一門css擴充套件語言,也成為css前處理器。

  • 作為CSS的一種形式的擴充套件,它並沒有減少CSS的功能,而是在現有的css語法上,為CSS加入程式式語言的特性。

  • 它在CSS的語法基礎之上,引入了變數,Mixin(混入),運算以及函式等功能,大大簡化了CSS的編寫,並且降低了CSS的維護成本,就像它的名稱所說的那樣,Less可以讓我們用更少的程式碼做更多的事情。

Less中文網址:http://lesscss.cn/

常見的CSS前處理器:Sass、Less、Stylus

一句話:Less是一門css預處理語言,它擴充套件了css的動態新特性。

3.3 Less使用

我們首先新建一個字尾名為less的檔案,在這個less檔案裡面書寫less語句。

  • Less變數

  • Less編譯

  • Less巢狀

  • Less運算

3.4 Less變數

變數是指沒有固定的值,可以改變的。因為我們CSS中的一些顏色和數值等經常使用。

@變數名:值;

1.變數名規範

  • 必須有@為字首

  • 不能包含特殊字元

  • 不能以數字開頭

  • 大小寫敏感

3.5 Less編譯

本質上,Less包含一套自定義的語法及一個解析器,使用者根據這些語法定義自己的樣式規則,則這些規則最終會通過解析器,編譯生成對應的CSS檔案。

所以,我們需要把我們的less檔案,編譯生成css檔案,這樣我i們的html頁面才能使用。

vocode Less外掛

Easy LESS外掛用來把less檔案編譯為css檔案

安裝完畢外掛,重新載入下vscode,會自動生成css檔案。

3.6 Less巢狀

我們經常用到選擇器的巢狀

header .logo {
width:300px;
}

Less巢狀寫法

header {
.logo {
width:300px;
}
}

如果遇見(交集|偽類|偽元素選擇器)

  • 內層選擇器的前面沒有&符號,則它被解析為父選擇器的後代

  • 如果有&符號,它就被解析為父元素自身或者父元素的偽類。

a:hover {
color:red;
}

less巢狀寫法

a {
&:hover {
color:red;
}
}

3.7Less運算

任何數字,顏色或者變數都可以參與運算。就是提供了加(+)、減(-)、乘(*)、除(/)算術運算。

/*Less 裡面寫*/
@width:10px + 5;
div {
border:@width solid red;
}
/*生成的css*/
div {
border:15px solid red;
}
/*less甚至還可以這樣*/
width:(@width + 5) * 2

注意:

  • 乘號(*)和除號(/)的寫法

  • 運算子中間左右有個空格隔開1px + 5

  • 對於兩個不同的單位的值之間的運算,運算結果的值取第一個值得的單位

  • 如果兩個值之間只有一個值有單位,則運算結果就取該單位

4.rem適配方案

  1. 讓一些不能等比自適應的元素,達到當裝置尺寸發生改變的時候,等比例適配當前裝置。

  2. 使用媒體查詢根據不同裝置按比例設定html的字型大小,然後頁面元素使用rem做尺寸單位,當html字型大小變化元素尺寸也會發生變化,從而達到等比縮放的適配。

4.1 rem實際開發適配方案

  1. 按照設計稿與裝置寬度的比例,動態計算並設定html根標籤的font-size大小;(媒體查詢)

  2. css中,設計稿元素的寬、高、相對位置等取值,按照同等比例換算為rem為單位的值;

4.2 rem適配方案技術使用(市場主流)

技術方案一

  • less

  • 媒體查詢

  • rem

技術方案二(推薦)

  • flexible.js

  • rem

總結:

  1. 兩種方案現在都存在。

  2. 方案二更簡單

4.3 rem實際開發適配方案一

rem+媒體查詢+less技術

1.設計稿常見尺寸寬度

裝置常見寬度
iPhone4.5 640px
iphone678 750px
android 常見320px、360px、375px、384px、400px、414px、500px、720px 大部分4.7~5寸的Android裝置為720px

一般情況下,我們以一套或兩套效果適應大部分的螢幕,放棄極端屏或對其優雅降級,犧牲一些效果,現在基本以750為準。

2.動態設定html標籤font-size大小

  1. 假設設計稿是750px

  2. 假設我們整個螢幕劃分為15等份(劃分標準不一 可以是20份、10份)

  3. 每一份作為html字型大小,這裡就是50px

  4. 那麼在320px裝置的時候,字型大小為320/15就是21.33px

  5. 用我們頁面元素的大小 除以不同的html 字型大小會發現他們比例還是相同的

  6. 比如我們以750為標準設計稿

  7. 一個100100畫素的頁面元素在750螢幕下,就是100/50 轉換為rem 是2rem2rem 比例是1比1

  8. 320螢幕下,html字型大小為21.33 則2rem = 42.66px 此時寬和高都是42.66px 但是寬和高的比例還是1比1

  9. 但是已經能實現不同螢幕下 頁面元素盒子等比例縮放效果

3.元素大小取值方法

  • 最後的公式:頁面元素的rem值=頁面元素值(px)/ (螢幕寬度/劃分的份數)

  • 螢幕寬度/劃分的份數 就是html font-size的大小

  • 或者:頁面元素的rem值=頁面元素值(px)/ html font-size 字型大小