Skip to content

網格系統(Grid System)

網格系統用於網頁版面的分割、組織,目前前端UI框架(例如 Bootstrap、Vuetify 等)的網格系統多數採用了Flex布局,三種主要的布局方式分別是:

布局方式概念相容性
Float將元素浮動到左側或右側實現多列布局。較早的網頁佈局技術,可以支援較古老的瀏覽器(甚至包括IE 9)。
Flex基於「彈性盒子」概念,使得元素在一個維度上靈活排列、對齊和分佈。當前主流布局技術
Grid基於網格和單元格的概念的多維度*布局方式,元素可以在水平和垂直方向上同時進行精確的位置控制和大小調整。現代瀏覽器中得到廣泛支援,但在舊版本的瀏覽器上相容性可能較差。然而,它被視為未來的主要布局方式,因為它提供了更大的彈性和控制。

學習目標:

  • 學會 flex
  • 學會使用網格系統

彈性佈局模式(Flexbox)

口訣:

  1. [列]方向,決定子元素排列方向,預設為水平。
  2. [行]百分比,子元素是否有設置百分比,有設置百分比的話就不理會伸縮。
  3. [行]伸縮,子元素是否有設置伸縮,將決定如何分配剩餘空間,通常使用 grow 讓子元素在有剩餘空間時自動伸展。
  4. [行]基底大小,子元素都沒有設置以上屬性(2, 3)的話,直接套用子元素的基底大小。

flex-direction:

基本設置

使用Flex佈局的基本設置:

  1. 設置容器的display屬性為flex或inline-flex,將容器元素定義為Flex容器(flex container)。
  2. 將容器內的元素設置為Flex項目(flex item),並指定它們的佈局規則。
css 屬性預設值說明
flex-basis
基礎大小
auto
由元素內容決定
指定網格元素初始大小。
flex-grow
增長因子
0
不增長
每個網格元素依照增長因子比例分配剩餘可用空間。
flex-shrink
收縮因子
1指定初始大小相加超出可用空間時,每個網格元素等比例縮小的權重。

MDN-flex growMDN-flex shrink

css
/*
 ====== 1. 將容器元素定義為Flex容器(flex container)======
 */
.container {
  display: flex; /* 或 inline-flex,取決於需要 */
}

/*
 ====== 2. 指定容器內的元素的佈局規則。======
*/
/* 佔去固定寬度100像素 */
.item1 { width: 100px; }
/* 佔去固定比例 1/12 */
.item2 { width: 8.333333%; }
/*
  增長因子(flex-grow)
  如果一個元素的增長設置為1;而其他元素設置為0,當有剩餘空間時,該元素增長而其他元素保持不變。
  如果所有列都設置為1,它們將平均分享額外的空間。
*/
.item3 { flex-grow: 1; }
/* 
  收縮因子(flex-shrink)
  如果一個列的收縮因子設置為1,而其他列都設置為0,當可用空間不足時該列將縮小,其他列將保持不變。
  如果所有列都設置為1,它們將平均收縮以適應缺少的空間。 
*/
.item4 { flex-shrink: 0; } /* 不允許收縮 */
/*
 ====== 1. 將容器元素定義為Flex容器(flex container)======
 */
.container {
  display: flex; /* 或 inline-flex,取決於需要 */
}

/*
 ====== 2. 指定容器內的元素的佈局規則。======
*/
/* 佔去固定寬度100像素 */
.item1 { width: 100px; }
/* 佔去固定比例 1/12 */
.item2 { width: 8.333333%; }
/*
  增長因子(flex-grow)
  如果一個元素的增長設置為1;而其他元素設置為0,當有剩餘空間時,該元素增長而其他元素保持不變。
  如果所有列都設置為1,它們將平均分享額外的空間。
*/
.item3 { flex-grow: 1; }
/* 
  收縮因子(flex-shrink)
  如果一個列的收縮因子設置為1,而其他列都設置為0,當可用空間不足時該列將縮小,其他列將保持不變。
  如果所有列都設置為1,它們將平均收縮以適應缺少的空間。 
*/
.item4 { flex-shrink: 0; } /* 不允許收縮 */

flex shorthand property

css
.item {
  /* Three values: flex-grow | flex-shrink | flex-basis */
  flex: <flex-grow> <flex-shrink> <flex-basis>;
  /* Two values: flex-grow | flex-basis */
  flex: <flex-grow> <flex-basis>;
  /* Two values: flex-grow | flex-shrink */
  flex: <flex-grow> <flex-shrink>;
}
.item {
  /* Three values: flex-grow | flex-shrink | flex-basis */
  flex: <flex-grow> <flex-shrink> <flex-basis>;
  /* Two values: flex-grow | flex-basis */
  flex: <flex-grow> <flex-basis>;
  /* Two values: flex-grow | flex-shrink */
  flex: <flex-grow> <flex-shrink>;
}

