經過BootStrap 官網能夠更加詳細地瞭解響應式網格是如何實現的,一般主體部分由如下構成:
css
按理來講,咱們可使用等寬的列或不等寬列來劃分網格,這要決定於咱們的網頁複雜程度,通常都是使用等寬列,更加靈活和實用,像Bootstrap框架,經過元素所佔的列數很方便計算出元素的寬度。html
如上圖,咱們可使用8欄、10欄、12欄均可以,一般取決於設計圖的佈局類型和內容,如一列、兩列、三列布局等,若是不清楚佈局類型和內容的話,通常使用靈活的12欄佈局。
bootstrap
隨着用戶代理的大小變化,列寬和間距須要在斷點處breakpoint作出相應的改變以獲得更好的視覺體驗。
列寬使用百分數,而間距gutter固定的大小px或rem。如Bootstrap框架
/* Bootstrap */ .col-md-4 { width: 33.33333%; padding-left: 15px; padding-right: 15px; float: left; }
使用預約類col-*(HTML grid systems),直接在html結構裏添加ide
<div class="row"> <div class="col-md-8 col-lg-6"></div> <div class="col-md-4 col-lg-6"></div> </div>
不使用預約義類(CSS grid systems)佈局
<div class="content"></div> <div class="sidebar"></div>
使用第二種維護性好,應用性更強,當需求更改的時候,不用直接更改HTML的類名。詳細點擊這裏響應式的話,應該使用相對單位rem
或em
替代px
。flex
.l-guest-article { @include clearfix; .l-main { margin-top: 20px; @media (min-width: 700px) { width: percentage(8/12); margin-top: 0; float: left; } } .l-sidebar { margin-top: 20px; @media (min-width: 700px) { width: percentage(8/12); float: right; } } }
下面開始構建響應式網格系統,理解Boostrap網格系統是如何實現的。
在開始構建容器以前,須要對全部容器設置box-sizing
屬性,以避免後期設置邊框或間距的時候影響了元素的大小。ui
html { box-sizing: border-box; } *, *:before, *:after { box-sizing: inherit; }
.grid-container { width: 100%; max-width: 1200px; /*這裏根據實際狀況是否設置*/ margin-right: auto; margin-left: auto; }
由於對每一列設置了浮動,因此容器row須要清理浮動。flexbox
/*-- our cleafix hack -- */ .row:before, .row:after { content:""; display: table ; clear:both; }
這裏的列寬度,取決於你設定的網格欄數,如6欄,則每一欄大約爲1/6。此處沒有減去gutter的大小。設計
[class*='col-'] { float: left; min-height: 1px; width: 16.66%; }
若是要預約義多個類的話,相似Bootstrap這樣
.col-1{ width: 16.66%; } .col-2{ width: 33.33%; } .col-3{ width: 50%; } .col-4{ width: 66.664%; } .col-5{ width: 83.33%; } .col-6{ width: 100%; }
margin-right(須要額外處理最後一個邊距的問題)
/* For a 3-column grid */ .grid-item:nth-child(3n+3) { margin-right: 0; float: right; }
padding-right(形成最後一個元素的寬度比前面的小,由於設置了box-sizing: border;)
marging-left 和 margin-right(須要使用calc減去gutter的大小)
.grid-item { width: calc((100% - 20px * 3) / 3); margin-right: 10px; margin-left: 10px; float: left; }
padding-left 和 padding-right,須要在HTML結構列加入額外子元素。
<div class="row"> <div class="col-md-4 col-sm-6"><div class="inner"></div></div> <div class="col-md-4 col-sm-6"><div class="inner"></div></div> <div class="col-md-4 col-sm-12"><div class="inner"></div></div> </div> [class*="col-"] { padding-left: 10px; padding-right: 10px; }
經過設置利用media設置斷點
這裏沒有使用預約義類。
.l-guest-article { @include clearfix; .l-guest { @media (min-width: 700px) { width: percentage(4/12); float: left; } @media (min-width: 1200px) { width: percentage(2/12); } } .l-main { margin-top: 20px; @media (min-width: 700px) { width: percentage(8/12); margin-top: 0; float: left; } @media (min-width: 1200px) { width: percentage(7/12); } } .l-sidebar { margin-top: 20px; @media (min-width: 700px) { width: percentage(8/12); float: right; } @media (min-width: 1200px) { width: percentage(3/12); margin-top: 0; } } }
使用預約義類,同樣的道理經過媒體查詢,而後把須要的類添加到HTML結構便可。
@media all 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%; } }