首先关于bootstrap从v3的less转到v4的sass的十万个为什么,这里暂且不表(计划会另起一篇文章对比less,sass,postcss)。
一起走进bootstrap v4 sass
1、bootstrap的sass文件都放在scss目录,为什么名字是scss而不是sass呢?主要涉及到sass与scss两种语法的区别,scss语法更接近css,所以更受大家喜爱,使用更广泛。具体可参考 sass 语法
2、scss文件分为两种,一种是以下划线开头的如 _variables.scss ,一种是没有下划线的如 bootstrap.scss ,这两个的区别是前者表示被导入的文件,默认不会编译成对应的css文件,而后者会编译对应的css文件。所以如果有两个文件 _a.scss , b.scss 默认编译结果是只有 b.css 文件,如果b要使用 _a.scss 中的样式,那么可以使用导入功能 @import a (导入的文件是可以省略下划线及文件后缀名的)。具体也可参考 sass 语法
3、如果编译整个scss目录,我们可以得到四个css文件,分为是 bootstrap.css , bootstrap-flex.css , bootstrap-reboot.css , bootstrap-grid.css ,这四个css样式分别由下面的四个scss文件生成。
bootstrap-reboot为重置样式,bootstrap-grid为网格样式,这两个可以看作赠送的单独样式,如果某些场景你不想使用整个bootstrap样式,但是又想用它的重置或网格系统,那么可以直接使用这两个。
bootstrap和bootstrap-flex的区别是前者使用传统的布局方式,后者用的是的是flex方式,所以可以根据自己的实际情况选择使用。从上面图上可以看到 bootstrap-flex.scss 在导入 bootstrap.scss 之前,重置了 $enable-flex: true
4、打开 bootstrap.scss ,可以看到里面导入了各种文件,整体分为6大块,分别为:
variable & mixin:引入变量及mixin文件,其中 _mixin.scss 文件中导入了mixin目录中的所有文件
reset:引入normalize 及 print文件
core:引入基础样式文件,如grid,form,table,button等
component:引入组件文件,如nav,card,breadcrumb等
component js:引入需要js控制的组件文件,如modal,tooltips等
utility:引入一些全站的class文件,里面有些通用的class,如clearfix,center-block等
如何使用并修改bootstrap v4的样式
如果你对sass熟悉的话,可以直接使用其sass;当然如果你不熟悉sass的话,可以到目录dist/css中找到编译好的 bootstrap.css 。
下面我们先说下直接使用css的:
在html中引入 <link href="bootstrap.css" rel="stylesheet" />
如需修改bootstrap样式,可另建一个样式表如 style.css ,覆盖bootstrap样式。不建议直接修改打开 bootstrap.css 样式表修改既然是用sass写的,那当然我们可以选择更高逼格的sass了,同样sass也有两种修改办法,一种是非破坏性的,一种是破坏性的。
对于破坏性的,那就是哪里不合意就修改哪里了,没什么好招。这里说下对于非破坏性的使用修改,我们可以采用如下方法:
把bootstrap的所有scss文件放在bootstrap目录
scss bootstrap 目录 (原先bootstrap中scss目录所有文件) bootstrap.scss ... mixin目录 ... _custom-variables.scss (自定义的变量,或覆盖bootstrap的变量) _custom-mixin.scss(自定义的mixin) style.scss
style.scss 代码如下:
@charset "UTF-8"; // 导入文件 @import "custom-variables"; @import "custom-mixin"; @import "bootstrap/bootstrap";
当然如果有代码洁癖的,那对于不用的样式总是想砍掉的,于是重新拿起 bootstrap.scss 审视,把那些不需要的样式,直接去掉import不就好了吗。如果考虑到以后升级什么的,那还是建立个新文件,想要什么就自己按照 bootstrap.scss 中的方法引入就可以了。对于组件样式,需要就引入,不需要就不引入,但是一定要注意core与utility的样式,因为说不定你的组件中就用了这些基础的样式
如何改进bootstrap v4的sass设计
从个人实战的经验角度出发,觉得bootstrap v4有如下几点缺陷:(仅为个人观点)
可以进一步进行目录规划,如把所有的组件文件都放在component目录,utility文件放在utility目录,那样看起来更有组织性,现在有点零散,看上去有点乱
没有 % 设计,个人觉得 % 的设计是一个进步,对于样式的组合申明非常有效,尤其是一些简短的兼容代码什么的。
可提供一个scss文件,整合了variables和mixin的功能,那样就可以方便新起样式文件,直接导入这个整合的文件,variables和mixin随便用组件的变量申明,可以放在各自的组件scss中,因为只有组件会用,而不是统一放在variables文件,这样显得variables文件比较臃肿mixin设计有点太多,连size都有一个mixin文件,感觉有点过。
前文已经说过,HTTPServer是派生自TCPServer,从协议层次上讲,这再自然不过。 从TCPServer的实现上看,它是一个通用的server框架,基本是按照BSD socket的思想设计的。create-bind-listen三段式一个都不少。 从helloworld.py往下追,可以看到: helloworld.py中的main函数创建了HTTPServer. HTTPServer继
我有一个相当标准的生产者和消费者线程: producer将文件中的字节读取并解码到阻塞队列中 消费者正在轮询队列中的项目 碰巧解码过程是一个瓶颈,可能会受益于更多的CPU。这是制作人70%的时间。如果我引入“解码器”线程,我会获得任何显著的性能吗? 生产者从文件中读取字节到阻塞“对象”队列 由于内存不足,我需要使用一个队列——无法承受两个队列(字节/项),所以我猜对象“转换”开销会出现吗? 有没有
链接 飞行模式 结构概述 飞行控制栈 中间件 混控和执行器 PWM限制状态机
问题内容: 我有一个Flask,SQLAlchemy webapp,它使用一个mysql服务器。我想将数据库设置扩展为具有只读从属服务器,以便可以在继续写入主数据库服务器的同时在主服务器和从属服务器之间分散读取。 我研究了几种选择,我相信我无法使用普通的SQLAlchemy做到这一点。我打算在我的web应用程序中创建2个数据库句柄,每个用于主数据库服务器和从数据库服务器。然后,使用简单的随机值
#include <stdio.h> #include <pthread.h> int a = 0; void *thread1_func(void *p_arg) { while (1) { printf("%d\n", a); sleep(10); } } int main(v
EXPLAIN信息解读 EXPLAIN语法 EXPLAIN输出信息 SELECT转换 指定了线上环境时SOAR会到线上环境进行EXPLAIN,然后对线上执行EXPLAIN的结果进行分析。由于低版本的MySQL不支持对INSERT, UPDATE, DELETE, REPLACE进行分析,SOAR会自动将这些类型的查询请求转换为SELECT请求再执行EXPLAIN信息。 另外当线上环境设置了read
Raft 新特性 Strong Leader 更强的领导形式 例如日志条目只会从领导者发送到其他服务器, 这很大程度上简化了对日志复制的管理 Leader Election 使用随机定时器来选举领导者 用最简单的方式减少了选举冲突的可能性 Membership Change 新的联合一致性 (joint consensus) 方法 复制状态机 1. 复制状态机通过日志实现 每台机器一份日志 每个日
第三部分: 源码解读 我们的最终目标是要使用Node.js开发一款像比特币一样的加密货币。很显然,在开始之前,如果有现成的经验可以学习借鉴,就不用再去“重复制造轮子”,这是目前开发领域的重要共识。 站在巨人肩上,一方面可以快速了解Node.js技术知识,一方面可以对加密货币有一个更加深刻的学习理解,一举两得。这部分咱们就来学习一款这样的产品,具体的方法是: 源码解读:掌握代码的功能,理清代码的运作