经过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%; } }