当前位置: 首页 > 编程日记 > 正文

bootstrap-less源码分析:行和列

一、行
grid.less文件中有关行的全部源码

.row {
.make-row();//调用
}

//进mixin/grid.less找到行的定义

.make-row(@gutter: @grid-gutter-width) {
margin-left:  ceil((@gutter / -2));//负的槽宽的一半 -15
margin-right: floor((@gutter / -2));
&:extend(.clearfix all);
}

二、列(最复杂)
grid.less文件中有关列的全部源码

.make-grid-columns();//第一步
.make-grid(xs);//第2.1步
@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);
}

然后逐行分析
//进mixin/grid-framework.less找到行的定义(包括3个定义,1个调用,由参数的个数可以判断调用的是1)

.make-grid-columns() {
// Common styles for all sizes of grid columns, widths 1-12
//定义1
.col(@index) { // initial
@item: ~".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}";
//~" "里面的内容是避免编译的 但是@{index}会被替换成调用时的实参值
.col((@index + 1), @item);//“递归”调用,但从参数个数可看出调用的是定义2、3
}
//定义2
//@grid-columns是栅格的列数,默认值为12
.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}");//真正递归调用,函数名和参数类型个数都一样,第二个参数是拼接成的字符串
}
//定义3
.col(@index, @list) when (@index > @grid-columns) { // terminal
@{list} {//这里将@list这个变量当成了选择器去用
position: relative;
// Prevent columns from collapsing when empty
min-height: 1px;
// Inner gutter via padding
padding-left:  ceil((@grid-gutter-width / 2));
padding-right: floor((@grid-gutter-width / 2));
}
}
//调用
.col(1); // kickstart it
}

.make-grid(xs);//这是列的第2.1步
//可以看出bootstrap里面移动优先
//进mixin/grid-framework.less找到make-grid()的定义

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

//再在mixin/grid-framework.less找到float-grid-columns(@class)的定义

//和列的第一步非常相像
//先递归,产生.col-xs-1,.col-xs-2,...,.col-xs-12
//再加选择器
.float-grid-columns(@class) {
.col(@index) { // initial
@item: ~".col-@{class}-@{index}";
.col((@index + 1), @item);
}
.col(@index, @list) when (@index =< @grid-columns) { // general
@item: ~".col-@{class}-@{index}";
.col((@index + 1), ~"@{list}, @{item}");
}
.col(@index, @list) when (@index > @grid-columns) { // terminal
@{list} {
float: left;
}
}
.col(1); // kickstart it
}

//再在mixin/grid-framework.less找到loop-grid-columns的定义

//@index==12,@class==xs,@type==width/pull/push/offset
.loop-grid-columns(@index, @class, @type) when (@index >= 0) {
.calc-grid-column(@index, @class, @type);
// next iteration
.loop-grid-columns((@index - 1), @class, @type);//递归
}

//再在mixin/grid-framework.less找到.calc-grid-column(@index, @class, @type)的定义
//发现是1组共6个,注意到@index在递减

//每次调用.calc-grid-column(@index, @class, width)都会产生一个类似
//.col-xs-12{width:12/12}
//直到.col-xs-1{width:1/12}停下来
.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {
.col-@{class}-@{index} {
width: percentage((@index / @grid-columns).calc-grid-column(@index, @class, @type));
}
}

//.calc-grid-column(@index, @class, pull)与.calc-grid-column(@index, @class, pull)都属于列排序

//.calc-grid-column(@index, @class, pull)每次执行会产生一个类似
//.col-xs-push-12{left: 12/12}
//直到.col-xs-push-1{left: 1/12}
//加上@type==width时没有的.col-xs-push-0{left: auto}
//.calc-grid-column(@index, @class, push)就是pull改成push,把left换成right
.calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) {//会被执行12次
.col-@{class}-push-@{index} {
left: percentage((@index / @grid-columns));
}
}
.calc-grid-column(@index, @class, @type) when (@type = push) and (@index = 0) {//会被执行1次
.col-@{class}-push-0 {
left: auto;
}
}
.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index > 0) {//会被执行12次
.col-@{class}-pull-@{index} {
right: percentage((@index / @grid-columns));
}
}
.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index = 0) {//会被执行1次
.col-@{class}-pull-0 {
right: auto;
}
}

//.calc-grid-column(@index, @class, offset)属于列偏移

//每次执行会产生.col-xs-offset-12{margin-left: 12/12}
//直至.col-xs-offset-0{margin-left: 0}
.calc-grid-column(@index, @class, @type) when (@type = offset) {
.col-@{class}-offset-@{index} {
margin-left: percentage((@index / @grid-columns));
}
}

余下三个类似,不过是把xs换成了sm,md,lg

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

视频地址:https://www.bilibili.com/video/BV1YW411T7yy?p=3

相关文章:

博客园,我来了~

