此篇會教學如何將 Bootstrap grid 格線系統,自幹一個出來。
事前準備
若還不認識
格線系統
的朋友們,歡迎先閱讀完事前準備的兩篇文章,看完再來看這篇介紹會更好消化呦。
Bootstrap 格線系統真的蠻好用的,且在使用其他框架時也會載入來用,但如果都載入一個框架了,只使用它的格線系統,不會覺得有點那個嗎?
使用到兩隻檔案:
_grid.scss:格線系統主要執行入口。
mixins/_grid.scss:負責生成格線系統樣式。
簡單分為兩個區塊介紹(row、col)。
此範例只介紹基礎的格線系統,不包含 row-cols
、col-auto
、col-offset
。(如果迴響不錯可能未來會補上)
將第一區塊分三步驟來解析。
透過選項 (Options)設置
$enable-grid-classes
來判斷是否要生成grid 樣式
。(預設是 true)
$enable-grid-classes: true !default;
主要從
mixins/_grid.scss
生成row
樣式。
@mixin make-row($gutter: $grid-gutter-width) {
--#{$variable-prefix}gutter-x: #{$gutter};
--#{$variable-prefix}gutter-y: 0;
display: flex;
flex-wrap: wrap;
margin-top: calc(var(--#{$variable-prefix}gutter-y) * -1);
margin-right: calc(var(--#{$variable-prefix}gutter-x) / -2);
margin-left: calc(var(--#{$variable-prefix}gutter-x) / -2);
}
$grid-gutter-width:column
彼此之間的距離。
padding
的距離,因此設置 $grid-gutter-width / 2
。12px
,但常用的是 15px
,所以會將 $grid-gutter-width
設為 1.875rem(30px)。$variable-prefix:屬於 root 變數。
bs-
作為前綴避免與第三方套件的樣式衝突。flex:格線系統是基於 flex
,也繼承了伸縮的特性。
wrap:使 column
超過寬度時能夠自動換行。
透過 var()
函式重新將含 Interpolation 的字串轉為變數。(常見的組合變數手法)
margin 負數
padding
,需要設置 margin 負值
將容器給往外推擠出多的間距去補足多出來的間距。(可以嘗試把移除 margin 會發現 row 的寬度會少 24px
,因為用來填補多出來的左右間距)從外層可以看到樣式是
> *
,代表的是 row 內所有第一層
都會吃到此樣式,第二三四層都不會吃到。
@mixin make-col-ready($gutter: $grid-gutter-width) {
box-sizing: if(variable-exists(include-column-box-sizing) and $include-column-box-sizing, border-box, null);
flex-shrink: 0;
width: 100%;
max-width: 100%;
padding-right: calc(var(--#{$variable-prefix}gutter-x) / 2);
padding-left: calc(var(--#{$variable-prefix}gutter-x) / 2);
margin-top: var(--#{$variable-prefix}gutter-y);
}
box-sizing:透過設置 $include-column-box-sizing
,來判斷是否將 box-sizing
設置為 border-box
。
border-box
,計算 column 尺寸時才會包含 padding,不然 column 的 width
就不準確了。flex-shrink:設置空間壓縮比例。(預設值 1)
0
,使其透過 column 欄數來自動分配對應的壓縮比例。width:設置寬度 100%。
col-*
來覆蓋 width 的值。max-width:設置最大寬度 100%。
.col-auto
、.col
)padding:推擠內層空間。