`
zzc1684
  • 浏览: 1227988 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

bootstrap源码分析系列:二,栅格和响应式布局

阅读更多

bootstrap把response单独分开作为一个独立模块
这样整个栅格系统实际上分为了栅格grid和响应式布局response。非响应式的栅格是940固定宽度的,并且分为固定和流式两种,响应式布局就是通过media query增加了对不同屏幕宽度的适应。

布局上,通过容器的负padding-left和每一个列的margin-left来实现的,如下图所示:

一,定宽栅格的实现

在variables.less文件中定义了不同容器宽度下栅格系统的几个变量:列数(总是12列),列宽度columnWidth, 列间隙宽度gutterWidth和行宽度rowWidth。
代码如下:

  1. // Default 940px grid  
  2. // -------------------------  
  3. @gridColumns:             12;  
  4. @gridColumnWidth:         60px;  
  5. @gridGutterWidth:         20px;  
  6. @gridRowWidth:            (@gridColumns * @gridColumnWidth) + (@gridGutterWidth * (@gridColumns - 1));  
  7.   
  8. // 1200px min  
  9. @gridColumnWidth1200:     70px;  
  10. @gridGutterWidth1200:     30px;  
  11. @gridRowWidth1200:        (@gridColumns * @gridColumnWidth1200) + (@gridGutterWidth1200 * (@gridColumns - 1));  
  12.   
  13. // 768px-979px  
  14. @gridColumnWidth768:      42px;  
  15. @gridGutterWidth768:      20px;  
  16. @gridRowWidth768:         (@gridColumns * @gridColumnWidth768) + (@gridGutterWidth768 * (@gridColumns - 1));  




这段代码定义了三种宽度下的显示方式,默认的940px宽度下,每一列宽度是60,列间隙是20,那么行宽度就是60x12+20x(12-1)=940px

在grid代码中直接调用了mixin中的grid方法:

  1. // Fixed (940px)  
  2. #grid > .core(@gridColumnWidth, @gridGutterWidth);  
  3.   
  4. // Fluid (940px)  
  5. #grid > .fluid(@fluidGridColumnWidth, @fluidGridGutterWidth);  
  6.   
  7. // Reset utility classes due to specificity  
  8. [class*="span"].hide,  
  9. .row-fluid [class*="span"].hide {  
  10.   displaynone;  
  11. }  
  12.   
  13. [class*="span"].pull-right,  
  14. .row-fluid [class*="span"].pull-right {  
  15.   floatright;  
  16. }   




注意其中还用了属性选择其来选择spanX,因此是不支持ie8一下的浏览器的。
#grid > .core和#grid - .fluid都是在mixin中定义的方法。

我们先看看core是如何实现的:

 

  1. .core (@gridColumnWidth, @gridGutterWidth) {  
  2.    //这个函数用递归实现了循环,因为less是没有循环的,因此index=12的时候会输出 .span1 ~ 12,而内部是调用.span函数  
  3.    .spanX (@index) when (@index > 0) {  
  4.      .span@{index} { .span(@index); }  
  5.      .spanX(@index - 1);  
  6.    }  
  7.    .spanX (0) {} //这个没有任何输出的,不知道写这里干嘛  
  8.       
  9.     //这个函数和.spanX函数很像,都是用递归实现循环操作,内部也是调用了.offset函数实现的  
  10.    .offsetX (@index) when (@index > 0) {  
  11.      .offset@{index} { .offset(@index); }  
  12.      .offsetX(@index - 1);  
  13.    }  
  14.    .offsetX (0) {}  
  15.   
  16.     //定义了12列offset的margin  
  17.    .offset (@columns) {  
  18.      margin-left: (@gridColumnWidth * @columns) + (@gridGutterWidth * (@columns + 1));  
  19.    }  
  20.       
  21.     //定义了12列的宽度,注意宽度是如何计算出来的  
  22.    .span (@columns) {  
  23.      width: (@gridColumnWidth * @columns) + (@gridGutterWidth * (@columns - 1));  
  24.    }  
  25.   
  26.     //注意负margin,注意这里自带了clearfix,因此宽度会被里面的列撑开,而不需要指定宽度  
  27.    .row {  
  28.      margin-left: @gridGutterWidth * -1;  
  29.      .clearfix();  
  30.    }  
  31.   
  32.     //通过属性选择器统一定义了每一列的通用样式,好处是只需要定义一次,坏处是不支持ie8以下的浏览器(不支持属性选择器)  
  33.    [class*="span"] {  
  34.      floatleft;  
  35.      min-height1px; // prevent collapsing columns  
  36.      margin-left: @gridGutterWidth;  
  37.    }  
  38.   
  39.    // Set the container width, and override it for fixed navbars in media queries  
  40.    //重载了container的宽度  
  41.    .container,  
  42.    .navbar-static-top .container,  
  43.    .navbar-fixed-top .container,  
  44.    .navbar-fixed-bottom .container { .span(@gridColumns); }  
  45.   
  46.    // generate .spanX and .offsetX  
  47.     //调用函数递归生成.span1~12和.offset1~12  
  48.    .spanX (@gridColumns);  
  49.    .offsetX (@gridColumns);  
  50.  }   




其中最大的亮点就是用递归模拟了循环,通过循环避免了重复写12次代码。

二,流式栅格的实现

流式栅格相比对定宽栅格,最大的区别就是:
1,定宽栅格直接使用了传入的参数,而流式栅格用传入的参数计算出百分比,最终使用百分比来做布局。
2,定宽栅格可以使用负margin row来布局,而流式栅格则不行,因为row的负margin应该和span的margin-left保持一致,而这两个使用百分比的话是无法保持一致宽度的,因为百分比计算的对象不一样。

比如在同样是如下参数:
@gridColumns:             12;
@gridColumnWidth:         60px;
@gridGutterWidth:         20px;
@gridRowWidth:            (@gridColumns * @gridColumnWidth) + (@gridGutterWidth * (@gridColumns - 1));
 
定宽栅格中,每一列就是60px宽度,列间距就是20px
而在流式栅格中根据上述参数会计算出一个百分比来,实际使用的是这些百分比:
// Fluid grid
// -------------------------
@fluidGridColumnWidth:    percentage(@gridColumnWidth/@gridRowWidth);
@fluidGridGutterWidth:    percentage(@gridGutterWidth/@gridRowWidth);


流式栅格的代码如下:

  1. .fluid (@fluidGridColumnWidth, @fluidGridGutterWidth) {  
  2.      //和定宽栅格没什么区别  
  3.     .spanX (@index) when (@index > 0) {  
  4.       .span@{index} { .span(@index); }  
  5.       .spanX(@index - 1);  
  6.     }  
  7.     .spanX (0) {}  
  8.   
  9.     .offsetX (@index) when (@index > 0) {  
  10.       .offset@{index} { .offset(@index); }  
  11.       .offset@{index}:first-child { .offsetFirstChild(@index); }  
  12.       .offsetX(@index - 1);  
  13.     }  
  14.     .offsetX (0) {}  
  15.   
  16.     .offset (@columns) {  
  17.       margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) + (@fluidGridGutterWidth*2);  
  18.          *margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) - (.5 / @gridRowWidth * 100 * 1%) + (@fluidGridGutterWidth*2) - (.5 / @gridRowWidth * 100 * 1%);  
  19.     }  
  20.   
  21.     .offsetFirstChild (@columns) {  
  22.       margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) + (@fluidGridGutterWidth);  
  23.       *margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) - (.5 / @gridRowWidth * 100 * 1%) + @fluidGridGutterWidth - (.5 / @gridRowWidth * 100 * 1%);  
  24.     }  
  25.   
  26.     .span (@columns) {  
  27.       width: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1));  
  28.       *width: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) - (.5 / @gridRowWidth * 100 * 1%);  
  29.     }  
  30.   
  31.     .row-fluid {  
  32.       width100%;  
  33.       .clearfix();  
  34.       [class*="span"] {  
  35.         .input-block-level();  
  36.         floatleft;  
  37.         margin-left: @fluidGridGutterWidth;  
  38.         *margin-left: @fluidGridGutterWidth - (.5 / @gridRowWidth * 100 * 1%);  
  39.       }  
  40.       [class*="span"]:first-child {  
  41.         margin-left0;  
  42.       }  
  43.   
  44.       // Space grid-sized controls properly if multiple per line  
  45.       .controls-row [class*="span"] + [class*="span"] {  
  46.         margin-left: @fluidGridGutterWidth;  
  47.       }  
  48.   
  49.       // generate .spanX and .offsetX  
  50.       .spanX (@gridColumns);  
  51.       .offsetX (@gridColumns);  
  52.     }  
  53.   
  54.   }   



三,响应式布局


有了上面的#grid > .core和 #grid > .fluid函数,实现响应式就非常简单了。
首先variables中已经定义好了不同宽度的样式,前面已经讲过了。
然后在加上media query并调用 #grid就ok了:
比如 1200px宽屏就是这么定义的:

  1. @media (min-width1200px) {  
  2.   
  3.   // Fixed grid  
  4.   #grid > .core(@gridColumnWidth1200, @gridGutterWidth1200);  
  5.   
  6.   // Fluid grid  
  7.   #grid > .fluid(@fluidGridColumnWidth1200, @fluidGridGutterWidth1200);  
  8.   
  9.   // Input grid  
  10.   #grid > .input(@gridColumnWidth1200, @gridGutterWidth1200);  
  11.   
  12.   // Thumbnails  
  13.   .thumbnails {  
  14.     margin-left: -@gridGutterWidth1200;  
  15.   }  
  16.   .thumbnails > li {  
  17.     margin-left: @gridGutterWidth1200;  
  18.   }  
  19.   .row-fluid .thumbnails {  
  20.     margin-left0;  
  21.   }  
  22.   
  23. }   
分享到:
评论

相关推荐

    响应式布局-仿阿里百秀项目前端源码项目.zip

    响应式布局是一种网页设计技术,它允许网页在不同的...在分析源码时,注意查看HTML结构、CSS样式和JavaScript代码,理解它们是如何协同工作以实现响应式布局的。此外,不断实践和调试将有助于加深对这些概念的理解。

    bootstrap.zip---栅格系统源码

    Bootstrap使用媒体查询实现响应式布局,随着屏幕尺寸的变化,列数会自动调整,使得内容在不同设备上都能适应。 源码中可能还包括`.offset-*-*`类,用于添加列的偏移,比如`.offset-md-3`会在中等屏幕设备上向右偏移...

    蓝色简洁的响应式布局bootstrap后台系统管理模板html源码.zip

    这个“蓝色简洁的响应式布局bootstrap后台系统管理模板html源码”是一个适合前端初学者学习和实践的项目,它展示了如何利用Bootstrap构建一个高效且美观的后台管理系统界面。 1. **响应式设计**:响应式设计是现代...

    响应式布局-BootStrap从基础到项目实战 (高级篇)

    响应式布局与Bootstrap是前端开发中极其重要的技术概念,它能够帮助开发者设计出能够适应不同屏幕尺寸和分辨率的网页,提升用户在不同设备上的浏览体验。Bootstrap作为一款广泛使用的前端框架,提供了丰富的组件、类...

    mvc+bootstrap源码

    Bootstrap则是流行的前端开发框架,它提供了响应式布局和丰富的组件库,使得快速构建美观的用户界面成为可能。 **描述分析:** “网站源代码”表明这是一个完整的网站项目,包含了所有用于构建和运行网站的文件,...

    基于PHP的WordPress多梦主题-Bootstrap源码.zip

    3. **Bootstrap应用**:在WordPress主题中集成Bootstrap,利用其栅格系统和组件来构建响应式布局。 4. **WordPress钩子和过滤器**:学习如何使用WordPress的action和filter钩子来修改主题行为。 5. **响应式设计**:...

    bootstrap 例子 源码

    Bootstrap是世界上最流行的前端开发框架之一,由Twitter的开发者创建,旨在提供一套简洁、直观、强大的工具,用于构建响应式布局和移动设备优先的Web项目。这个压缩包包含了一系列的Bootstrap样例源码,是你深入理解...

    bootstrap响应式的秦时明月项目

    在秦时明月项目的背景下,Bootstrap被用来构建一个美观且响应式的布局,使网页在桌面、平板和手机等不同设备上都能自适应显示。 1. **Bootstrap栅格系统**:Bootstrap的12列栅格系统是布局的核心,允许开发者通过...

    bootstrap压缩版和源码

    1. **响应式布局**:Bootstrap采用移动优先的策略,通过媒体查询实现不同设备屏幕尺寸下的自适应布局。这使得网站在手机、平板电脑和桌面电脑上都能提供良好的用户体验。 2. **栅格系统**:Bootstrap的栅格系统允许...

    bootstrap源码实例

    例如,你可能会在压缩包中的“sys”文件夹中找到有关如何定义不同屏幕尺寸(如xs, sm, md, lg)下的列宽和如何创建响应式布局的代码片段。 其次,Bootstrap包含了大量预定义的CSS类,可以轻松地添加到HTML元素中,...

    自适应式国外Bootstrap主题类网站html源码模板

    Bootstrap是世界上最受欢迎的前端开发框架之一,由Twitter的开发者创建,用于构建响应式布局和移动设备优先的Web项目。这款“自适应式国外Bootstrap主题类网站html源码模板”为初学者和新手提供了宝贵的资源,帮助...

    bootstrap电影网站UI源码

    Bootstrap是由Twitter开发并开源的一个响应式布局、移动设备优先的WEB框架,它为开发者提供了丰富的组件和预定义的样式,可以快速构建美观且功能齐全的网页。 在描述中反复提及"bootstrap电影网站UI源码",这意味着...

    bootstrap后台框架项目源码

    1. **Bootstrap布局系统**:理解如何使用Bootstrap的栅格系统创建响应式布局,适应各种屏幕尺寸。 2. **Bootstrap组件**:学习如何应用和定制Bootstrap的组件,如导航条、下拉菜单、按钮、表单等。 3. **jQuery基础*...

    国外旅游攻略网站CSS模板_html5 bootstrap 响应式模板UI前端源码.rar

    这篇教程将深入解析《国外旅游攻略网站CSS模板_html5 bootstrap 响应式模板UI前端源码.rar》这一压缩包中的核心知识点,旨在帮助你理解和应用HTML5、Bootstrap以及响应式设计来构建现代化的旅游攻略网站。...

    bootstrap源码

    1. **栅格系统**:Bootstrap的栅格系统是其布局的核心,它基于12列的响应式网格,可以轻松创建多列布局,适应不同屏幕尺寸。源码中会包含`.container`、`.row`和`.col-*`类,通过这些类实现灵活的布局。 2. **CSS...

    瀑布流图片展现响应式网页模板_html5 bootstrap 响应式模板UI前端源码.rar

    Bootstrap的媒体查询(Media Queries)和栅格系统使得实现响应式布局变得简单。通过定义不同断点,网页可以适应手机、平板电脑和桌面电脑等各种屏幕大小。 4. **UI前端**: 用户界面(UI)前端是指用户与网站或应用...

    后台数据统计Bootstrap5模板

    Bootstrap5是目前广泛应用的一款前端框架,以其强大的响应式布局、丰富的组件和易用性而备受开发者喜爱。本模板专为后台数据统计设计,提供了完善的解决方案,帮助开发者快速构建美观且功能丰富的数据展示平台。 **...

    Bootstrap红色响应式票务销售后台管理

    - Bootstrap框架:提供UI组件和响应式布局模板。 - AJAX:用于异步数据通信,提升用户体验。 - Font Awesome或 Glyphicons:提供图标资源。 - 可能会用到的后端技术:如PHP、Node.js或Python等,负责处理数据逻辑和...

    《jQuery+BootstrapWeb开发案例教程(在线实训版)》案例源码.zip

    4. **响应式设计**:Bootstrap的核心特性之一就是响应式布局。源码中会体现如何使用媒体查询(`@media`)和Bootstrap的网格系统创建适应不同屏幕尺寸的设计,确保在手机、平板和桌面设备上都有良好的显示效果。 5. **...

    bootstrap3.0.0 教程+源码+中文手册

    Bootstrap是世界上最受欢迎的前端开发框架之一,主要用于构建响应式布局和移动设备优先的Web项目。Bootstrap 3.0.0是该框架的一个重要版本,它引入了许多改进和新特性,旨在提升开发者的效率和用户体验。 **一、...

Global site tag (gtag.js) - Google Analytics