MDN-Shorthand Properties

彈性網格系統(Flex Grid System)

以 bootstrap 為例,經典的網格系統長這樣(實際拿出來看):

css
.col { flex: 1 0 0%; } /*增長因子為 1,會長大*/ 
/* col-1 ~ col-12 固定百分比 */
.col-auto{flex:0 0 auto;width:auto}
.col-1{flex:0 0 auto;width:8.33333333%}
.col-2{flex:0 0 auto;width:16.66666667%}
.col-3{flex:0 0 auto;width:25%}
.col-4{flex:0 0 auto;width:33.33333333%}
.col-5{flex:0 0 auto;width:41.66666667%}
.col-6{flex:0 0 auto;width:50%}
.col-7{flex:0 0 auto;width:58.33333333%}
.col-8{flex:0 0 auto;width:66.66666667%}
.col-9{flex:0 0 auto;width:75%}
.col-10{flex:0 0 auto;width:83.33333333%}
.col-11{flex:0 0 auto;width:91.66666667%}
.col-12{flex:0 0 auto;width:100%}
.col { flex: 1 0 0%; } /*增長因子為 1,會長大*/ 
/* col-1 ~ col-12 固定百分比 */
.col-auto{flex:0 0 auto;width:auto}
.col-1{flex:0 0 auto;width:8.33333333%}
.col-2{flex:0 0 auto;width:16.66666667%}
.col-3{flex:0 0 auto;width:25%}
.col-4{flex:0 0 auto;width:33.33333333%}
.col-5{flex:0 0 auto;width:41.66666667%}
.col-6{flex:0 0 auto;width:50%}
.col-7{flex:0 0 auto;width:58.33333333%}
.col-8{flex:0 0 auto;width:66.66666667%}
.col-9{flex:0 0 auto;width:75%}
.col-10{flex:0 0 auto;width:83.33333333%}
.col-11{flex:0 0 auto;width:91.66666667%}
.col-12{flex:0 0 auto;width:100%}

Vuetify 網格系統

元件作用重要屬性替代 1.x 的內容
v-row宣告 flex 容器,包裝v-coldense, no-guttersv-layout
v-col必須是 v-row 的直接子元素v-flex
v-spacer分配剩餘的寬度,子元件之前或之後放置單個 v-spacer 時,這些元件將推向其容器的右側和左側。當在多個元件之間使用多個 v-spacer 時,剩餘的寬度將均勻分佈在每個間距之間。

Breakpoints

coderange
xs<600px
sm600px><960px
md960px><1280px
lg1280px><1920px
xl1920px><2560px
xxl>2560px

常用搜尋區 RWD

html
<v-row>
  <v-col cols="12" md="6" lg="3">搜尋框1</v-col>
  <v-col cols="12" md="6" lg="3">搜尋框2</v-col>
  <v-col cols="12" md="6" lg="3">搜尋框3</v-col>
  <v-col cols="12" md="6" lg="3">搜尋框4</v-col>
  <v-col class="d-none d-lg-block"></v-col>
  <v-col cols="12" md="6" lg="auto">
    <v-btn class="w-100">按鈕</v-btn>
  </v-col>
  <v-col cols="12" md="6" lg="auto">
    <v-btn class="w-100">按鈕</v-btn>
  </v-col>
</v-row>
<v-row>
  <v-col cols="12" md="6" lg="3">搜尋框1</v-col>
  <v-col cols="12" md="6" lg="3">搜尋框2</v-col>
  <v-col cols="12" md="6" lg="3">搜尋框3</v-col>
  <v-col cols="12" md="6" lg="3">搜尋框4</v-col>
  <v-col class="d-none d-lg-block"></v-col>
  <v-col cols="12" md="6" lg="auto">
    <v-btn class="w-100">按鈕</v-btn>
  </v-col>
  <v-col cols="12" md="6" lg="auto">
    <v-btn class="w-100">按鈕</v-btn>
  </v-col>
</v-row>

螢幕寬度 0,效果:

搜尋框1
搜尋框2
搜尋框3
搜尋框4

練習

常用表格 RWD 策略

  • 大螢幕 => 完整表格
  • 中螢幕 => 減少不重要欄位
  • 小螢幕 => 卡片清單、可展開細節

Reference