当前位置: 首页 > Web前端 > CSS

预告Bootstrap4源码-网格篇(上)

时间:2023-03-31 11:01:48 CSS

本文引用的版本为Bootstrap4Beta版,请读者先下载相关源文件。时间过得真快,如果后续版本的代码有变动,会根据心情更新补充。如果您觉得本文不错,欢迎点赞支持。如需转载,请注明作者和出处,谢谢。在日常使用Bootstrap时,我们最常见的做法是在HTML中为元素添加预设的类名。这种方法直观且易于调试。但是对于一个前端洁癖来说,在HTML标签里面加一堆类名就跟内联样式一样恶心。所以这个时候,学习使用Bootstrap的Scss,使用它的内置函数和@mixin给自己的命名类添加样式就成了一件很棒很酷的事情。涉及的文件变量:_variables.scss(起始行:171,结束行:205)function:_function.scss//该函数主要用在变量文件中,这里不介绍public类:_flex.scss//在utilities文件文件夹下,用于flex布局的各种类型只是对properties进行了封装,同样不做描述@mixin:_breakpoints.scss//断点功能区,包括断点范围搜索,媒体查询自动扩展和其他功能_grid。scss//辅助mixin,提供容器、行、列的创建_grid-framworks.scss//核心mixin,基于断点,循环创建12个基于flex的grid参考:_grid.scss//自动创建12列布局包括grid本质上是参考了_grid-frameworks和_grid特征分析变量(_variales.scss):$grid-breakpoints:$grid-breakpoints:(xs:0,sm:576px,md:768px,lg:992px,xl:1200px)!default;@include_assert-ascending($grid-breakpoints,"$grid-breakpoints");@include_assert-starts-at-zero($grid-breakpoints);有xs、sm、md、lg、xl五个等级,分别代表极小、小、中、大、特大。这个断点设置主要用于媒体查询,即当浏览器窗口的水平尺寸发生变化时,一旦达到指定的条件,比如width=768px,就会触发md断点下设置的样式。这些层级的数据可以根据需要进行更改,所有对此地图的全局引用都会受到影响。文档注释中提到,这里设置的值代表变化的最小值,即触发md的条件≥768px。变量$grid-breakpoints后面跟着两个@mixins。这两个@mixins定义在根目录下的_function.scss文件中,都起到了判断的作用,其中_assert-ascending()是为了保证整个$grid-breakpoints的内容是按升序排列的,即从小到大;_asseert-starts-at-zero()是保证$grid-breakpoints的第一个元素值必须为0,即xs必须为0。$container-max-widths:$container-max-widths:(sm:540px,md:720px,lg:960px,xl:1140px)!default;@include_assert-ascending($container-max-widths,"$container-max-widths");与grid断点变量相比,这里的container变量删除了xs层,只留下4层。这并不违背逻辑,因为在注释中,这里写的值代表容器宽度的最大值。比如在md的情况下,window的最小宽度是768px,而container的最大宽度是720px,留了一些空间。所以在这种情况下,容器宽度中值为0的xs是没有意义的,标记为sm的容器宽度值在0-540px之间变化,对应窗口宽度的xs到sm的区间。变量后面的函数前面已经讲过,这里不再赘述。网格列:$网格列:12!默认;$grid-gutter-width:30px!default;这里的grid-columns指的是网格列包括$grid-columns,$grid-gutter-width定义。这两个($grid-columns,$grid-gutter-width)是初始定义,分别代表总列数和列间距。在之前的alpha6版本中,也有不同viewwidth下的guttergroup。在测试版中已被删除。至此,grid涉及到的变量都介绍完了,后面所有的mixins和function都是基于这些取值的,所以这里的取值非常重要,牵一发而动全身。@mixin(mixins文件夹)_breakpoints.scss:breakpoint-next:@functionbreakpoint-next($name,$breakpoints:$grid-breakpoints,$breakpoint-names:map-keys($breakpoints)){$n:index($断点名称,$名称);@returnif($n

