bootstrap深入理解之格子布局

小龍女先生發表於2016-05-12

一、原始碼檔案:

_grid.scss:格子系統類檔案
Mixins/_grid.scss:支援格子系統實現的mixin集合
Mixins/_grid-framework.scss:格子系統實現的核心mixin

二、支援的功能

1. 實現按百分比佈局

2. 實現格子的定位

3. 實現格子的巢狀

4. 如果只使用格子系統,可以只編碼bootstrap-grid.scss檔案

三、實現原理

1、 按百分比佈局,主要思考的問題如何在不同的裝置上平均分配的寬度,bootstrap只是用了簡單的百分比,在任何尺寸裝置下都是使用相同的百分比。

2、 格子的定位:解決了格子向左移動、向右移動、以格子向右偏移幾個單元格的能力

3、 格子的巢狀:實現了格子內容再巢狀格子布局系統。

四、原始碼分析:

1、_grid.scss:格子系統生成的主類,引用了mixins/_grid.scss、mixins/_grid-framework.scss、variables.scss類中的變數及相關方法。
首先:定義兩個容器類

     a) container:格子容器,根據不同裝置定義不同的寬度,不會充滿全屏;

     b) continaer-fluid:格子容器,在任何支援下都會充滿全屏
container和container-fluid都使用了make-container(mixins/_grid.scss),make-container只實現了居中、左右內邊距、清除浮動等控制;其中container根據不同裝置定義了容器的寬度

然後:定義row(行):
呼叫了make-row(mixins/_grids.scss)實現清除浮動、左右外邊距的定義,在4.0中,如果開啟了flex佈局的支援,就設定容器的display為flex和flex-wrap為wrap,並去掉清浮動。

再則:直接呼叫make-grid-columns(mixins/_grid-framework.scss)實現單元格的建立

    a) make-grid-columns:單元格生成的入口方法,傳遞所能支援的格子總數、外邊距寬度、所支援的幾種尺寸

    b) make-grid-columns引用了mixins/_grid.scss中的許多方法:

    a) 用到了map的map-key函式,用於遍歷一個map的key集合;

用到了@extend函式,用於繼承,實現所有col左浮動,以及所有col都相對定位。

@for $i from 1 through $columns {
      .col-#{$breakpoint}-#{$i} {
        @extend %grid-column; //extend是繼承,將此合併為一個樣式集合
        //.col-xs-1,col-xs-2{ positiona:relative; .... }
      }
    }

a) Make-col-span函式,實現col寬度的計算

b) 呼叫mixins/_grid.scss中的make-col-modifier方法,實現push、pull、offset的樣式的生成:

i. Push:向右推幾個格子,用的是left

ii. Pull:向左推幾個格子,用的是right

iii. Offset:利用的是margin-left實現,向右推向個百分比。

@mixin make-col-offset($size, $columns: $grid-columns) {
  margin-left: percentage($size / $columns);
}

@mixin make-col-push($size, $columns: $grid-columns) {
  left: if($size > 0, percentage($size / $columns), auto);
}

@mixin make-col-pull($size, $columns: $grid-columns) {
  right: if($size > 0, percentage($size / $columns), auto);
}

@mixin make-col-modifier($type, $size, $columns) {
  // Work around the lack of dynamic mixin @include support (https://github.com/sass/sass/issues/626)
  @if $type == push {
    @include make-col-push($size, $columns);
  } @else if $type == pull {
    @include make-col-pull($size, $columns);
  } @else if $type == offset {
    @include make-col-offset($size, $columns);
  }
}

相關文章