我一直以为Bootstrap的LESS源代码精髓在mixins.less,所以这个系列主要也是讲解mixins.less的。

什么是mixins?

混入,或者翻译成混合。官网的说法是:我们可以定义一些通用的属性集为一个 class,然后在另一个 class 中去调用这些属性。

看起来非常难理解,没事,我们来看例子,比如有这样一个class:

.bordered {
border-top: dotted 1px black;
border-bottom: solid 2px black;
}

那如果我们现在需要在其他 class 中引入那些通用的属性集,那么我们只需要在任何 class 中像下面这样调用就可以了:

#menu a {
color: #111;
.bordered;
}
.post a {
color: red;
.bordered;
}

编译后,.bordered class 里面的属性样式都会在 #menu a 和 .post a 中体现出来:

#menu a {
color: #111;
border-top: dotted 1px black;
border-bottom: solid 2px black;
}
.post a {
color: red;
border-top: dotted 1px black;
border-bottom: solid 2px black;
}

在 LESS 中,我们还可以还可以像函数一样定义一个带参数的属性集合:

.border-radius (@radius) {
border-radius: @radius;
-moz-border-radius: @radius;
-webkit-border-radius: @radius;
}

然后在其他 class 中像这样调用它:

#header {
.border-radius(4px);
}
.button {
.border-radius(6px);
}

如果想详细了解混入,请查看官方文档:http://www.lesscss.net/article/document.html

举个栗子

Bootstrap 3.0中有许多有用的混入函数,第一个无疑是clearfix函数。clearfix是用来清除浮动的。

但是,为什么要清除浮动呢?

如果父元素只包含浮动元素,那么它的高度就会塌缩为零。 形象的说,既然是浮动元素,那么其父级元素就觉得他们都是飘在我上面的玩意,没有占据我的空间,所以高度就塌陷为零了。这时候我们清除浮动,告诉父级元素,你需要包含这些浮动的元素,然后他就被撑开了。

常见的清除浮动技术是这样的:

.clearfix:after {
content: ".";
display: block;
height:;
visibility: hidden;
clear: both;
}
.clearxi {
*zoom:;
}

不过Boostrap的更容易记:

.clearfix() {
&:before,
&:after {
content: " "; /* 1 */
display: table; /* 2 */
}
&:after {
clear: both;
}
}

如果要兼容IE6和IE7则加上:

.clearfix {
*zoom:;
}

值得注意Bootstrap使用的技术不支持Firefox 3.5以下版本。

clearfix基本原理

远古时代,我们使用一个隐藏的元素进行清除浮动。但自从伪类选择器:after和:before出现后,我们可以通过content来悄悄的在子元素后端,或者前端插入元素,并将其设为clear: both。

:after

:after 选择器在被选元素的内容后面插入内容。

请使用 content 属性来指定要插入的内容。

:before

:before 选择器在被选元素的内容前面插入内容。

请使用 content 属性来指定要插入的内容。

怎么混入?

我们来看看Bootstrap中的例子:

// Panel contents
.panel-body {
padding: 15px;
.clearfix();
}

为了防止panel塌陷,Bootstrap使用.clearfix()混入函数对.panel-body处理,编译后如下:

.panel-body {
padding: 15px;
} .panel-body:before,
.panel-body:after {
display: table;
content: " ";
} .panel-body:after {
clear: both;
}

完成收工!

该方案原作者的解释

这种clearfix方案,生成了两个伪元素,并将其display设置成table。这将创建一个匿名的table-cell和一个新的块状区域,这意味着::before伪元素阻止了顶部边缘塌陷。而:after伪元素清除了浮动。其结果是,没有必要隐藏任何生成的内容,并减少所需的代码量。

