剛開始用Bootstrap的格子系統寫佈局的時候遇到了這樣一個問題:css
個人頁面中有這樣一個佈局bootstrap
我但願當屏幕的寬度小於他們倆寬度之和的時候,右邊的部分會掉下來,他們垂直襬放。佈局
而我用col-xs-6的話,右邊的盒子永遠都不會掉下來。ui
文字就變得這麼醜。spa
若是我用col-sm-6的話,右邊的盒子又會太早掉下來。3d
此時的屏幕寬度是766px,他就已經堆疊排放了,兩邊留下了大片空白,仍是很醜。code
而Bootstarp沒有提供中間的選項了。blog
想要解決這個問題,必需要弄清楚這種響應式佈局的是如何工做的。get
Bootstarp將這種機制成爲Grid system。源碼
思想:
將屏幕劃分紅相等大小的格子,通常劃分紅12,24,或32份。Bootstrap選擇默認劃分紅12份。
<div class="container"> <div class="row"> <div class="col-xs-3 col-md-4 col-sm-6 col-lg-2">col-xs-3 col-sm-6 col-md-4 col-lg-2</div> <div class="col-xs-3 col-md-8 col-sm-6 col-lg-10">col-xs-3 col-sm-6 col-md-8 col-lg-10</div> </div> </div>
當
因此他的源碼應該是這樣的:
//其餘.col-xs- .col-xs-3 { width: 25%; } //其餘.col-xs- 全部xs { float:left; } @media (min-width: 768px){ 全部sm { float:left; } //其餘.col-sm- .col-sm-6 { width: 50%; } //其餘.col-sm- } @media (min-width: 992px){ 全部md { float:left; } //其餘.col-md .col-md-8{ width: 66.66666667%; } //其餘.col-md } @media (min-width: 1200px){ 全部lg { float:left; } //其餘.col-lg- .col-lg-10 { width: 83.33333333%; } //其餘.col-lg- } 順序不能改變,由於boostrap3的原則就是mobile first。
col-xs-*永遠都是單行是由於,他的width和float都不定義在@media裏面,無論屏幕怎麼變,他都有本身的寬度和浮動。
因此,若是我想要讓屏幕小於450px時兩個盒子堆疊排列的話,我須要讓xs失去本身的寬度。
@media(max-width: 450px){ .col-xs-6 { width: 100%; } }
添加一個這樣的代碼,我想要的效果就能夠實現了。
其餘原理:
1.列的劃分和嵌套是用百分比+浮動實現的。
.col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { float: left; } .col-md-12 { width: 100%; } .col-md-11 { width: 91.66666667%; } .col-md-10 { width: 83.33333333%; } .col-md-9 { width: 75%; } .col-md-8 { width: 66.66666667%; } .col-md-7 { width: 58.33333333%; } .col-md-6 { width: 50%; } .col-md-5 { width: 41.66666667%; } .col-md-4 { width: 33.33333333%; } .col-md-3 { width: 25%; } .col-md-2 { width: 16.66666667%; } .col-md-1 { width: 8.33333333%; }
2.列與列之間的間距是由每一列(column)的padding實現的,最兩邊的列的padding由(.row)的負margin抵消:
.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { position: relative; min-height: 1px; padding-right: 15px; padding-left: 15px; } .row { margin-right: -15px; margin-left: -15px; }
3.列偏移是經過在列的左邊添加margin實現的。
.col-md-offset-12 { margin-left: 100%; } .col-md-offset-11 { margin-left: 91.66666667%; } .col-md-offset-10 { margin-left: 83.33333333%; } .col-md-offset-9 { margin-left: 75%; } .col-md-offset-8 { margin-left: 66.66666667%; } .col-md-offset-7 { margin-left: 58.33333333%; } .col-md-offset-6 { margin-left: 50%; } .col-md-offset-5 { margin-left: 41.66666667%; } .col-md-offset-4 { margin-left: 33.33333333%; } .col-md-offset-3 { margin-left: 25%; } .col-md-offset-2 { margin-left: 16.66666667%; } .col-md-offset-1 { margin-left: 8.33333333%; } .col-md-offset-0 { margin-left: 0; }
4..col-md-push-*和 .col-md-pull-*是經過設置relative定位的盒子的left和right實現的。
.col-md-pull-12 { right: 100%; } .col-md-pull-11 { right: 91.66666667%; } .col-md-pull-10 { right: 83.33333333%; } .col-md-pull-9 { right: 75%; } .col-md-pull-8 { right: 66.66666667%; } .col-md-pull-7 { right: 58.33333333%; } .col-md-pull-6 { right: 50%; } .col-md-pull-5 { right: 41.66666667%; } .col-md-pull-4 { right: 33.33333333%; } .col-md-pull-3 { right: 25%; } .col-md-pull-2 { right: 16.66666667%; } .col-md-pull-1 { right: 8.33333333%; } .col-md-pull-0 { right: 0; } .col-md-push-12 { left: 100%; } .col-md-push-11 { left: 91.66666667%; } .col-md-push-10 { left: 83.33333333%; } .col-md-push-9 { left: 75%; } .col-md-push-8 { left: 66.66666667%; } .col-md-push-7 { left: 58.33333333%; } .col-md-push-6 { left: 50%; } .col-md-push-5 { left: 41.66666667%; } .col-md-push-4 { left: 33.33333333%; } .col-md-push-3 { left: 25%; } .col-md-push-2 { left: 16.66666667%; } .col-md-push-1 { left: 8.33333333%; } .col-md-push-0 { left: 0; }
知道了這些原理,也就知道了他的功能和侷限,也就能夠改動任何地方,讓他爲你效勞了。
應用:
若是想要讓中屏幕切換到平板屏幕以後,佈局從三列變成兩列,能夠寫成:
<div class="row">
<div class="col-sm-6 col-md-4">1</div>
<div class="col-sm-6 col-md-4">2</div>
<div class="col-sm-6 col-md-4">3</div>
<div class="col-sm-6 col-md-4">4</div>
<div class="col-sm-6 col-md-4">5</div>
<div class="col-sm-6 col-md-4">6</div>
</div>
效果:
參考:http://getbootstrap.com/css/#grid