第一次写博, 不好之处请多多包含
工欲善其事必先利其器, 首先, 我们要先了解下什么是CSS预处理器
In my opinion, CSS预处理器中的"预", 我们可以理解为"将要", 一个将要去处理CSS的工具, 那么他这里面应该包含有变量, 嵌套, 混入, 继承, 逻辑运算, 导入, 函数, 运算符等程序设计功能, 那么拥有一系列编码逻辑的功能, 肯定能够减少代码的冗余性, 提升可维护性等, 因此, CSS预处理器应该是一个具备程序设计特点的CSS语言.
目前比较主流的CSS预处理器有: less, sass, stylus, 他们的扩展名分别是.less .scss .styl
这里我们只讨论SASS
先扔一个官网: https://www.sass.hk/docs/ 具体语法官网更详细, 这里就不再浪费笔墨了, 只总结下学习过程中遇到的坑.
-
环境搭建和sass的使用
sass工具的下载和安装官网已经非常详细了, 这里不再阐述.
使用上, 特别是初学者, 比较推荐通过监视sass文件的方式来学习, 这条命令类似热加载, 编写完能立刻知道转换成css后的样式
注意: 通过_开头的scss文件, 系统会认为@import文件, 将不会输出对应的css文件
// 监视单个 Sass 文件,每次修改并保存时自动编译 sass --watch input.scss:output.css //其中input.scss是源文件 output.css是输出文件 // 监视整个文件夹 sass --watch source_file:aim_file //source_file源文件夹 aim_file目标文件夹 若想表示当前目录用
想了解更多关于sass命令, 在命令行中使用sass --help
说完了环境搭建, 下面我们来聊聊语法
-
嵌套规则: 将一套CSS样式嵌套进另一套样式中, 内层的样式将它外层的选择器作为父选择器.
嵌套功能避免了重复输入父选择器
// .scss
#main {
color: red;
.p { color: green; }
}
// 编译后.css
#main { color:red; }
#main .p { color: green; }
-
父选择器&
我们在使用嵌套时候会遇到一个难题, 如果想要为某个元素设定hover样式时, 使用嵌套:hover前会出现一个空格, 这不是我们预期的效果
或者当body元素有某个classname时, 可以用&代表嵌套规则未曾的父选择器
例:
//.scss
a {
color: red;
:hover { color: green; }
body .firefox { font-weight: normal }
}
//.css
a { color: red;}
a :hover { color: green; } // a和:hover之间有个空格, 不是我们预期的结果
a body .firefox { font-weight: normal } // 我们是想要把a放在.firefox后面的
此时&登场了
//.scss
a {
color: red;
&:hover { color: green; }
body .firefox & { font-weight: normal }
}
//.css
a { color: red;}
a:hover { color: green; }
body .firefox a { font-weight: normal }
-
注释
现在有个需求, 期望编译后的css文件中不要存在太多的注释, 毕竟这段代码要上线的, 而源文件中保留注释, 可以方便我们维护, 那么, 在Sass中提供了一套注释机制, 支持标准的CSS多行注释/* */, 以及单行注释// 前者会被完整的输出到编译后的CSS文件中, 后者不会.
-
@mixin和@include
@mixin可以理解为输入, 他和@include结合使用, 而@include理解为输出, 即将@mixin定义的内容插入到@include引用的地方.
// .scss
// 通过@mixin定义一个公共内容
@mixin center-block{
margin-left: auto;
margin-right: auto;
}
// 通过@include插入到样式中
#header {
width: 1000px;
@include center-block;
}
// .css
#header {
width: 1000px;
margin-left: auto;
margin-right: auto;
}
-
@mixin的参数和默认值
之前开头说了, 预编译器是具有程序设计功能的, 我们可以将@mixin理解为定义一个函数, 既然是函数, 肯定少不了参数这个概念
无默认值情况, 无默认值情况下, 该传不传, 编译会出错
// .sass
@mixin float($float){
float: $float;
}
#header {
@include float(left) //传left参数
}
//.css
#header {
float: left;
}
带默认值
// .sass
@mixin float($float: left){ // 定义参数left
float: $float;
}
#header {
@include float(right) //传right参数
}
//.css
#header {
float: right;
}
-
@mixin多个属性, 在变量后面加...可为一个变量定义多个参数值
// .sass
@mixin box($shadow) {
-webkit-box-shadow: $shadow;
-moz-box-shadow: $shadow;
}
.shadow-box1 {
@include box(1px 1px 1px red); //这个可正常编译
}
.shadow-box2 {
@include box(1px 1px 1px red, inset 3px 3px 3px green); //编译报错, 原因在于, 这里只定义了一个参数值
}
// 若要让这条编译通过, 只需在$shadow后加...
@mixin box($shadow...) {
-webkit-box-shadow: $shadow;
-moz-box-shadow: $shadow;
}
-
@mixin之@content
首先要知道, @content是应用在@mixin里面的
当没有@content的时候, 我们所有的样式都是在@mixin中定义好的, @include引用了这段样式, 但是@content的到来改变了这一规则, 他的作用是定义选择器, 可以理解为当@content存在时, 将@include中的内容插入到@content中
// .scss
@mixin box {
#box1 { @content; } // 此刻将@include 中的结构块插入到@content中, @content和@include的结构块是相辅相成的, 结构块理解为{}中内容
}
@include box {
width: 100px;
height: 200px;
}
// .css
#box1 {
width: 100px;
height: 200px;
}
这次先写到这先吧..
撤了, 撤了
来源:oschina
链接:https://my.oschina.net/u/4265383/blog/3887519