希望在这里留下我美好的回忆~ 转载于:https://www.cnblogs.com/wangzhigang/p/3638400.html

ARE YOU THE ONE?

总觉得&#xff0c;特定环境下&#xff0c;他或者她&#xff0c;这个称呼是有一些暧昧的。比如我的前同事M&#xff0c;跟她男朋友刚相亲认识的时候&#xff0c;跟我说起&#xff0c;总是那个人那个人的称呼&#xff0c;一副局外人的架势。后来&#xff0c;他们熟悉了&#xff…

Windows和Linux的编译理解

Windows一般编译出来的x86的软件&#xff0c;就是只能在x86的系统上才能运行&#xff0c;同理&#xff0c;在x64系统上也是一样的道理。 Linux利用gcc编译器编译&#xff0c;可以在Linux上面运行&#xff0c;但是想要在嵌入式系统上运行的话&#xff0c;需要在Linux上安装相应的…

安卓环境搭建 unable to access Android SDK add-on list解决方案

选择Setup Proxy 选择Manual proxy configuration 设置Host name 为&#xff1a;mirrors.neusoft.edu.cn 保持Port number 为&#xff1a;80 确定 参考博客&#xff1a;https://blog.csdn.net/qq_35892584/article/details/109746886?utm_mediumdistribute.pc_relevant.…

Git使用笔记(一)

今天第一次使用Git&#xff0c;在本地和CSDN Code进行代码同步。鉴于“好记性不如烂笔头”的经验教训&#xff0c;特把步骤记录下来。 准备工作&#xff1a; 1. 在CSDN&#xff08;或者Github&#xff09;上注册一个帐号&#xff0c;然后创建一个Repository。记录下Repository的…

ASP.NET 2.0站点登录、导航与权限管理

(一)登录 asp.net 2.0中&#xff0c;新增了许多新的功能和控件。其中&#xff0c;新增的登陆控件可谓使得WEB应用的设计更加得心应手。什么是登陆控件呢&#xff1f;就是我们平常在WEB应用中经常要用到的用户注册&#xff0c;登陆&#xff0c;忘记密码&#xff0c;登陆后根据权…

Android 中一些常用类的常用方法(Math、Random、Color、Paint、Canvas、Bitmap、BitmapFactory)...

1.java.lang.Math类常用的常量和方法&#xff1a; Math.PI 记录的圆周率 Math.E 记录e的常量 Math.abs 求绝对值 Math.sin 正弦函数 Math.asin 反正弦函数 Math.cos 余弦函数 Math.acos 反余弦函数 Math.tan 正切函数 Math.atan 反正切函数 Math.atan2 商的反正切函数 Math.toD…

效果很好的asp.net的数据库访问模型(优化,封装一体化)

效果很好的asp.net的数据库访问模型&#xff08;优化&#xff0c;封装一体化&#xff09; 非常有效的数据库/配置文件访问模型。成功使用在几万流量的网站上。任何建议欢迎大家交流。 在使用SqlCommand对象过程中&#xff0c;我们需要分配Connection对象。 通常&#xff0c;对于…

【技巧——windows】直接登陆到桌面,免去输入密码

关于这个问题其实我很早之前就研究过&#xff0c;只是一直都是弄一次就不管了&#xff0c;下次就忘记怎么弄了&#xff0c;又去查&#xff0c;现在就写个笔记吧。 win8/8.1 在开始的界面输入netplwiz&#xff0c;或者点击winr打开运行&#xff0c;输入netplwiz&#xff0c;然后…

虚商烦恼多?不在怕的!你距离享受高效虚商控制台只差一步的距离

摘要&#xff1a;虚商烦恼多&#xff1f;不在怕的&#xff01;你距离享受高效虚商控制台只差一步的距离虚商自助服务平台 vco.console.aliyun.com/原文链接本文为云栖社区原创内容&#xff0c;未经允许不得转载

Shark Hive Spark Hadoop2 进行整合的测试。

本文目的是测试将shark和hadoop2进行整合。 本来打算使用Shark 最新版0.9.0 &#xff0c;但是官方好像还没有针对与Hadoop2的正式下载地址。&#xff08;这个要说明一下&#xff0c;官方只提供了源码&#xff0c;并没有找到编译好的0.9.0 for hadoop2 &#xff0c;也许需要自己…

nginx反向代理-多端口映射

2019独角兽企业重金招聘Python工程师标准>>> 代码解释 1.1 http:www.baidu.test.com默认是80&#xff0c;访问“/”利用反向代理&#xff0c;然后访问本地8083&#xff1b; 1.2 8083代表本地的前端工程访问地址&#xff0c;前端需要访问后台数据&#xff0c;”/”…

程序员期末试卷_第三部分复习提纲.doc下载

程序员期末试卷_第三部分复习提纲.doc下载 转载于:https://www.cnblogs.com/dtdnh520/archive/2007/01/20/625390.html

IDEA IntelliJ 如何新建一个不用任何框架的web项目

