網格系統
使用我們強大的移動優先 flexbox 網格來構建各種形狀和大小的佈局,這要歸功於 12 列系統、5 個默認響應層、Sass 變量和 mixin 以及數十個預定義類。
這個怎麼運作
Bootstrap 的網格系統使用一系列容器、行和列來佈局和對齊內容。它是用flexbox構建的,並且是完全響應的。下面是一個示例,並深入了解了網格是如何組合在一起的。
剛接觸或不熟悉 flexbox? 閱讀此 CSS 技巧 flexbox 指南,了解背景、術語、指南和代碼片段。
<div class="container">
<div class="row">
<div class="col-sm">
One of three columns
</div>
<div class="col-sm">
One of three columns
</div>
<div class="col-sm">
One of three columns
</div>
</div>
</div>
上面的示例使用我們預定義的網格類在小型、中型、大型和超大型設備上創建了三個等寬列。這些列在父頁面的中心.container
。
分解它,這是它的工作原理:
- 容器提供了一種居中和水平填充站點內容的方法。用於
.container
響應式像素寬度或.container-fluid
用於width: 100%
所有視口和設備尺寸。 - 行是列的包裝器。每列都有水平
padding
的(稱為排水溝),用於控制它們之間的空間。padding
然後在具有負邊距的行上抵消這一點。這樣,列中的所有內容在視覺上都在左側對齊。 - 在網格佈局中,內容必須放在列中,並且只有列可以是行的直接子級。
- 感謝 flexbox,沒有指定的網格列
width
將自動佈局為等寬列。例如,四個實例.col-sm
將自動從小斷點開始寬 25% 及以上。有關更多示例,請參閱自動佈局列部分。 - 列類表示每行可能有 12 個列中您希望使用的列數。所以,如果你想要三個等寬的列,你可以使用
.col-4
. - Column
width
是按百分比設置的,所以它們總是相對於它們的父元素是流動的和大小的。 - 列具有水平
padding
以在各個列之間創建裝訂線,但是,您可以margin
從行和padding
列.no-gutters
中刪除.row
. - 為了使網格響應,有五個網格斷點,每個響應斷點一個:所有斷點(特小)、小、中、大和特大。
- 網格斷點基於最小寬度媒體查詢,這意味著它們適用於該斷點及其上方的所有斷點(例如,
.col-sm-4
適用於小型、中型、大型和超大型設備,但不適用於第一個xs
斷點)。 - 您可以使用預定義的網格類(如
.col-4
)或Sass mixins來進行更多語義標記。
請注意flexbox的限制和錯誤,例如無法將某些 HTML 元素用作 flex 容器。
網格選項
Bootstrap 使用em
s 或rem
s 來定義大多數大小,而px
s 用於網格斷點和容器寬度。這是因為視口寬度以像素為單位,不隨字體大小而變化。
通過方便的表格了解 Bootstrap 網格系統的各個方面如何跨多個設備工作。
超小 <576px |
小 ≥576px |
中 ≥768px |
大 ≥992px |
特大 ≥1200px |
|
---|---|---|---|---|---|
最大容器寬度 | 無(自動) | 540像素 | 720像素 | 960像素 | 1140像素 |
類前綴 | .col- |
.col-sm- |
.col-md- |
.col-lg- |
.col-xl- |
# 列數 | 12 | ||||
天溝寬度 | 30 像素(每列各 15 像素) | ||||
可嵌套 | 是的 | ||||
列排序 | 是的 |
自動佈局列
利用特定於斷點的列類來輕鬆調整列大小,而無需像.col-sm-6
.
等寬
例如,這裡有兩個網格佈局適用於每個設備和視口,從xs
到xl
. 為您需要的每個斷點添加任意數量的無單位類,並且每列的寬度都相同。
<div class="container">
<div class="row">
<div class="col">
1 of 2
</div>
<div class="col">
2 of 2
</div>
</div>
<div class="row">
<div class="col">
1 of 3
</div>
<div class="col">
2 of 3
</div>
<div class="col">
3 of 3
</div>
</div>
</div>
等寬多行
.w-100
通過在您希望列換行的位置插入 a 來創建跨多行的等寬列。.w-100
通過與一些響應式顯示實用程序混合使休息時間響應。
有一個Safari flexbox 錯誤,在沒有明確的flex-basis
或border
. 舊版瀏覽器有一些變通方法,但如果您的目標瀏覽器不屬於有缺陷的版本,則不需要它們。
<div class="container">
<div class="row">
<div class="col">col</div>
<div class="col">col</div>
<div class="w-100"></div>
<div class="col">col</div>
<div class="col">col</div>
</div>
</div>
設置一列寬
flexbox 網格列的自動佈局還意味著您可以設置一列的寬度並讓同級列自動調整其大小。您可以使用預定義的網格類(如下所示)、網格混合或內聯寬度。請注意,無論中心列的寬度如何,其他列都會調整大小。
<div class="container">
<div class="row">
<div class="col">
1 of 3
</div>
<div class="col-6">
2 of 3 (wider)
</div>
<div class="col">
3 of 3
</div>
</div>
<div class="row">
<div class="col">
1 of 3
</div>
<div class="col-5">
2 of 3 (wider)
</div>
<div class="col">
3 of 3
</div>
</div>
</div>
可變寬度內容
使用col-{breakpoint}-auto
類根據其內容的自然寬度來調整列的大小。
<div class="container">
<div class="row justify-content-md-center">
<div class="col col-lg-2">
1 of 3
</div>
<div class="col-md-auto">
Variable width content
</div>
<div class="col col-lg-2">
3 of 3
</div>
</div>
<div class="row">
<div class="col">
1 of 3
</div>
<div class="col-md-auto">
Variable width content
</div>
<div class="col col-lg-2">
3 of 3
</div>
</div>
</div>
響應類
Bootstrap 的網格包括五層預定義類,用於構建複雜的響應式佈局。在您認為合適的超小型、小型、中型、大型或超大型設備上自定義列的大小。
所有斷點
對於從最小設備到最大設備都相同的網格,請使用.col
和.col-*
類。當你需要一個特別大小的列時,指定一個編號的類;否則,請隨意堅持.col
。
<div class="container">
<div class="row">
<div class="col">col</div>
<div class="col">col</div>
<div class="col">col</div>
<div class="col">col</div>
</div>
<div class="row">
<div class="col-8">col-8</div>
<div class="col-4">col-4</div>
</div>
</div>
堆疊成水平
使用一組.col-sm-*
類,您可以創建一個基本的網格系統,該系統從堆疊開始並在小斷點 ( sm
) 處變為水平。
<div class="container">
<div class="row">
<div class="col-sm-8">col-sm-8</div>
<div class="col-sm-4">col-sm-4</div>
</div>
<div class="row">
<div class="col-sm">col-sm</div>
<div class="col-sm">col-sm</div>
<div class="col-sm">col-sm</div>
</div>
</div>
連連看
不希望您的列簡單地堆疊在某些網格層中?根據需要為每一層使用不同類的組合。請參閱下面的示例,以更好地了解它是如何工作的。
<div class="container">
<!-- Stack the columns on mobile by making one full-width and the other half-width -->
<div class="row">
<div class="col-md-8">.col-md-8</div>
<div class="col-6 col-md-4">.col-6 .col-md-4</div>
</div>
<!-- Columns start at 50% wide on mobile and bump up to 33.3% wide on desktop -->
<div class="row">
<div class="col-6 col-md-4">.col-6 .col-md-4</div>
<div class="col-6 col-md-4">.col-6 .col-md-4</div>
<div class="col-6 col-md-4">.col-6 .col-md-4</div>
</div>
<!-- Columns are always 50% wide, on mobile and desktop -->
<div class="row">
<div class="col-6">.col-6</div>
<div class="col-6">.col-6</div>
</div>
</div>
天溝
排水溝可以通過斷點特定的填充和負邊距實用程序類進行響應式調整。要更改給定行中的裝訂線,請將負邊距實用程序與 s 上的.row
匹配填充實用程序配對.col
。.container
or.container-fluid
父級也可能需要調整以避免不必要的溢出,再次使用匹配的填充實用程序。
lg
這是在大 ( ) 斷點及以上處自定義 Bootstrap 網格的示例。我們用 增加了.col
填充,用父.px-lg-5
級抵消了它,然後用 調整了包裝器。.mx-lg-n5
.row
.container
.px-lg-5
<div class="container px-lg-5">
<div class="row mx-lg-n5">
<div class="col py-3 px-lg-5 border bg-light">Custom column padding</div>
<div class="col py-3 px-lg-5 border bg-light">Custom column padding</div>
</div>
</div>
行列
使用響應.row-cols-*
式類快速設置最能呈現您的內容和佈局的列數。普通.col-*
類適用於單個列(例如.col-md-4
),而行列類.row
作為快捷方式設置在父級上。
使用這些行列類快速創建基本的網格佈局或控制您的卡片佈局。
<div class="container">
<div class="row row-cols-2">
<div class="col">Column</div>
<div class="col">Column</div>
<div class="col">Column</div>
<div class="col">Column</div>
</div>
</div>
<div class="container">
<div class="row row-cols-3">
<div class="col">Column</div>
<div class="col">Column</div>
<div class="col">Column</div>
<div class="col">Column</div>
</div>
</div>
<div class="container">
<div class="row row-cols-4">
<div class="col">Column</div>
<div class="col">Column</div>
<div class="col">Column</div>
<div class="col">Column</div>
</div>
</div>
<div class="container">
<div class="row row-cols-4">
<div class="col">Column</div>
<div class="col">Column</div>
<div class="col-6">Column</div>
<div class="col">Column</div>
</div>
</div>
<div class="container">
<div class="row row-cols-1 row-cols-sm-2 row-cols-md-4">
<div class="col">Column</div>
<div class="col">Column</div>
<div class="col">Column</div>
<div class="col">Column</div>
</div>
</div>
您還可以使用隨附的 Sass mixin row-cols()
:
.element {
// Three columns to start
@include row-cols(3);
// Five columns from medium breakpoint up
@include media-breakpoint-up(md) {
@include row-cols(5);
}
}
結盟
使用 flexbox 對齊實用程序來垂直和水平對齊列。Internet Explorer 10-11 不支持彈性項目的垂直對齊,當彈性容器具有min-height
如下所示的時。 有關更多詳細信息,請參閱 Flexbugs #3。
垂直對齊
<div class="container">
<div class="row align-items-start">
<div class="col">
One of three columns
</div>
<div class="col">
One of three columns
</div>
<div class="col">
One of three columns
</div>
</div>
<div class="row align-items-center">
<div class="col">
One of three columns
</div>
<div class="col">
One of three columns
</div>
<div class="col">
One of three columns
</div>
</div>
<div class="row align-items-end">
<div class="col">
One of three columns
</div>
<div class="col">
One of three columns
</div>
<div class="col">
One of three columns
</div>
</div>
</div>
<div class="container">
<div class="row">
<div class="col align-self-start">
One of three columns
</div>
<div class="col align-self-center">
One of three columns
</div>
<div class="col align-self-end">
One of three columns
</div>
</div>
</div>
水平對齊
<div class="container">
<div class="row justify-content-start">
<div class="col-4">
One of two columns
</div>
<div class="col-4">
One of two columns
</div>
</div>
<div class="row justify-content-center">
<div class="col-4">
One of two columns
</div>
<div class="col-4">
One of two columns
</div>
</div>
<div class="row justify-content-end">
<div class="col-4">
One of two columns
</div>
<div class="col-4">
One of two columns
</div>
</div>
<div class="row justify-content-around">
<div class="col-4">
One of two columns
</div>
<div class="col-4">
One of two columns
</div>
</div>
<div class="row justify-content-between">
<div class="col-4">
One of two columns
</div>
<div class="col-4">
One of two columns
</div>
</div>
</div>
沒有排水溝
我們預定義的網格類中的列之間的間距可以用.no-gutters
. 這會從所有直接子列中刪除負數margin
s.row
和水平線。padding
這是創建這些樣式的源代碼。請注意,列覆蓋的範圍僅限於第一個子列,並通過屬性選擇器定位。雖然這會生成更具體的選擇器,但仍可以使用間距實用程序進一步自定義列填充。
需要邊緣到邊緣的設計?刪除父級.container
或.container-fluid
.
.no-gutters {
margin-right: 0;
margin-left: 0;
> .col,
> [class*="col-"] {
padding-right: 0;
padding-left: 0;
}
}
在實踐中,它看起來是這樣的。請注意,您可以繼續將其與所有其他預定義的網格類(包括列寬、響應層、重新排序等)一起使用。
<div class="row no-gutters">
<div class="col-sm-6 col-md-8">.col-sm-6 .col-md-8</div>
<div class="col-6 col-md-4">.col-6 .col-md-4</div>
</div>
列換行
如果單行中放置了超過 12 列,則每組額外的列將作為一個單元換行。
由於 9 + 4 = 13 > 12,這個 4 列寬的 div 作為一個連續單元被換行到一個新行上。
後續列沿新行繼續。
<div class="container">
<div class="row">
<div class="col-9">.col-9</div>
<div class="col-4">.col-4<br>Since 9 + 4 = 13 > 12, this 4-column-wide div gets wrapped onto a new line as one contiguous unit.</div>
<div class="col-6">.col-6<br>Subsequent columns continue along the new line.</div>
</div>
</div>
分欄符
在 flexbox 中將列換行需要一個小技巧:width: 100%
在您想要將列換行的任何位置添加一個元素。通常這是通過多個.row
s 來完成的,但並不是每個實現方法都可以解決這個問題。
<div class="container">
<div class="row">
<div class="col-6 col-sm-3">.col-6 .col-sm-3</div>
<div class="col-6 col-sm-3">.col-6 .col-sm-3</div>
<!-- Force next columns to break to new line -->
<div class="w-100"></div>
<div class="col-6 col-sm-3">.col-6 .col-sm-3</div>
<div class="col-6 col-sm-3">.col-6 .col-sm-3</div>
</div>
</div>
您還可以使用我們的響應式顯示實用程序在特定斷點應用此中斷。
<div class="container">
<div class="row">
<div class="col-6 col-sm-4">.col-6 .col-sm-4</div>
<div class="col-6 col-sm-4">.col-6 .col-sm-4</div>
<!-- Force next columns to break to new line at md breakpoint and up -->
<div class="w-100 d-none d-md-block"></div>
<div class="col-6 col-sm-4">.col-6 .col-sm-4</div>
<div class="col-6 col-sm-4">.col-6 .col-sm-4</div>
</div>
</div>
重新排序
訂單類
使用.order-
類來控制內容的視覺順序。這些類是響應式的,因此您可以設置order
斷點(例如,.order-1.order-md-2
)。包括對所有五個網格層1
的支持。12
<div class="container">
<div class="row">
<div class="col">
First in DOM, no order applied
</div>
<div class="col order-12">
Second in DOM, with a larger order
</div>
<div class="col order-1">
Third in DOM, with an order of 1
</div>
</div>
</div>
還有響應式.order-first
和.order-last
類分別通過應用和( )來改變order
元素的屬性。這些類也可以根據需要與編號的類混合。order: -1
order: 13
order: $columns + 1
.order-*
<div class="container">
<div class="row">
<div class="col order-last">
First in DOM, ordered last
</div>
<div class="col">
Second in DOM, unordered
</div>
<div class="col order-first">
Third in DOM, ordered first
</div>
</div>
</div>
偏移列
您可以通過兩種方式偏移網格列:我們的響應.offset-
式網格類和我們的邊距實用程序。網格類的大小與列匹配,而邊距對於偏移寬度可變的快速佈局更有用。
偏移類
使用類將列向右移動.offset-md-*
。這些類逐列增加一列的左邊距*
。例如,.offset-md-4
移動.col-md-4
四列。
<div class="container">
<div class="row">
<div class="col-md-4">.col-md-4</div>
<div class="col-md-4 offset-md-4">.col-md-4 .offset-md-4</div>
</div>
<div class="row">
<div class="col-md-3 offset-md-3">.col-md-3 .offset-md-3</div>
<div class="col-md-3 offset-md-3">.col-md-3 .offset-md-3</div>
</div>
<div class="row">
<div class="col-md-6 offset-md-3">.col-md-6 .offset-md-3</div>
</div>
</div>
除了在響應斷點處清除列之外,您可能還需要重置偏移量。請參閱網格示例中的實際操作。
<div class="container">
<div class="row">
<div class="col-sm-5 col-md-6">.col-sm-5 .col-md-6</div>
<div class="col-sm-5 offset-sm-2 col-md-6 offset-md-0">.col-sm-5 .offset-sm-2 .col-md-6 .offset-md-0</div>
</div>
<div class="row">
<div class="col-sm-6 col-md-5 col-lg-6">.col-sm-6 .col-md-5 .col-lg-6</div>
<div class="col-sm-6 col-md-5 offset-md-2 col-lg-6 offset-lg-0">.col-sm-6 .col-md-5 .offset-md-2 .col-lg-6 .offset-lg-0</div>
</div>
</div>
保證金效用
隨著 v4 中向 flexbox 的遷移,您可以使用邊距實用程序,例如.mr-auto
強制兄弟列彼此遠離。
<div class="container">
<div class="row">
<div class="col-md-4">.col-md-4</div>
<div class="col-md-4 ml-auto">.col-md-4 .ml-auto</div>
</div>
<div class="row">
<div class="col-md-3 ml-md-auto">.col-md-3 .ml-md-auto</div>
<div class="col-md-3 ml-md-auto">.col-md-3 .ml-md-auto</div>
</div>
<div class="row">
<div class="col-auto mr-auto">.col-auto .mr-auto</div>
<div class="col-auto">.col-auto</div>
</div>
</div>
嵌套
要使用默認網格嵌套您的內容,請在現有列中添加一.row
組新列。嵌套行應包括一組不超過 12 列的列(不需要使用所有 12 個可用列)。.col-sm-*
.col-sm-*
<div class="container">
<div class="row">
<div class="col-sm-9">
Level 1: .col-sm-9
<div class="row">
<div class="col-8 col-sm-6">
Level 2: .col-8 .col-sm-6
</div>
<div class="col-4 col-sm-6">
Level 2: .col-4 .col-sm-6
</div>
</div>
</div>
</div>
</div>
Sass 混合
使用 Bootstrap 的 Sass 源文件時,您可以選擇使用 Sass 變量和 mixin 來創建自定義、語義和響應式頁面佈局。我們預定義的網格類使用這些相同的變量和 mixin 來提供一整套現成的類,以實現快速響應的佈局。
變量
變量和映射確定列數、裝訂線寬度和開始浮動列的媒體查詢點。我們使用這些來生成上面記錄的預定義網格類,以及下面列出的自定義 mixins。
$grid-columns: 12;
$grid-gutter-width: 30px;
$grid-breakpoints: (
// Extra small screen / phone
xs: 0,
// Small screen / phone
sm: 576px,
// Medium screen / tablet
md: 768px,
// Large screen / desktop
lg: 992px,
// Extra large screen / wide desktop
xl: 1200px
);
$container-max-widths: (
sm: 540px,
md: 720px,
lg: 960px,
xl: 1140px
);
混合
Mixin 與網格變量結合使用,為各個網格列生成語義 CSS。
// Creates a wrapper for a series of columns
@include make-row();
// Make the element grid-ready (applying everything but the width)
@include make-col-ready();
@include make-col($size, $columns: $grid-columns);
// Get fancy by offsetting, or changing the sort order
@include make-col-offset($size, $columns: $grid-columns);
示例用法
您可以將變量修改為您自己的自定義值,或者僅使用帶有默認值的 mixin。這是一個使用默認設置創建兩列佈局的示例,其間有間隙。
.example-container {
@include make-container();
// Make sure to define this width after the mixin to override
// `width: 100%` generated by `make-container()`
width: 800px;
}
.example-row {
@include make-row();
}
.example-content-main {
@include make-col-ready();
@include media-breakpoint-up(sm) {
@include make-col(6);
}
@include media-breakpoint-up(lg) {
@include make-col(8);
}
}
.example-content-secondary {
@include make-col-ready();
@include media-breakpoint-up(sm) {
@include make-col(6);
}
@include media-breakpoint-up(lg) {
@include make-col(4);
}
}
<div class="example-container">
<div class="example-row">
<div class="example-content-main">Main content</div>
<div class="example-content-secondary">Secondary content</div>
</div>
</div>
自定義網格
使用我們內置的網格 Sass 變量和映射,可以完全自定義預定義的網格類。更改層數、媒體查詢維度和容器寬度,然後重新編譯。
列和排水溝
網格列的數量可以通過 Sass 變量進行修改。$grid-columns
用於生成每個單獨列的寬度(以百分比為單位),同時$grid-gutter-width
設置列間距的寬度。
$grid-columns: 12 !default;
$grid-gutter-width: 30px !default;
網格層
除了列本身之外,您還可以自定義網格層的數量。如果您只想要四個網格層,您可以將$grid-breakpoints
and更新為$container-max-widths
如下內容:
$grid-breakpoints: (
xs: 0,
sm: 480px,
md: 768px,
lg: 1024px
);
$container-max-widths: (
sm: 420px,
md: 720px,
lg: 960px
);
在對 Sass 變量或映射進行任何更改時,您需要保存更改並重新編譯。這樣做將輸出一組全新的預定義網格類,用於列寬、偏移和排序。響應式可見性實用程序也將更新為使用自定義斷點。確保在px
(not rem
, em
, or %
) 中設置網格值。