本文github地址:
git clone https://github.com/davenkin/sass-learning.git
安装SASS
cnpm install -g sass
SASS有2中格式,一种是早期具有缩进风格的sass文件,一种是当前推荐的scss文件,scss文件完全兼容css文件,因此css文件可以直接修改后缀名而变为scss文件,本文采用scss文件格式。
在名为styles的目录下创建scss文件test.scss:
$primary : #434433;
html {
text-color: $primary;
}
这里我们使用了SASS中的变量功能,然后用sass命令进行编译:
sass test.scss test.css
也可以对整个目录进行编译:
sass --watch styles:out
表示监视styles目录下的所有scss文件, 并将它们编译到out目录下。此时SASS会以scss文件为单位进行编译,partial文件除外(下文有讲解)。
变量
变量为标有$
前缀的符号,其定义方式跟css的键值对形式一样:
$variable : value
可以本scss文件中进行定义,也可以引用@import
文件中的变量。
@import
标准css的@import
会发起一次额外的HTTP请求,而SASS在编译的过程中便已经对@import
的内容进行了合并。但是在以下情况下,SASS不会处理@import
,而是照原样输出到css文件中:
- @import "colors.css"; //the .css extension is specified
- @import http://test.com/colors.css; //the http:// prefix is used
- @import "colors" screen; //the import statement includes a media query
- @import url(colors); //the url() function is used
如果多个scss文件import了同一份文件,那么这份文件的内容将重复出现在多个文件中,这可能会导致最终所有css合并到一起之后出现重复。
在styles目录下创建global.scss文件已被多个文件import:
body {
color:blue;
}
修改test.scss文件,import上面的global.scss文件:
@import './global';
$primary : #434433;
html {
color: $primary;
}
另外创建test2.scss文件,同样import global.scss文件:
@import './global';
$secendary : red;
div {
color: $secendary;
}
运行scss --watch styles:out
,在out目录下输出test.css:
body {
color: blue;
}
html {
color: #434433;
}
test2.css内容:
body {
color: blue;
}
div {
color: red;
}
可以看到,body内容在两份文件中重复了,对此,建议的方式是,一是保证一个文件只被import一次,二是只在被import的文件中定义变量、mixin等信息。
Partial文件
前文提到,SASS会以文件为单位进行编译,如果不想某个scss文件单独编译,可以将其处理为partial文件,也即在文件名前加上一个下划线,比如_base.css
继承
可以通过@extend
可以对css进行继承:
.button-base {
radius: 2px;
margin: 5px;
}
.menu-button {
@extend .button-base;
background-color: blue;
color: white;
}
此时button-base和menu-button会同时输出,但是有时我们只想button-base作为继承的模板使用,就像java中的抽象类一下,此时可以使用placeholder selector
,即在button-base前面去掉点.
,另加上百分号%
:
%button-base {
radius: 2px;
margin: 5px;
}
嵌套
#main {
p {
color:black;
}
}
会被编译成:
#main p {
color: black;
}
引用parent selector
有时我们希望在child选择符中加上parent选择符的前缀,此时可以通过特殊的&
符号引用parent选择符,SASS通过类似于文本替换的方式将&
替换为parent选择符。
a {
color: red;
&:hover{
color: green;
}
}
将被编译为:
a {
color: red;
}
a:hover {
color: green;
}
另一个例子:
#main {
color: blue;
&-header {
color: yellow;
}
}
将被编译成:
#main {
color: blue;
}
#main-header {
color: yellow;
}
网友评论