bootstrap栅格系统分析

bootstrap栅格系统

bootstrap栅格系统是bootstrap的核心以及精髓所在

一、容器

  • 1.流体容器
    • 流体容器宽度为100%(即占当前视口的宽度)
  • 2.固定容器
    大于等于1200(lg 大屏pc) : 1170(1140+槽宽)
    大于等于992(md 中屏pc) : 小于1200:970(940+槽宽)
    大于等于768(sm 平板 ): 小于992:750(720+槽宽)
    小于768(xs 移动手机) : auto

二、栅格系统的应用

1. 栅格参数

类别 超小屏幕 手机 (<768px) 小屏幕 平板 (≥768px) 中等屏幕 桌面显示器 (≥992px) 大屏幕 大桌面显示器 (≥1200px)
栅格系统行 总是水平排列 开始是堆叠在一起的,当大于这些阈值时将变为水平排列 开始是堆叠在一起的,当大于这些阈值时将变为水平排列 开始是堆叠在一起的,当大于这些阈值时将变为水平排列
.container 最大宽度 None 750px 970px 1170px
类前缀 .col-xs- .col-sm- .col-md- .col-lg-
列数(column) 12 12 12 12
最大列宽 自动 ~62px ~81px ~97px
槽(gutter)宽 30px (每列左右均有 15px) 30px 30px 30px
可嵌套
偏移(Offsets)
列排序

2. 栅格组合

利用栅格系统在不同设备状态下页面布局有不同的提现

例如

<div class="col-lg-10 col-md-6">col-lg-10</div>
<div class="col-lg-2 col-md-6">col-lg-2</div>

3. 列偏移和列排序

列排序

通过使用 .col-xx-push-y和 .col-xx-pull-y类就可以很容易的改变列(column)的顺序。

实际上在控制元素left值

例如

<div class="row">
  <div class="col-md-9 col-md-push-3">.col-md-9 .col-md-push-3</div>
  <div class="col-md-3 col-md-pull-9">.col-md-3 .col-md-pull-9</div>
</div>

列偏移

.col-xx-offset-y 类可以将列向右侧偏移
实际上在控制元素margin-left的值

例如

<div class="row">
  <div class="col-md-9 col-md-push-3">.col-md-9 .col-md-push-3</div>
  <div class="col-md-3 col-md-pull-9">.col-md-3 .col-md-pull-9</div>
</div>

4. 响应式工具的使用

利用.visible-xx 和 .hidden-xx 控制元素在该xx设备上的显示与隐藏

<!--该元素在视口小于768px的情况下隐藏-->
<div class="jumbotron hidden-xs">
<h1>Hello, world!</h1>
</div>
<!--该元素在视口小于768px的情况下显示-->
<div class="jumbotron visible-xs">
<h1>Hello, world!</h1>
</div>

5. 栅格盒模型设计的精妙之处

容器两边具有15px的padding

目标 规则
两边具有15px的padding
两边具有-15px的margin
  • 为了维护槽宽的规则,
    • 列两边必须得要15px的padding
  • 为了能使列嵌套行
    • 行两边必须要有-15px的margin
  • 为了让容器可以包裹住行
    • 容器两边必须要有15px的padding

三、栅格系统源码解析

1.基本实现的流程

  • 固定和流体容器的公共样式在less混合中的代码

注:@grid-gutter-widt:槽宽

/*@gutter在bootstrap里默认为30px*/
.container-fixed(@gutter: @grid-gutter-width) {
  margin-right: auto;
  margin-left: auto;
  padding-left:  floor((@gutter / 2)); //向下取整 (此时默认值为15px)
  padding-right: ceil((@gutter / 2));  //向上取整 (此时默认值为15px)
  &:extend(.clearfix all); //继承清除浮动的样式
}
/*.clearfix的样式*/
.clearfix() {
  &:before,
  &:after {
    content: " "; // 1
    display: table; // 2
  }
  &:after {
    clear: both;
  }
}
  • 固定容器和流体容器的样式在less实际中的代码
