bootstrap--栅格系统详解(源码分析)

2023-11-18

目录

1.bootstrap是什么?

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

3.预备知识

4.栅格系统的框架

4.1bootstrap容器

4.1.1固定容器与流体容器公共样式

4.1.2固定容器样式

4.2.bootstrap行与列

4.2.1行

4.2.2列

4.3.bootstrap列排序与列偏移

4.3.1列偏移

4.3.2列排序

5.栅格源码分析


1.bootstrap是什么?

Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架。Bootstrap 是基于 HTML、CSS、JAVASCRIPT 的。

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

容器两边具有15px的padding:为了让容器可以包裹住行

行两边具有-15px的margin:为了能使列嵌套行

列两边具有15px的padding:为了维护槽宽的规则

3.预备知识

1.栅格中容器有两类之分,一类是流体容器,一类是固定容器.

2.固定容器有阈值

表示         阈值 width 适用
  lg 大于等于1200     1170(1140+槽宽30) 大屏pc
 md 大于等于992小于1200 970(940+槽宽30) 中屏pc
 sm 大于等于768小于992 750(920+槽宽30) 平板
 xs 小于等于768 auto 移动手机

注:槽宽可以自定义

4.栅格系统的框架

1.需要容器

2.需要行

3.需要列 (默认一行12列)

代码与案例如下:

<body>
    <!-- 这里是容器 -->
  <div class="container">  
    <!-- 这里是行 -->
     <div class="row">   
        <!-- 这里是列  lg表示阈值  -->
         <div class="col-lg-10">col-lg-10</div>
         <!-- 一行默认12列 -->
         <div class="col-lg-2">col-lg-2</div>
     </div> 
  </div>
</body>

 效果图如下,将一行分为两列,一列占10,一列占2

接下来我们再多增加几行划分不同的列。

<body>
    <!-- 这里是容器 -->
  <div class="container">  
    <!-- 这里是行 -->
     <div class="row">   
        <!-- 这里是列  lg表示阈值  -->
         <div class="col-lg-10">col-lg-10</div>
         <!-- 一行默认12列 -->
         <div class="col-lg-2">col-lg-2</div>

         <div class="col-lg-6">col-lg-6</div>
         <div class="col-lg-6">col-lg-6</div>

         <div class="col-lg-3">col-lg-3</div>
         <div class="col-lg-9">col-lg-9</div>

         <div class="col-lg-8">col-lg-8</div>
         <div class="col-lg-4">col-lg-4</div>
     </div> 
  </div>
</body>

 效果如下:

4.1bootstrap容器

4.1.1固定容器与流体容器公共样式

1.我们在源码中可以grid.less,代码如下

<!--- 固定容器与流体容器的公共样式-->
.container-fixed(@gutter: @grid-gutter-width) {
  padding-right: ceil((@gutter / 2));
  padding-left: floor((@gutter / 2));
  margin-right: auto;
  margin-left: auto;
  &:extend(.clearfix all);
}

2.在 variables.less中我们可以查询到@grid-gutter-width 这就是槽宽30px。

3.接下来我们分析  ,ceil表示向上取整 ,floor表示向下取整,即为15px。

  padding-right: ceil((@gutter / 2));
  padding-left: floor((@gutter / 2));

4.1.2固定容器样式

1.在grid.less中找到固定容器的定义。

.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;
  }
}

2.在 variables.less中我们可以查询到 @screen-sm-min @screen-md-min @screen-lg-min 分别为

720px+槽宽,940px+槽宽,1140px+槽宽。

// Small screen / tablet
@container-tablet:             (720px + @grid-gutter-width);
//** For `@screen-sm-min` and up.
@container-sm:                 @container-tablet;

// Medium screen / desktop
@container-desktop:            (940px + @grid-gutter-width);
//** For `@screen-md-min` and up.
@container-md:                 @container-desktop;

// Large screen / wide desktop
@container-large-desktop:      (1140px + @grid-gutter-width);
//** For `@screen-lg-min` and up.
@container-lg:                 @container-large-desktop;

 

4.2.bootstrap行与列

4.2.1行

1.在grid.less中找到行的定义。

.row {
  .make-row();
}
//  @grid-gutter-width为槽宽 30px
.make-row(@gutter: @grid-gutter-width) {
  margin-right: floor((@gutter / -2));
  margin-left: ceil((@gutter / -2));
  &:extend(.clearfix all);
}