step 1 step 2 step 3 step 4 step 5 step 6 结果&#xff1a; 导包 找到jsp-api.jar和servlet-api.jar 建包&#xff08;web项目不建议直接在src目录下新建类&#xff09;

坑爹系列1--Log

今天的Log信息有的能打有的不能打&#xff0c;甚是奇怪&#xff0c;高了半天明白了&#xff0c;常见的几个问题就不说了&#xff0c;说我这个奇怪的。看下面的内容&#xff0c;那个能打印呢&#xff1f; 1 2 3 4 5 Log.v("交易返回码:log", " "); Log.v(&q…

避免资源死锁:识别已打开的事务

死锁往往由于以下原因引起&#xff1a;1、程序错误&#xff0c;比如一个事务需要操作两个表&#xff0c;由于程序错误在有时是先操作a表后操作b表&#xff0c;有时是先操作b表后操作a表&#xff0c;就有机会互相等待而造成死锁。2、事务太大&#xff0c;大事务操作的表多&#…

【vivado】debug hub时钟不匹配

报错&#xff0c;没有debug core&#xff01; the clock connected to the debug hub (dbg_hub) core 根因是在调试中&#xff0c;这个debug hub没有工作。 下图两个ila_0&#xff0c;ila_1&#xff0c;分别对应两个时钟clk_out1, clk_out2&#xff0c;然后连到一个hub上。 默认…

IDEA IntelliJ 如何给web项目配置tomcat

step 1 step 2 step 3(重复step 1) step 4 step 5 step 6 结果

使用 spring boot 开发通用程序

2019独角兽企业重金招聘Python工程师标准>>> tag: spring 学习笔记date: 2018-03spring 是什么&#xff1f;spring 核心是应用组件容器&#xff0c;管理组件生命周期&#xff0c;依赖关系&#xff0c;并提倡面向接口编程实现模块间松耦合。 spring boot 是什么&…

java.utilDate和java.sql.Date

java.utilDate和java.sql.Date由广州疯狂软件教育java培训分享&#xff1a; java程序中的时间类型有java.util.Date和java.sql.Date两种。两者之间的关系和转化如下&#xff1a; java.sql.Date是java.util.Date的子类&#xff0c;所以可以直接将java.sql.Date类型的对象赋值给j…

Oracle 10G重建EM DB Control.

Oracle 10G R2重建EM DB Control.如果安装后没有修改过IP地址或机器名字,可以跳过下面1和2两步。1.drop configuration files and repository run :emca -deconfig dbcontrol db -repos drop 2. Logon SQLPLUS as user SYS or SYSTEM, and drop the sysman account and mangem…

IDEA IntelliJ 如何快速查看一个类里面包含哪些方法

主页面停留在那个类上 点击屏幕左侧的Structure

ACM 关于521

关于521 时间限制&#xff1a;1000 ms | 内存限制&#xff1a;65535 KB难度&#xff1a;2描述Acm队的流年对数学的研究不是很透彻&#xff0c;但是固执的他还是想一头扎进去。 浏览网页的流年忽然看到了网上有人用玫瑰花瓣拼成了521三个数字&#xff0c;顿时觉得好浪漫&#…

搭建本地https

生成证书 1. 使用openssl生成密钥privkey.pem&#xff1a; openssl genrsa -out privkey.pem 1024/2038 2. 使用密钥生成证书server.pem&#xff1a; openssl req -new -x509 -key privkey.pem -out server.pem -days 365 证书信息可以随便填或者留空&#xff0c;只有Common Na…

(转载)新年——顺民的牢骚

我是一个顺民&#xff0c;顺的不能再顺的民&#xff01;相信很多人和我一样&#xff0c;即使心中有很多的不满&#xff0c;也只是偶尔发发牢骚&#xff0c;而且&#xff0c;大多时&#xff0c;还不敢在人多的时候发&#xff01;即使在昏暗的灯光下的某个角落写写BLOG&#xff0…

IDEA IntelliJ 如何设置网站的欢迎页面

网站的目录结构如下 在web>WEB-INF>web.xml 文件中设置login.html为欢迎页面&#xff08;运行跳出的第一个页面&#xff09;

nyoj19 全排列

http://acm.nyist.net/JudgeOnline/status.php?pid19 1 #include<stdio.h>2 #include<stdlib.h>3 int n,a[10];4 bool vis[10];//标示数字是否被用过 5 void f(int k,int m)//k用来给a中第k个元素赋值&#xff0c;m表示还需要寻找的数字个数 6 {7 for(int i1;…

vue中动态样式不起作用? scoped了解一下

vue中style标签使用属性scoped的注意事项 style上添加属性scoped可以实现样式私有化&#xff0c;但是在使用动态样式时&#xff0c;样式会不起作用。可以先去掉scoped转载于:https://www.cnblogs.com/zuojiayi/p/9364347.html