bootstrap 3.0 LESS源代码浅析(一)的更多相关文章

  1. bootstrap 3.0 LESS源代码浅析(二)

    border-radius是最常见的CSS3属性,但你知道他多少东西呢? 比如: border-radius:2em; 相当于什么? border-top-left-radius:2em; borde ...

  2. 【Spark】Stage生成和Stage源代码浅析

    引入 上一篇文章<DAGScheduler源代码浅析>中,介绍了handleJobSubmitted函数,它作为生成finalStage的重要函数存在.这一篇文章中,我将就DAGSched ...

  3. Asp.Net MVC+BootStrap+EF6.0实现简单的用户角色权限管理

    这是本人第一次写,写的不好的地方还忘包含.写这个的主要原因是想通过这个来学习下EF的CodeFirst模式,本来也想用AngularJs来玩玩的,但是自己只会普通的绑定,对指令这些不是很熟悉,所以就基 ...

  4. Bootstrap 3.0正式版发布!

    Bootstrap是Twitter推出的一个开源的用于前端开发的工具包,包含了丰富的Web组件.根据这些组件,开发者可以快速的搭建一个漂亮.功能完备的网站.在经过Bootstrap 3 RC版的测试和 ...

  5. 10款最好的 Bootstrap 3.0 免费主题和模板

    Twitter Bootstrap 框架已经广为人知,用于加快网站,应用程序或主题的界面开发,并被公认为是迄今对于Web开发的最有实质性帮助的工具之一.在此之前的,各种各样的界面库伴随着高昂的维护成本 ...

  6. Bootstrap v4.0.0-alpha.5 发布,大量更新

    Bootstrap v4.0.0-alpha.5 发布了,Bootstrap是快速开发Web应用程序的前端工具包.它是一个CSS和HTML的集合,它使用了最新的浏览器技术,给你的Web开发提供了时尚的 ...

  7. 30款最好的 Bootstrap 3.0 免费主题和模板

    Twitter Bootstrap 框架已经广为人知,用于加快网站,应用程序或主题的界面开发,并被公认为是迄今对于 Web 开发的最有实质性帮助的工具之一.在此之前的,各种各样的界面库伴随着高昂的维护 ...

  8. Twitter Bootstrap 3.0 正式发布,更好地支持移动端开发

    Twitter Bootstrap 3.0 终于正式发布了.这是一个圆滑的,直观的和强大的移动优先的前端框架,用于更快,更容易的 Web 开发.几乎一切都已经被重新设计和重建,更好的支持移动端设备. ...

  9. [转]Bootstrap 3.0.0 with ASP.NET Web Forms – Step by Step – Without NuGet Package

    本文转自:http://www.mytecbits.com/microsoft/dot-net/bootstrap-3-0-0-with-asp-net-web-forms In my earlier ...

随机推荐

  1. LoRaWAN 1.1 网络协议规范 - 4 MAC 帧格式 Part II

    LoRaWAN 1.1 网络协议规范 LoRaWAN 1.1 版本封稿很久了也没有完整啃过一遍,最近边啃边翻译,趁着这个机会把它码下来. 如果觉得哪里有问题,欢迎留言斧正. 翻译不易,转载请申明出处和 ...

  2. <<c专家编程>>笔记

    C专家编程摘录 c操作符的优先级 有时一些c操作符有时并不会像你想象的那样工作. 下方表格将说明这个问题: 优先级问题 表达式 期望的情况 实际情况 . 优先级高于* *p.f (*p).f *(p. ...

  3. 潭州课堂25班:Ph201805201 python 模块json,os 第六课 (课堂笔记)

    json 模块 import json data = { 'name':'aa', 'age':18, 'lis':[1,3,4], 'tupe':(4,5,6), 'None':None } j = ...

  4. 设置TabBar图片

    设置TabBar图片 // 拿到 TabBar 在拿到想应的item UITabBar *tabBar = _tabBarController.tabBar; UITabBarItem *item0 ...

  5. 利用VS2008编译器编译Qt4.8.2的MySQL驱动

    准备:安装VS2008和Qt 4.8.2,并且设置环境变量(QTDIR=C:\Qt\4.8.2 和 path+=C:\Qt\4.8.2\bin) 一.下载mysql数据库,安装(完全安装)到C盘根目录 ...

  6. (58)Wangdao.com第九天_JavaScript 对象的基本操作

    对象的基本操作 创建对象 var 对象名 = new Object();        // new 函数;    称为构造函数,专门用来创建对象的函数 var god =  给对象增加属性 删除对象 ...

  7. mxnet安装及NDArray初体验

    一.mxnet安装 (以下均为mac环境) 有二种方式: 1.1 用conda安装 #创建gluon目录 mkdir gluon-tutorials && cd gluon-tutor ...

  8. AngularJS中的$http缓存以及处理多个$http请求

    在AngularJS的实际项目中,经常需要处理多个$http请求,每个$http请求返回一个promise,我们可以把多个promise放到$q.all()方法接受的一个数组实参中去. ■ 处理多个$ ...

  9. 最小生成树 Prim Kruskal

    layout: post title: 最小生成树 Prim Kruskal date: 2017-04-29 tag: 数据结构和算法 --- 目录 TOC {:toc} 最小生成树Minimum ...

  10. Hadoop3集群搭建之——hbase安装及简单操作

    折腾了这么久,hbase终于装好了 ------------------------- 上篇: Hadoop3集群搭建之——虚拟机安装 Hadoop3集群搭建之——安装hadoop,配置环境 Hado ...