2.经过分析可知margin-right:-15px;

                         margin-left : -15px;

4.2.2列

列的第一步:

1.在grid.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.在grid-framework中找到.make-grid-columns();

.make-grid-columns() {
  .col(@index) { //index 为1
    @item: ~".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}";
    .col((@index + 1), @item);
  }
  .col(@index, @list) when (@index =< @grid-columns) { // general; "=<" isn't a typo
    @item: ~".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}";
    .col((@index + 1), ~"@{list}, @{item}");
  }
  .col(@index, @list) when (@index > @grid-columns) { // terminal
    @{list} {
      position: relative;
      min-height: 1px;
      padding-right: floor((@grid-gutter-width / 2));
      padding-left: ceil((@grid-gutter-width / 2));
    }
  }
  .col(1); // kickstart it
}

3.其中有三个混合,第一个混合调用.col(2,".col-xs-1, .col-sm-1, .col-md-1, .col-lg-1")

  第二个混合为递归,第二个混合调用

.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)

....

.col(13,str)

   str:

            .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

 第三个混合调用,将

.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变成选择器

列的第二步:

1.在grid-framework中找到.make-grid(xs),.make-grid(sm),..make-grid(md),make-grid(lg);

.make-grid(@class) {
  .float-grid-columns(@class);
  .loop-grid-columns(@grid-columns, @class, width);
  .loop-grid-columns(@grid-columns, @class, pull);
  .loop-grid-columns(@grid-columns, @class, push);
  .loop-grid-columns(@grid-columns, @class, offset);
}

2.找到.float-grid-columns  进行分析

.float-grid-columns(@class) {
  .col(@index) { 
    @item: ~".col-@{class}-@{index}";
    .col((@index + 1), @item);
  }
  .col(@index, @list) when (@index =< @grid-columns) { 
    @item: ~".col-@{class}-@{index}";
    .col((@index + 1), ~"@{list}, @{item}");
  }
  .col(@index, @list) when (@index > @grid-columns) {
    @{list} {
      float: left;
    }
  }
  .col(1); // kickstart it
}

3.其中有三个混合,  第二个混合为递归,分别得到 .col-xs-1, .col-xs-2, .col-xs-3, ... .col-xs-12,

 第三个混合调用,将 .col-xs-1, .col-xs-2, .col-xs-3, ... .col-xs-12,变成选择器.

列的第三步:

.loop-grid-columns(@index, @class, @type) when (@index >= 0) {
  .calc-grid-column(@index, @class, @type);
  // next iteration
  .loop-grid-columns((@index - 1), @class, @type);
}
.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {
  .col-@{class}-@{index} {
    width: percentage((@index / @grid-columns));
  }
}

分析:其中index=12,class为学生,type为width的情况,递归结果如下。

.col-xs-12{ width:12/12%} 

.col-xs-11{ width:11/12%} 

.col-xs-10{ width:10/12%} 

...

.col-xs-1{ width:1/12%}         

4.3.bootstrap列排序与列偏移

4.3.1列偏移

.calc-grid-column(@index, @class, @type) when (@type = offset) {
  .col-@{class}-offset-@{index} {
    margin-left: percentage((@index / @grid-columns));
  }
}

4.3.2列排序

.calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) {
  .col-@{class}-push-@{index} {
    left: percentage((@index / @grid-columns));
  }
}
.calc-grid-column(@index, @class, @type) when (@type = push) and (@index = 0) {
  .col-@{class}-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为width时, 不同在于可以取到0,并且取到0时的设置不同。

5.栅格源码分析

1.固定容器与流体容器的公共样式
  padding-right: 15
  padding-left:15
  margin-right: auto;
  margin-left: auto;

2.固定容器特定样式

顺序不可变

 @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;
  }

3.行的固定样式

margin-right:-15px;

 margin-left : -15px;

4.列的固定样式

//列的第一步

.make-grid-columns()----->

    .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-right:15px;
      padding-left: 15px;

}

//列的第二步

.make-grid(xs)--------->

 .float-grid-columns(xs);

 .col-xs-1, .col-xs-2, .col-xs-3, ... .col-xs-12{

 float: left;

}

//列的第三步

  .loop-grid-columns(@grid-columns, @class, width)----->

.col-xs-12{ width:12/12%} 

.col-xs-11{ width:11/12%} 

.col-xs-10{ width:10/12%} 

...

