这篇文章全面的为大家解析了 bootstrap 格子布局的相关资料,感兴趣的朋友可以参考一下
Bootstrap 是 Twitter 推出的一个开源的用于前端开发的工具包。它由 Twitter 的设计师 Mark Otto 和 Jacob Thornton 合作开发,是一个 CSS/html 框架。Bootstrap 提供了优雅的 HTML 和 CSS 规范,它即是由动态 CSS 语言 Less 写成。Bootstrap 一经推出后颇受欢迎,一直是 GitHub 上的热门开源项目,包括 NASA 的 MSNBC(微软全国广播公司)的 Breaking News 都使用了该项目。
一、源码文件
_grid.scss:格子系统类文件
Mixins/_grid.scss:支持格子系统实现的 mixin 集合
Mixins/_grid-framework.scss:格子系统实现的核心 mixin
二、支持的功能
1. 实现按百分比布局
2. 实现格子的定位
3. 实现格子的嵌套
4. 如果只使用格子系统,可以只编码 bootstrap-grid.scss 文件
三、实现原理
1、 按百分比布局,主要思考的问题如何在不同的设备上平均分配的宽度,bootstrap 只是用了简单的百分比,在任何尺寸设备下都是使用相同的百分比。
2、 格子的定位:解决了格子向左移动、向右移动、以格子向右偏移几个单元格的能力
3、 格子的嵌套:实现了格子内容再嵌套格子布局系统。
四、源码分析
1、_grid.scss:格子系统生成的主类,引用了 mixins/_grid.scss、mixins/_grid-framework.scss、variables.scss 类中的变量及相关方法。
首先:定义两个容器类
a) container:格子容器,根据不同设备定义不同的宽度,不会充满全屏;
b) continaer-fluid:格子容器,在任何支持下都会充满全屏
container 和 container-fluid 都使用了 make-container(mixins/_grid.scss),make-container 只实现了居中、左右内边距、清除浮动等控制;其中 container 根据不同设备定义了容器的宽度
然后:定义 row(行):
调用了 make-row(mixins/_grids.scss)实现清除浮动、左右外边距的定义,在 4.0 中,如果开启了 flex 布局的支持,就设定容器的 display 为 flex 和 flex-wrap 为 wrap,并去掉清浮动。
再则:直接调用 make-grid-columns(mixins/_grid-framework.scss)实现单元格的建立
a) make-grid-columns:单元格生成的入口方法,传递所能支持的格子总数、外边距宽度、所支持的几种尺寸
b) make-grid-columns 引用了 mixins/_grid.scss 中的许多方法:
a) 用到了 map 的 map-key 函数,用于遍历一个 map 的 key 集合;
用到了 @extend 函数,用于继承,实现所有 col 左浮动,以及所有 col 都相对定位。
- @
- for $i from 1 through $columns {.col - # {
- $breakpoint
- } - # {
- $i
- } {@extend % grid - column; //extend是继承,将此合并为一个样式集合
- //.col-xs-1,col-xs-2{ positiona:relative; .... }
- }
- }
a) Make-col-span 函数,实现 col 宽度的计算
b) 调用 mixins/_grid.scss 中的 make-col-modifier 方法,实现 push、pull、offset 的样式的生成:
i. Push:向右推几个格子,用的是 left
ii. Pull:向左推几个格子,用的是 right
iii. Offset:利用的是 margin-left 实现,向右推向个百分比。
- @mixin make-col-offset($size, $columns: $grid-columns) {
- margin-left: percentage($size / $columns);
- }
- @mixin make-col-push($size, $columns: $grid-columns) {
- left: if($size > 0, percentage($size / $columns), auto);
- }
- @mixin make-col-pull($size, $columns: $grid-columns) {
- right: if($size > 0, percentage($size / $columns), auto);
- }
- @mixin make-col-modifier($type, $size, $columns) {
- // Work around the lack of dynamic mixin @include support
- @if $type == push {
- @include make-col-push($size, $columns);
- } @else if $type == pull {
- @include make-col-pull($size, $columns);
- } @else if $type == offset {
- @include make-col-offset($size, $columns);
- }
- }
来源: http://www.phperz.com/article/17/0223/265557.html