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

深入新版BS4源码探秘flex和工程化sass

时间:2023-04-02 14:01:03 HTML

你可能听说了一个“大新闻”:Bootstrap4合并了代号#21389的PR,宣布放弃对IE9的支持,并默认使用flexbox弹性盒模型。这标志着:1)前端开发全面进入“现代浏览器”时代;2)样式处理再次面向未来,拥抱更灵活的弹性盒模型——Flex布局。本文将带你深入了解最新版Bootstrap的源码,窥探其架构组织的奥秘,剖析最为突出的光栅化系统。同时,你还将了解到sass的高级用法和flex最新语法的奥秘。BS4的新特性在开始我们的探索之前,有必要先梳理一下BS4新增的特性:1)MigratefromLesstoSass:现在,Bootstrap加入了Sass的大家庭。感谢Libsass(Sass解析器),Bootstrap编译速度比以前更快;2)改进网格系统:增加新的网格层以适应移动设备,并整顿语义混合。3)默认弹性盒模型(flexbox):这是一个划时代的改变,利用flexbox的优势进行快速布局。4)弃用孔、缩略图和面板,用卡片代替。5)新的自定义选项:不再像之前的版本那样,将渐变、淡入淡出、阴影等效果放在单独的样式表中。相反,将所有选项移动到一个Sass变量中。想要为全局或意外的角落定义默认效果?很简单,更新变量值,然后重新编译即可。6)使用rem和em单位。7)重构所有JavaScript插件:Bootstrap4用ES6重写了所有插件。UMD支持、通用拆卸方法、选项类型检查等功能现已可用。8)改进工具提示和弹出窗口的自动定位:这部分要归功于Tether(一个定位引擎,使叠加、工具提示和下拉菜单更好)工具。如果你不知道Tether是什么,可以去他的Github地址。BS4GridSystemRevealed了解了以上新特性后,我们主要研究BS自诞生以来最大的“卖点”——网格系统。网格例子,我们选择一个有代表性的BS4官网例子,网上可以参考,或者参考下面的截图。在宽屏中,我们看到:当屏幕宽度小于576px时,我们有:对应代码:...

...
...
...
。col-6类风格在源码中可以简单(不完全)概括为:。col-6{-webkit-box-flex:0;-webkit-flex:0050%;-ms-flex:0050%;弹性:0050%;max-width:50%;}.col-sm-3类在源码中可以概括为:.col-sm-3{-webkit-box-flex:0;-webkit-flex:0025%;-ms-flex:0025%;弹性:0025%;max-width:25%;}两个类的共存与交替我们可以看到,这两个类在代码中设置了样式声明,显然它们的样式属性是冲突的,那么它们是如何“和平共处”起到交替作用的呢?角色?1)当屏幕宽度小于576px时,我们发现.col-sm-3不起作用,此时.col-6起作用。我们在源码中发现,.col-sm-*的样式声明都在@media(min-width:576px){...}的媒体查询中,保证了屏幕在576px以下,只在外面媒体查询.col-*样式声明起作用。2)当屏幕宽度大于576px时,打.col-sm-3的样式声明,其所有优先级必须大于.col-6。这时候,一行四列的样式就保证“大行其道”了。flex解释我们从样式代码中看到类似flex:0025%的语句。为了理解它,我们先从flex属性说起:flex属性是flex-grow、flex-shrink和flex-basis的缩写(类似于backgroud是很多背景属性的简写),它的默认值为01辆汽车。最后两个属性是可选的。语法格式如下:.item{flex:none|[<'flex-grow'><'flex-shrink'>?||<'flex-basis'>]}1)flex-grow:属性定义了item的放大比例,默认为0。我们在BS代码中看到这个值一直为0,即如果有剩余空间,它不会被放大。2)flex-shrink:该属性定义item的缩小比例,默认为1,即如果空间不足,item会收缩。3)flex-basis:该属性定义分配多余空间前item占用的主轴空间(mainsize)。浏览器根据这个属性计算主轴是否有多余空间。可以设置为与width或height属性相同的值(比如350px),那么item将占据一个固定的空间。当然这里设置的BS4是一个比例值,这也是响应性自然实现的基础。SASS在BS4工程中的巨大作用看到这里,也就不难理解BS4网格的实现了,但这并不是本文的最终目的。我们可以再深入一点,比如在BS4网格系统中,一行一共有12列。他的媒体查询断点包括:xs:0,sm:576px,md:768px,lg:992px,xl:1200px。参考其源码dist/css目录下的样式代码,我们要整理生成如此大量的CSS样式,不使用预处理器是反人类的。但是BS4把sass用到了极致。.col-sm-*是如何生成的我们深入到它的scss目录,scss/mixins/_grid.scss文件:@if$enable-grid-classes{@includemake-grid-columns();}inenable-grid当-classes变量为true时(默认为true),调用make-grid-columns()make-grid-columns()这个mixin定义在scss/mixins/_grid-reamework.scss文件中(我好累寻找它...):@mixinmake-grid-columns($columns:$grid-columns,$gutters:$grid-gutter-widths,$breakpoints:$grid-breakpoints){...}这个mixin接受三个参数:1)$columns表示格子个数,默认为122)$gutters表示默认303)$breakpoints表示断点设置,是一个map类型的全局变量。您可以在scss/mixins/_breakpoints.scss文件和scss/_variables.scss文件中找到它们。知道了这些参数,我们再来看看.col-sm-的具体实现。我大规模简化了以下代码,只保留col-sm-的相关部分,并添加注释:@each$breakpointinmap-keys($breakpoints){//如果断点最小,则返回空字符串,否则返回前面带有破折号的名称。$中缀:断点中缀($breakpoint,$breakpoints);//至少具有最小断点宽度的媒体。不查询最小断点。//使@content适用于给定的断点和更宽的断点。@includemedia-breakpoint-up($breakpoint,$breakpoints){@for$i从1到$columns{.col#{$infix}-#{$i}{@includemake-col($i,$columns);}}}}下面一步步分析:1)@each$breakpointinmap-keys($breakpoints),对每个断点遍历;2)breakpoint-infix是定义在css/mixins/_breakpoints.scss文件中的一个函数,它返回一个带有破折号的断点标识字符串,比如这里我们关注的是“-sm”;3)media-breakpoint-up是一个mixin:@mixinmedia-breakpoint-up($name,$breakpoints:$grid-breakpoints){$min:breakpoint-min($name,$breakpoints);@if$min{@media(最小宽度:$min){@content;}}@else{@content;}}4)breakpoint-min是另一个函数,返回断点的具体值,用于拼写媒体查询条件。5)最后最关键的样式的生成使用了另一个在css/mixins/_grid.scss文件中定义的mixin:@mixinmake-col($size,$columns:$grid-columns){flex:00percentage($大小/$列);max-width:percentage($size/$columns);}至此,我们深入到BootstrapV4的scss/目录下的源码,研究涉及:css/mixins/_grid-framework.scss文件;css/mixins/_breakpoints.scss文件;css/mixins/_grid.scss文件;css/_variables.scss文件;css/bootstrap-gris.scss文件;...如果你理解了这些,那么阅读起来就不会有困难新版bootstrap的源代码。相信大家也能从整体上从“上帝视角”理解sass的作用和大型风格框架的架构组织。总结通过阅读源码的grid系统部分,我们应该体会到sass对于如此庞大的样式框架系统的重要性:1)css模块化在管理组织上的灵活性;2)复用的意义,我们使用了很多mixin、function、全局变量;3)像JS一样神奇的语法,包括条件、遍历等。我们应该对flex这个神器也有更深的了解。