.col-xs-1{ width:1/12%} 

  .loop-grid-columns(@grid-columns, @class, pull);

  .loop-grid-columns(@grid-columns, @class, push);

  .loop-grid-columns(@grid-columns, @class, offset);

}

5.列偏移的样式

.col-xs-offset-12{margin-left:12/12}

.col-xs-offset-11{margin-left:11/12}

.col-xs-offset-10{margin-left:10/12}

...

.col-xs-offset-1{margin-left:1/12}

.col-xs-offset-0{margin-left:0}

6.列排序的样式

push pull
.col-xs-push-12{ left:12/12%}  .col-xs-pull-12{ right:12/12%} 
.col-xs-push-11{ left:11/12%}  .col-xs-pull-11{ right:11/12%} 
.col-xs-push-10{ left:10/12%}  .col-xs-pull-10{ right:10/12%} 
... ...
.col-xs-push-1{ left:1/12%}  .col-xs-pull-1{ right:1/12%} 
.col-xs-push-0{ left:auto}  .col-xs-pull-0{ right:auto} 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

bootstrap--栅格系统详解(源码分析) 的相关文章

  • React Native TypeError:无法读取未定义的属性“createClient”

    我是 React 本机框架的新手 我使用 create react native app AwesomeProject 创建了应用程序 我想在我的项目中使用 BLE 因此我安装了 react native ble plx 模块 但是当我创建
  • 尝试注册 RCTBridgeModule 类 RCTFileReaderModule

    尝试为名称 FileReaderModule 注册 RCTBridgeModule 类 RCTFileReaderModule 但该名称已由类 FileReaderModule 注册 尝试使用命令react native run ios在i
  • 未捕获的类型错误:无法读取未定义的属性“prop”

    我有 6 个输入复选框 如果选中的复选框超过 3 个 则最后一个复选框将被取消选中 为了更好地理解 请参阅我之前的question https stackoverflow com questions 35195235 if checkbox
  • Swift - 将图像插入 PDF 不再适用于 iOS 13

    目前正在开发在我的贷款计算器应用程序上导出 PDF 的功能 我有一个预览屏幕 可以在您保存 PDF 之前显示它 预览屏幕由带有 html 的 webView 组成 其中包含占位符 我能够成功地将图像插入到正确的占位符上 并将其显示在 PDF
  • 修剪日期格式 PrimeNG 日历 - 删除时间戳、角度反应形式

    我将以下内容推入我的反应形式 obj 中2016 01 01T00 00 00 000Z但我想要以下2016 01 01 有谁知道有一个内置函数可以实现上述目的 我已经搜索过文档here https www primefaces org p
  • 从 html5

    我正在寻找一种方法来根据用户代理字符串将控件属性添加到视频标签 我不希望在 iPad 和 Android 之外的任何浏览器或设备上出现控件属性 所以我认为用户代理是最好的识别方法 因为 ipad 和 android 一词出现在各自的 UA
  • 如何避免 TypeScript 中出现虚假的“未使用参数”警告

    我遇到过很多次这种情况 最后决定弄清楚正确的方法是什么 如果我有一个声明方法的抽象父类 然后一些具体子类在其实现中实现真正的逻辑 并且显然使用方法参数 但某些子类不需要在该方法中执行任何操作 因此不要使用方法参数 那些不必执行任何操作的方法
  • 动态更改 vuejs 2 中的选择输入选项

    如何动态更改选择下拉 v model 中的选项 我有 2 个选择输入 其中一个应该根据其他输入进行更改 例如 如果我选择 水果 则选择显示水果 如果我选择 蔬菜 则选择显示蔬菜 我不使用Vuejs 但查看文档后 var TypesArr F
  • Intro.js 2页然后返回首页

    我在用intro js http introjs com 为我的网站创建一个小介绍 我希望游览从第 1 页 主页 2 另一页 然后回到第 1 页 主页 我已经成功地从第 1 2 页开始 但不确定如何让它返回到第 1 页 我对 javascr
  • 在 Chrome 中加载analytics.js时出现307重定向

    我正在构建一个网络应用程序并使用 Google Analytics analytics js 进行分析 我最近注意到 Chrome 中的分析功能无法正常工作 我使用单独模块中的标准代码片段加载分析并通过 requirejs 包含 我已验证该
  • HttpWebRequest vs Webclient(特殊场景)

    我知道这个问题之前已经回答过thread https stackoverflow com questions 1694388 webclient vs httpwebrequest httpwebresponse 但我似乎找不到详细信息 在
  • 如何使用 jest 通过 Promise.all 设置多次提取测试

    我在测试中使用 jest 我正在使用 React 和 Redux 并且执行以下操作 function getData id notify return dispatch gt dispatch anotherFunction Promise
  • 如何更改元素的 CSS 类并在单击时删除所有其他类

    我如何处理 AngularJS 2 中的一种情况 即单击一个元素需要更改其自己的样式 并且如果其他元素具有该样式 则需要将其删除 最好在一个函数中 如同Angular js 如何在单击时更改元素 css 类并删除所有其他元素 https s
  • 如何动态隐藏和显示html元素

    html 输入元素使用链接标记隐藏和显示 示例 雅虎邮件密件抄送隐藏和显示 这是用 JavaScript 完成的 对于简单的 Javascript 即不使用jQuery你可以这样做 document getElementById idOfE
  • Facebook API Javascript JSON 响应

    function getUser FB api me function response console log Response is response alert Your name is response first name ale
  • YouTube iFrame Player API 无法在 DOMWindow 上执行 postMessage

    我正在尝试使用以下命令将 youtube 加载到我的网页中YouTube iFrame Player API 并在加载时出现以下错误 Failed to execute postMessage on DOMWindow The target
  • 这个 JQuery 指令做什么 $(function(){...}) [重复]

    这个问题在这里已经有答案了 我最近一直在研究JQuery 尽管我知道一些东西 但书上有这样一句话我根本无法理解 function current entry 1 有谁知道这条线是如何工作的以及它的作用是什么 它类似于 JQuery 函数中的
  • 错误:模块“html”不提供视图引擎(Express)

    我正在尝试设置一个简单的路由应用程序 但在渲染页面时不断遇到错误 Error Module html does not provide a view engine 奇怪的是我已经在 app js 文件中指定了视图引擎 但仍然收到错误 app
  • Javascript/jQuery 外部高度()

    Does idOfLememt outerHeight 对所有浏览器产生相同的结果 IE7 有什么不同吗 只要去http api jquery com outerHeight http api jquery com outerHeight
  • 我如何用 javascript/jquery 进行两指拖动?

    我正在尝试创建当有两个手指放在 div 上时拖动 div 的功能 我已将 div 绑定到 touchstart 和 touchmove 事件 我只是不确定如何编写这些函数 就像是if event originalEvent targetTo