,然后在scss中写一个.main{@includemake-container();},你创建的其实是Bootstrap中的一个“container-fluid”是具有类名的流体容器。如果你仔细观察这个@mixin,你会发现它指定了一个100%的容器宽度,在实际浏览器中显示为水平全屏。您可以随意调整浏览器的窗口大小。不会改变(当然,它带有左右填充)。make-container-max-width:@mixinmake-container-max-widths($max-widths:$container-max-widths,$breakpoints:$grid-breakpoints){@each$breakpoint,$container-max-width在$max-widths{@includemedia-breakpoint-up($breakpoint,$breakpoints){max-width:$container-max-width;一般不单独使用,配合一个make-container,就可以创建大家熟悉的.container(其实这个可以在根目录下的_grid.scss中找到)。在这个@mixin中,它确定了width=$container-max-width(定义在变量中),也就是说基于这个@mixin创建的容器不再像fluid容器那么宽,而是一步步变化的.从某种程度上来说,这更符合我们的预期和使用习惯。make-row:@mixinmake-row(){显示:flex;弹性包装:包装;右边距:($grid-gutter-width/-2);margin-left:($grid-gutter-width/-2);}这是一个非常重要的变化。大家可以注意到,这里的rowindisplay变成了flex,这也是b4的主要改进之一。row基础结构的改变,意味着整个b4框架有了很大的提升。一定程度上会基于flexbox(IE8滚蛋)。顺便说一句,你可以注意到make-row中的循环为每一行添加了一个负边距,并且大小恰好是gutter/2(即15px,如果你没有更改它)。目测是为了抵消创建容器(container)时padding的影响,所以……嗯……为什么一开始要加上padding呢?make-column-ready:@mixinmake-col-ready(){position:relative;宽度:100%;最小高度:1px;padding-right:($grid-gutter-width/2);padding-left:($grid-gutter-width/2);}我很惊讶Bootstrap创建了这个@mixin但没有使用它。后来在_grid-frameworks.scss中找到了原因,这个@mixin被换成了占位符号。这应该是当前测试版中的一个小遗漏。后续版本将删除此@mixin,或更新占位符。简而言之,让我们先跳过这个@mixin。make-col:@mixinmake-col($size,$columns:$grid-columns){flex:00百分比($size/$columns);max-width:percentage($size/$columns);},column终于变成了flex布局。将来,列的高度和元素的垂直居中将非常简单。这是对这个@mixin的简单解释。参数$size是一个整数,从1到12,它的列宽计算就是以此为基础,通过$size/$columns得到的比例,这个百分比的结果就是列宽,这使得它有一个一定的反应能力。顺便解释一下这个flex,flex:00这是一个简写属性,它的具体含义是flex元素的宽度(或者说主轴空间,一般是horizo??ntal)。这里还有一个小坑。刚开始测试的时候,觉得make-col()是12列布局的奥秘,于是创建了两个div,加入了make-col(4)和make-col(8)...
...
.side{@includemake-col(4);}.main{@includemake-col(8);}一开始他们确实是按照我想的1:2宽度分布的,但是当我把窗口缩小到一定程度的时候,惊恐的发现他们并没有折叠,但重叠。原因就在于这个make-col()。首先,我们习惯于在列上包裹一层行。在该行中,我们将flex-wrap定义为wrap。理论上,当行中元素的宽度不够时会换行,而是make-rol()定义的“.col-”类的宽度(为什么在前缀前的中缀中提到)是一个百分比数字,换句话说,它的宽度总是足够的(行中col宽度的总和总是小于或等于100%),这样当你的内容收缩到一定程度时,溢出将不可避免地发生(容器的宽度小于内容的宽度)。当你手动调整使和大于12时,比如make-col(4)和make-col(9),这相当于手动折线,效果不是特别理想。所以经过分析,在实际使用中还是需要匹配前缀的,比如在大窗口中使用md,而这个没有前缀的类可以看作是xs的替代品。在很小的窗口中使用,但不要单独使用,否则在窗口很小的情况下,会发生溢出,如果页面元素很多,影响会很大。liveinheaven的offset、push、pull在Alph6中都有,在Beta版中被删掉了,这里就不介绍了,祝他们一切顺利