.container {
  .container-fixed();//继承默认样式
  //利用媒体查询判断当前应当采用的宽度
  //移动优先!
  @media (min-width: @screen-sm-min) {
    width: @container-sm;
  }
  @media (min-width: @screen-md-min) {
    width: @container-md;
  }
  @media (min-width: @screen-lg-min) {
    width: @container-lg;
  }
}
//流体容器
.container-fluid {
  .container-fixed();
}
  • 行元素默认样式在less混合中的代码
.make-row(@gutter: @grid-gutter-width) {
  margin-left:  ceil((@gutter / -2));
  margin-right: floor((@gutter / -2));
  &:extend(.clearfix all);
}
  • 行元素样式在less中的代码
.row {
  .make-row();
}
  • 列元素样式在less中实际的代码
// 列的默认样式
.make-grid-columns();
// 判断当前视口的大小采用不同的样式
//移动优先!
.make-grid(xs);
@media (min-width: @screen-sm-min) {
  .make-grid(sm);
}
@media (min-width: @screen-md-min) {
  .make-grid(md);
}
@media (min-width: @screen-lg-min) {
  .make-grid(lg);
}

2.核心代码

  • 列元素样式的初步实现
//列元素的默认样式实现
.make-grid-columns() {
   //此时@index为1
  .col(@index) { 
    @item: ~".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}";
    // @item: ~".col-xs-1, .col-sm-1, .col-md-1, .col-lg-1";//不编译
    .col((@index + 1), @item);
    // .col(2,  ~".col-xs-1, .col-sm-1, .col-md-1, .col-lg-1");
  }
//利用递归循环创建所有列元素的样式
//@grid-columns默认为12 @list为@item的集合
.col(@index, @list) when (@index =< @grid-columns) {
//当@index=<12时执行以下代码
    @item: ~".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}";
    //此时index为2则
    //@item: ~".col-xs-2, .col-sm-2, .col-md-2, .col-lg-2";
    .col(3, ~".col-xs-1, .col-sm-1, .col-md-1, 
    .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2");
    //因为3<=12则继续执行递归
    //由此可以当递归完成时
    @list:.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-12, .col-sm-12, .col-md-12, .col-lg-12
}
//当@index>12时执行下面的代码
//以上代码完成时递归完成时index>13
//执行以下代码
  .col(@index, @list) when (@index > @grid-columns) { 
    @{list} {
      position: relative;
      min-height: 1px;
      padding-left:  ceil((@grid-gutter-width / 2));
      padding-right: floor((@grid-gutter-width / 2));
    }
    //由于此时@list状态已经完成则以下代码为
    //.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-12, .col-sm-12, .col-md-12, .col-lg-12{
     // position: relative;
      //min-height: 1px;
      //padding-left:  ceil((@grid-gutter-width / 2));
      //padding-right: floor((@grid-gutter-width / 2));
    //}
    //完成所有列的状态的默认值
    //及.make-grid-columns()完成所有列的状态的默认样式 
  }
  //传入默认值1
  .col(1); 
}
  • 列元素具体样式的实现
.make-grid(@class) {
  //1.写入所有列的默认值
  .float-grid-columns(@class);
  //2.规定个个列的宽度
  .loop-grid-columns(@grid-columns, @class, width);
  //3.列排列控制的是目标元素的left或right的值由于值不能为0所以分开操作
  //3.1列向右排列
  .loop-grid-columns(@grid-columns, @class, pull);
  //3.2列向右排列
  .loop-grid-columns(@grid-columns, @class, push);
  //4.设置列偏移 控制的是margin-left;
  .loop-grid-columns(@grid-columns, @class, offset);
}
  • 写入所有列的默认值
//@class 为 xs,sm,md,lg
//下面的代码里@class的值设为xs
.float-grid-columns(@class) {
  .col(@index) { 
    @item: ~".col-@{class}-@{index}";
    //@item:~".col-xs-1";
    .col((@index + 1), @item);
    //.col(2, ~".col-xs-1");
  }
  //同样利用递归循环index至12完成对每个@class列的属性
  .col(@index, @list) when (@index =< @grid-columns) { 
    @item: ~".col-@{class}-@{index}";
    //@item: ~".col-xs-2";
    .col((@index + 1), ~"@{list}, @{item}");
    //.col(3, ~".col-xs-1, .col-xs-2");
    //递归完成时@list为:
    //.col-xs-1, .col-xs-2,...,.col-xs-12
  }
  //当递归完成时执行下面的代码
  .col(@index, @list) when (@index > @grid-columns) { 
    @{list} {
      float: left;
    }
    //以上代码及为
    //.col-xs-1, .col-xs-2,...,.col-xs-12{
     //float: left;
    //}
  //}
  //填入@index的默认值1
  .col(1); 
}
  • 设置宽度列排列和列偏移的入口代码
//由于当前状态下index为12则从12开始递归至0
//@index索引 @class栅格类 @type 要进行操作的属性
.loop-grid-columns(@index, @class, @type) when (@index >= 0) {
  .calc-grid-column(@index, @class, @type);
  .loop-grid-columns((@index - 1), @class, @type);
}
  • 规定个个列的宽度
//当@type = width时执行的代码
.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {
  .col-@{class}-@{index} {
    width: percentage((@index / @grid-columns));
  }
}
//以上代码可以表示为
.loop-grid-columns(@index, @class, @type) when (@index >= 0) {
  .calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {
  .col-@{class}-@{index} {
    width: percentage((@index / @grid-columns));
  }
  //.col-xs-12 {
  //   width: percentage(12/12));//将数值转换为百分比
  //}
  
}
  .loop-grid-columns((@index - 1), @class, @type);
  //再次执行
  //.col-xs-11 {
    //width: percentage(11/12));//将数值转换为百分比
  //}
}
//递归完成后得到的是
//.col-xs-12 {
//    width: percentage(12/12));//将数值转换为百分比
//}
//.col-xs-11 {
//    width: percentage(11/12));//将数值转换为百分比
//}....
//.col-xs-1 {
//    width: percentage(1/12));//将数值转换为百分比
//}
  • 列排列控制
//当@type = push执行如下代码
//@index的递减在.loop-grid-columns(@index, @class, @type) when (@index >= 0) 环境下已经实现
.calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) {
  .col-@{class}-push-@{index} {
    left: percentage((@index / @grid-columns));
  }
  //以上代码生成的值为
  //.col-xs-push-12 {
    //left: percentage(12/12);
  //}
  //.col-xs-push-11 {
    //left: percentage(11/12);
  //}....
  //.col-xs-push-1 {
    //left: percentage(1/12);
  //}
}
//当index为0时执行下面的代码
.calc-grid-column(@index, @class, @type) when (@type = push) and (@index = 0) {
  .col-@{class}-push-0 {
    left: auto;
  }
  //.col-xs-push-0 {
    //left: auto;
  //}
}

//向左偏移生成模式与向右相同
.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index > 0) {
  .col-@{class}-pull-@{index} {
    right: percentage((@index / @grid-columns));
  }
}
.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index = 0) {
  .col-@{class}-pull-0 {
    right: auto;
  }
}
  • 列偏移控制
//当@type = offset时执行如下代码
.calc-grid-column(@index, @class, @type) when (@type = offset) {
  .col-@{class}-offset-@{index} {
    margin-left: percentage((@index / @grid-columns));//值转换为百分比
  }
  //运行结果
  //.col-xs-offset-12 {
    //margin-left: percentage(12/12);
  //}...
  //.col-xs-offset-1 {
    //margin-left: perc/entage(1/12);
  //}
}

原文链接.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,725评论 1 92
  • 选择qi:是表达式 标签选择器 类选择器 属性选择器 继承属性: color,font,text-align,li...
    wzhiq896阅读 1,730评论 0 2
  • 选择qi:是表达式 标签选择器 类选择器 属性选择器 继承属性: color,font,text-align,li...
    love2013阅读 2,301评论 0 11
  • 大家好,我是IT修真院成都分院第7期的学员韩建名,一枚正直纯洁善良的WEB前端程序员。 1.背景介绍 Bootst...
    inh_阅读 750评论 0 2
  • 我们经常会对自己的境况不满意,觉得自己真的已经很努力了,但得到的却少的可怜,而后会找各种理由抱怨现实的残酷,社会的...
    冰蝉思秋阅读 587评论 0 0