随机推荐

  • vc++画线段的函数_word2vec的损失函数

    虽然word2vec常被当作无监督 但是其训练过程跟有监督基本差不多 原始的word2vec暂时不考虑负采样和huffman tree 其损失函数就是多元交叉熵 多元交叉熵的公式 以传统机器学习来说 这里的Zj就是某个类别的预测概率 yj
  • 物联网嵌入式学习路线发展方向(表格一目了然)

    文章目录 一 学习路线 二 各种分类 1 软件硬件分类 2 发展方向 技术类型 对应岗位分类 2 1 芯片方向 2 2 Linux方向 3 常见板子芯片内核 4 嵌入式公司 对于小白 不知道嵌入式整个体系 学什么 顺序是什么 可以找什么工作
  • Review-MyBatis

    MyBatis 1 学习方法 MyBatis框架功能与Hibernate一样 都是持久化框架 都是操作JDBC 做ORM框架 1 MyBatis框架比Hibernate小 2 做的是针对SQL语句查询结果进行封装 2 MyBatis框架是什
  • 服务器磁盘性能多少分正常,服务器内存使用率多少为正常

    服务器内存使用率多少为正常 内容精选 换一换 当您发现云服务器的运行速度变慢或云服务器突然出现网络断开现象 则可能是云服务器的带宽和CPU使用率过高导致 如果您已经通过云监控服务创建过告警任务 当CPU或带宽利用率高时 系统会自动发送告警给
  • 微弱直流电压/电流信号的采样电路 --滤波跟随放大

    要求将待测的电压 1mV 1000mV 电流 1mA 100mA 采样出来传给单片机 我的思路是 电压采样先用放大电路放大 再进行滤波 把50Hz的交流电干扰滤除 然后再进行模数转换传给单片机 电流的话用一个采样电阻 然后对其电压采样后推算
  • 信息学奥赛一本通【1034:计算三角形面积】

    题目描述 平面上有一个三角形 它的三个顶点坐标分别为 x1 y1 x2 y2 x3 y3 x1 y1 x2 y2 x3 y3 那么请问这个三角形的面积是多少 精确到小数点后两位 输入 输入仅一行 包括66个单精度浮点数 分别对应x1 y1
  • 关于git的一些命令,实验记录

    1 下载moduleA项目代码 命令 git clone https github com wangyanan52121 moduleA git 因网络问题 可能会下载失败 多试几次 2 查看当前项目 查看tag命令 字符串排序 git C
  • 语言深入理解指针(非常详细)(三)

    目录 数组名的理解 使用指针访问数组 一维数组传参的本质 二级指针 指针数组 指针数组模拟二维数组 数组名的理解 在上 个章节我们在使用指针访问数组的内容时 有这样的代码 int arr 10 1 2 3 4 5 6 7 8 9 10 in
  • mysql如何一秒插入10万条数据

    当我们需要批量插入或者更新记录时 可以采用Java的批量更新机制 该机制允许多条语句甚至一次性提交给数据库处理 通常情况下比一句一提交处理更有效率 jdbc处理批量提交有三个方法 需要注意的是 这三种方法都要和PreparedStateme
  • Rx与Async Task的简单对比

    有关Reactive Extensions的介绍可见https rx codeplex com 总的来说 你可以当它是又一个异步编程的框架 它以观察者模式实现了对数据流的的 订阅 一个列表 一个事件 一个耗时操作的方法 等等 都可以Obse
  • C++ 多线程std::async

    std async 对于线程的创建 我们可以直接用thread 但是这会有很多的不便 比如获取子进程的返回值 解决方案是定义一个变量 然后将变量的指针传入到子进程中 然后对其进行赋值 但终归是不便 除此之外我们可以用std async函数来
  • 如何正确理解开漏输出和推挽输出

    作者 知乎用户 链接 https www zhihu com question 28512432 answer 41217074 来源 知乎 著作权归作者所有 商业转载请联系作者获得授权 非商业转载请注明出处 我觉得下面这个 网上资料 还是
  • java项目如何实现数据恢复_Java web 项目中对数据库备份和恢复

    说白了 还是去调用cmd实现数据库的备份和还原功能 备份 mysqldump hserverUrl uusername ppassword dbname gt savePath 还原 mysql hserverUrl uusername p
  • 一文读懂SpringCloud全家桶

    一 云原生应用 SpringCloud是对Springboot使用的分布式解决方案 适合分布式 中大型的项目架构开发 现在也逐渐成为Java服务端的主流框架 使用Spring Cloud开发的应用程序非常适合在Docker和PaaS 比如P
  • C# 提交报错:Validation of viewstate MAC failed 解决办法

    出现以下报错 验证视图状态 MAC 失败 如果此应用程序由网络场或群集承载 请确保
  • 【STM32】SPI初步使用 读写FLASH W25Q64

    硬件连接 1 SS Slave Select 从设备选择信号线 常称为片选信号线 每个从设备都有独立的这一条 NSS 信号线 当主机要选择从设备时 把该从设备的 NSS 信号线设置为低电平 该从设备即被选中 即片选有效 接着主机开始与被选中
  • MySQL 8.0 多实例的配置应用

    文章目录 同版本多实例 配置 部署 启动 连接 不同版本多实例 配置 初始化 initialize insecure 含义 启动 同版本多实例 配置 mkdir p data 330 7 9 data chown R mysql mysql
  • 同城双活与异地多活架构分析

    本文首发于 vivo互联网技术 微信公众号 链接 https mp weixin qq com s OjfFcjnGWV5kutxXndtpMg 作者 vivo官网商城开发团队 采用高可用系统架构支持重要系统 为关键业务提供7x24的不间断
  • Win32 UDP Socket通信学习

    学习内容 参见 Windows网络编程 第7章 Winsock基础 与TCP流式协议不同 UDP为数据报协议 服务端接受数据 客户端发送数据 UDP服务端流程 Socket或WSASocket建立套接字 用SOCK DGRAM标志 bind
  • bootstrap--栅格系统详解(源码分析)

    目录 1 bootstrap是什么 2 栅格模型设计的精妙之处 3 预备知识 4 栅格系统的框架 4 1bootstrap容器 4 1 1固定容器与流体容器公共样式 4 1 2固定容器样式 4 2 bootstrap行与列 4 2 1行 4