移动设备优先
- Bootstrap 3将对移动设备的友好支持直接融合进了框架的内核中,Bootstrap是移动设备优先的。
- 为了确保适当的绘制和触屏缩放,需要在head中添加viewport元数据标签。设置 meta 属性为
user-scalable=no
可以禁用视口缩放。 - <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
布局容器
- Bootstrap 需要为页面内容和栅格系统包裹一个
.container
容器。.container
类用于固定宽度;.container-fluid
类(流式布局容器)用于 100% 宽度。两个类不能互相嵌套。
栅格系统
- 随着屏幕或视口(viewport)尺寸的增加,系统会自动分为最多12列,用于通过一系列的行(row)与列(column)的组合来创建页面布局,网页中的内容就可以放在创建好的栅格系统中。
- “行(row)”必须包含在
.container
(固定宽度)或.container-fluid
(100% 宽度)中。 - lg--large,表示大的;md--middle,表示中等的;sm--small,表示小的;xs--extra small,表示特小的。
<div class="container"> <div class="row"> <div class="col-lg-1 col-md-3 con ">col-lg-1 </div> <div class="col-lg-1 col-md-3 con">col-lg-1 </div> </div> </div>
- 内容应当放置于“列(column)”内,并且,只有“列(column)”可以作为行(row)”的直接子元素。通过为“列(column)”设置
padding
属性,从而创建列与列之间的间隔(gutter)。 - 如果一“行(row)”中包含了的“列(column)”大于 12,多余的“列(column)”所在的元素将被作为一个整体另起一行排列。
媒体查询
/* 超小屏幕(手机,小于 768px) */
/* 没有任何媒体查询相关的代码,因为这在 Bootstrap 中是默认的(还记得 Bootstrap 是移动设备优先的吗?) */
/* 小屏幕(平板,大于等于 768px) */
@media (min- @screen-sm-min) { ... }
/* 中等屏幕(桌面显示器,大于等于 992px) */
@media (min- @screen-md-min) { ... }
/* 大屏幕(大桌面显示器,大于等于 1200px) */
@media (min- @screen-lg-min) { ... }
偶尔也会在媒体查询代码中包含 max-width
从而将 CSS 的影响限制在更小范围的屏幕大小之内。
@media (max-width: @screen-xs-max) { ... }
@media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) { ... }
@media (min-width: @screen-md-min) and (max-width: @screen-md-max) { ... }
@media (min-width: @screen-lg-min) { ... }
水平排列
<div class="row"> <div class="col-md-1 con">.col-md-1</div> <div class="col-md-1">.col-md-1</div> <div class="col-md-1">.col-md-1</div> <div class="col-md-1">.col-md-1</div> <div class="col-md-1">.col-md-1</div> <div class="col-md-1">.col-md-1</div> <div class="col-md-1">.col-md-1</div> <div class="col-md-1">.col-md-1</div> <div class="col-md-1">.col-md-1</div> <div class="col-md-1">.col-md-1</div> <div class="col-md-1">.col-md-1</div> <div class="col-md-1">.col-md-1</div> </div>
- 可以为每个div设置一个class从而设置css属性,如.con
-
col-md-1中的屏幕的列,1/12列。将屏幕分为12列
- 如果不希望所有列在小屏幕上都堆叠在一起,可以使用针对超小屏幕和中等屏幕定义的类
.col-xs-*
和.col-md-*
- 为了使用内置的栅格系统将内容再次嵌套,可以通过添加一个新的
.row
元素和一系列.col-sm-*
元素到已经存在的.col-sm-*
元素内。
响应式列重置
- 在某些阈值时,某些列可能会出现比别的列高的情况。为了克服这一问题,建议联合使用
.clearfix
和 响应式工具类。(用于在分界点清除响应) - 除了列在分界点清除响应, 您可能需要 重置偏移, 后推或前拉某个列。在特定的断点处重置偏移,推动和拉动。
列偏移
- 使用
.col-md-offset-*
类可以将列向右侧偏移。这些类实际是通过使用*
选择器为当前元素增加了左侧的边距(margin)。例如,.col-md-offset-4
类将.col-md-4
元素向右侧偏移了4个列(column)的宽度。
嵌套列
- 为了使用内置的栅格系统将内容再次嵌套,可以通过添加一个新的
.row
元素和一系列.col-sm-*
元素到已经存在的.col-sm-*
元素内。被嵌套的行(row)所包含的列(column)的个数不能超过12(不一定占满12列)。
列排序
- 通过使用
.col-md-push-*
和.col-md-pull-*
类就可以改变列(column)的顺序。
Less mixin 和变量
- 通过变量来定义列数、槽(gutter)宽、媒体查询阈值(用于确定合适让列浮动)。我们使用这些变量生成预定义的栅格类,如上所示,还有如下所示的定制 mixin。
@grid-columns: 12;
@grid-gutter- 30px;
@grid-float-breakpoint: 768px;
-
mixin
mixin 用来和栅格变量一同使用,为每个列(column)生成语义化的 CSS 代码。
- 官方源码
// Creates a wrapper for a series of columns
.make-row(@gutter: @grid-gutter-width) {
// Then clear the floated columns
.clearfix();
@media (min- @screen-sm-min) {
margin-left: (@gutter / -2);
margin-right: (@gutter / -2);
}
// Negative margin nested rows out to align the content of columns
.row {
margin-left: (@gutter / -2);
margin-right: (@gutter / -2);
}
}
// Generate the extra small columns
.make-xs-column(@columns; @gutter: @grid-gutter-width) {
position: relative;
// Prevent columns from collapsing when empty
min-height: 1px;
// Inner gutter via padding
padding-left: (@gutter / 2);
padding-right: (@gutter / 2);
// Calculate width based on number of columns available
@media (min- @grid-float-breakpoint) {
float: left;
percentage((@columns / @grid-columns));
}
}
// Generate the small columns
.make-sm-column(@columns; @gutter: @grid-gutter-width) {
position: relative;
// Prevent columns from collapsing when empty
min-height: 1px;
// Inner gutter via padding
padding-left: (@gutter / 2);
padding-right: (@gutter / 2);
// Calculate width based on number of columns available
@media (min- @screen-sm-min) {
float: left;
percentage((@columns / @grid-columns));
}
}
// Generate the small column offsets
.make-sm-column-offset(@columns) {
@media (min- @screen-sm-min) {
margin-left: percentage((@columns / @grid-columns));
}
}
.make-sm-column-push(@columns) {
@media (min- @screen-sm-min) {
left: percentage((@columns / @grid-columns));
}
}
.make-sm-column-pull(@columns) {
@media (min- @screen-sm-min) {
right: percentage((@columns / @grid-columns));
}
}
// Generate the medium columns
.make-md-column(@columns; @gutter: @grid-gutter-width) {
position: relative;
// Prevent columns from collapsing when empty
min-height: 1px;
// Inner gutter via padding
padding-left: (@gutter / 2);
padding-right: (@gutter / 2);
// Calculate width based on number of columns available
@media (min- @screen-md-min) {
float: left;
percentage((@columns / @grid-columns));
}
}
// Generate the medium column offsets
.make-md-column-offset(@columns) {
@media (min- @screen-md-min) {
margin-left: percentage((@columns / @grid-columns));
}
}
.make-md-column-push(@columns) {
@media (min- @screen-md-min) {
left: percentage((@columns / @grid-columns));
}
}
.make-md-column-pull(@columns) {
@media (min- @screen-md-min) {
right: percentage((@columns / @grid-columns));
}
}
// Generate the large columns
.make-lg-column(@columns; @gutter: @grid-gutter-width) {
position: relative;
// Prevent columns from collapsing when empty
min-height: 1px;
// Inner gutter via padding
padding-left: (@gutter / 2);
padding-right: (@gutter / 2);
// Calculate width based on number of columns available
@media (min- @screen-lg-min) {
float: left;
percentage((@columns / @grid-columns));
}
}
// Generate the large column offsets
.make-lg-column-offset(@columns) {
@media (min- @screen-lg-min) {
margin-left: percentage((@columns / @grid-columns));
}
}
.make-lg-column-push(@columns) {
@media (min- @screen-lg-min) {
left: percentage((@columns / @grid-columns));
}
}
.make-lg-column-pull(@columns) {
@media (min- @screen-lg-min) {
right: percentage((@columns / @grid-columns));
}
}
- 可以通过修改这些值,定制自己想要的布局
- 实例:利用默认设置生成两列布局(列之间有间隔)的案例。
.wrapper {
.make-row();
}
.content-main {
.make-lg-column(8);
}
.content-secondary {
.make-lg-column(3);
.make-lg-column-offset(1);
}
<div class="wrapper"> <div class="content-main">...</div> <div class="content-secondary">...</div> </div>