今天研究了如何实现网格布局,主要学习了这篇文章中的内容。特写此篇博客作为总结。
一、网格布局的用途
网格布局的作用在于更有效地控制元素在网页中所占比例的大小。比如,博客中有一个留言板模块,在比较大的屏幕上,我们希望它占了右边 25% 的宽度,在手机等比较小的屏幕上,我们希望它占 100% 的宽度,出现在博客文章下方。网格布局是一种实现这一需求的办法,它的好处是,把所有的宽度分为固定栏数(常用 12 栏),从而更高效的控制元素宽度。
二、如何实现网格布局
一个网格系统所包括的元素
如上图所见,一个基础的网格系统包括。
- 容器(container)
- 行(row)
- 列(column)
- 槽(gutter)
1. 容器(container)
容器的目的是设置整个网格的宽度。容器的宽度一般为100%,可以设置一个最大的宽度值。
1 2 3 4
| .grid-container { width : 100%; max-width : 1200px; }
|
2. 行(row)
行元素是用来包裹列(column),防止列浮动到容器外部。通过使用clearfix
清除浮动。
1 2 3 4 5 6 7
| .row:before, .row:after { content:""; display: table; clear:both; }
|
3. 列(column)
列是用来放置内容的区块,通过对其浮动,使其能在一行中呈现出来。
1 2 3 4
| [class*='col-'] { float: left; min-height: 1px; }
|
ps:[class*='col-']
这个是正则的css,表示所有css以col开始的class都使用这个规则。
另外,因为我们需要创建12栏的网格,所以每栏的宽度为 100%/12(总宽度/栏数)= 8.33%。
得出
1 2 3 4 5 6 7 8 9 10
| .col-1 { width: 8.33%; // 1个栏 } .col-2 { width: 16.66%; // 2个栏 } .col-3 { width: 25%; // 3个栏 } // 以此类推...
|
4. 槽(gutter)
由图可知,槽是两列中的空隙。为了更方便的创建槽,通过设置CSS3中box-sizing: border-box
,将W3C标准盒模型变为ie的盒模型,即内容部分包括了border和padding。
1 2 3 4 5 6 7 8 9 10 11 12 13
| .grid-container *{ box-sizing: border-box; width : 100%; }
[class*='col-'] { float: left; min-height: 1px; width: 16.66%; padding: 12px; }
|
三、完整的代码
HTML
1 2 3 4 5 6 7 8 9 10 11 12
| <div class="grid-container"> <div class="row"> <div class="col-4"><p></p></div> <div class="col-4"><p></p></div> <div class="col-4"><p></p></div> </div> <div class="row"> <div class="col-3"><p></p></div> <div class="col-6"><p></p></div> <div class="col-3"><p></p></div> </div> </div>
|
CSS
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| .grid-container{ width: 100%; max-width: 1200px; }
.row:before, .row:after { content:""; display: table ; clear:both; }
[class*='col-'] { float: left; min-height: 1px; width: 8.33%; padding: 12px; background-color: #FFDCDC; }
.col-1 {width: 8.33%;} .col-2 {width: 16.66%;} .col-3 {width: 25%;} .col-4 {width: 33.33%} .col-5 {width: 41.66%;} .col-6 {width: 50%} .col-7 {width: 58.33%;} .col-8 {width: 66.66%;} .col-9 {width: 75%;} .col-10 {width: 83.33%} .col-11 {width: 91.66%} .col-12 {width: 100%}
|
四、创建响应式网格布局
以 BootStrap 的网格系统为例,DOM 元素类名形如 col-md-4;其中 col 是“列” column 的缩写;md 是 medium 的缩写,适用于应屏幕宽度大于 768px 的场景;4 是占四栏的意思。因此,col-md-4 的意思是,在屏幕宽度大于 768px 时,该元素占四栏。
由此通过使用CSS3中的媒体查询,区分不同屏幕宽度。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| @media screen and (max-width: 768px) { .col-sm-1 {width: 8.33%;} .col-sm-2 {width: 16.66%;} .col-sm-3 {width: 25%;} .col-sm-4 {width: 33.33%;} .col-sm-5 {width: 41.66%;} .col-sm-6 {width: 50%;} .col-sm-7 {width: 58.33%;} .col-sm-8 {width: 66.66%;} .col-sm-9 {width: 75%;} .col-sm-10 {width: 83.33%;} .col-sm-11 {width: 91.66%;} .col-sm-12 {width: 100%;} }
@media screen and (min-width: 768px) { .col-md-1 {width: 8.33%;} .col-md-2 {width: 16.66%;} .col-md-3 {width: 25%;} .col-md-4 {width: 33.33%;} .col-md-5 {width: 41.66%;} .col-md-6 {width: 50%;} .col-md-7 {width: 58.33%;} .col-md-8 {width: 66.66%;} .col-md-9 {width: 75%;} .col-md-10 {width: 83.33%;} .col-md-11 {width: 91.66%;} .col-md-12 {width: 100%;} }
|
HTML
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| <div class="grid-container"> <div class="row"> <div class="col-md-4 col-sm-6"><p></p></div> <div class="col-md-4 col-sm-6"><p></p></div> <div class="col-md-4 col-sm-12"><p></p></div> </div> <div class="row"> <div class="col-md-3 col-sm-3"><p></p></div> <div class="col-md-6 col-sm-6"><p></p></div> <div class="col-md-3 col-sm-3"><p></p></div> </div> <div class="row"> <div class="col-md-1 col-sm-2"><p></p></div> <div class="col-md-1 col-sm-2"><p></p></div> <div class="col-md-2 col-sm-8"><p></p></div> <div class="col-md-2 col-sm-3"><p></p></div> <div class="col-md-6 col-sm-3"><p></p></div> </div> </div>
|