Sass 快速入门
gem install sass
注:sass文件的后缀名是.scss
或.sass
,博主使用.scss
。当然,除了Sass的语法,代码里面也可以直接使用CSS语法。
确认是否安装:sass -v
如果安装成功,会打印出版本信息:
Sass 3.4.23
sass input.scss output.css
sass --watch input.scss:output.css
这样,每次修改并保存时都会自动编译输出。
此外,你也可以监视整个文件夹的变化:
sass --watch app/sass:public/stylesheets
输出风格
nested
: 嵌套缩进的css代码,它是默认值。expanded
: 标准格式的代码compact
: 行格式的代码compressed
: 压缩后的代码,一般用于生产环境
sass --style compressed input.scss output.css
四种输出风格对比:
div {
background: red;
p { color: blue; }
}
/* nested */
div {
background: red; }
div p {
color: blue; }
/* expanded */
div {
background: red;
}
div p {
color: blue;
}
/* compact */
div { background: red; }
div p { color: blue; }
/* compressed */
div{background:red}div p{color:blue}
更多帮助命令:sass --help
基础语法
$
美元符号来声明变量:
$blue: blue;
直接使用:
div { color: $blue; }
在Sass中,变量是有作用域的,类似ES6中的let,sass变量支持块级作用域(花括号{}包裹区域),也就是有全局变量和局部变量之分:
$blue: blue; // 全局变量
div {
$blue: red; // 局部变量
color: $blue; // red
}
输出为:
div {
color: red; }
当然,也可以使用!global
将局部变量转换为全局变量:
div {
$red: red !global;
color: red;
}
a {
color: $red;
}
输出为:
div {
color: red; }
a {
color: red; }
注意:如果上面的red后面不加上!global
,Sass会报错,你可以在终端或输出文件比如output.css里看到错误。
此外,变量也可以拼接在CSS属性里,不过要借助插值语句(#{}
):
$theme: ".dark";
#{$theme} div {
color: black
}
输出为:
.dark div { color: black; }
也可以这样:
$side: top;
div {
border-#{$side}-color: red;
}
输出为:
div {border-top-color: red; }
注:如果传入的是字符串,插值语句输出的最终都是不带引号的字符串
div {
color: black;
a { color: red;}
}
输出为:
div { color: black; }
div a { color: red; }
多层嵌套:
div {
p, span{
color:red;
a {font-size: 15px;}
}
}
输出为:
div p, div span { color: red; }
div p a, div span a { font-size: 15px; }
CSS中,有些属性拥有相同的命名空间,比如font-size,font-weight等,对于这些属性,我们也可以使用属性嵌套:
div {
font: {
size: 10px;
weight: bold;
}
}
输出为:
div { font-size: 10px; font-weight: bold; }
注意font后面的冒号(:
)。
此外,还可以这样:
div {
font: 15px {
size: 10px;
weight: bold;
}
}
输出为:
div { font: 15px; font-size: 10px; font-weight: bold; }
父元素&
&
表示父元素。
a {
&:hover { color: red; }
}
输出为:
a:hover { color: red; }
当有多层嵌套样式时,&
表示它所有祖先元素的拼接:
div {
a {
&:hover { color: red; }
}
}
输出为:
div a:hover { color: red; }
此外,&
还可以作为选择器的一部分:
.main {
&-content { color: red; }
}
输出为:
.main-content { color: red; }
注释
- 多行注释: /* */
- 单行注释 //
- !多行注释: /*! */,通常用于添加版权信息
- 单行注释不会输出到CSS文件,多行注释会
- 单行注释和多行注释不会输出到压缩CSS文件中,而!多行注释会
#{}
)也可以用到多行注释中
$version: "1.0.0";
/* 当前版本: #{$version} */
输出为:
/* 当前版本: 1.0.0 */
运算
+, -, *, /, %
)
关系运算 <, >, <=, >=
也可用于数字运算,相等运算 ==, !=
可用于所有数据类型
div {
font-size: 10px + 10px;
height: 40px - 5px;
width: 100 % 3px;
}
输出为:
div { font-size: 20px; height: 35px; width: 1px; }
注意:在进行加减乘除时,建议使用统一单位,否则就需记住哪些单位是可以转换,哪些是不可以转换的,稍不注意,Sass就会报错。
/
)是有用途的(比如定义圆角的不同半径时,border-radius: 10px/20px,表示水平半径为10px,垂直半径为20px),所以在Sass中使用时要注意,只有下面三种情况才会被视为除法运算:
- 如果值被圆括号包裹: (20px / 10px)
- 如果值是算数表达式的一部分: (10px + 20px / 10px)
- 如果值的一部分是变量或函数的返回值:$width / 10
#{}
):
div { #{$font-size}/#{$line-height}; }
如JavaScript中的+
号一样,Sass中的+号也可以连接字符串:
div { cursor: e + -resize; }
输出为:
div { cursor: e-resize; }
控制语句
@if
语句类似JavaScript中的if语句,当 @if
的表达式返回值不是 false 或者 null 时,条件成立,输出 {} 内的代码:
div {
@if 3 > 2 { color: red; }
@if null { color: black; }
}
输出为:
div { color: red; }
@if
声明后面可以跟多个 @else if
声明,或者一个 @else
声明。如果 @if
声明失败,Sass 将逐条执行 @else if
声明,如果全部失败,最后执行 @else
声明:
div {
@if 1 > 2 {
color: red;
} @else if 3 > 2 {
color: blue;
} @else {
color: black;
}
}
输出为:
div { color: blue; }
注: 控制语句也可以在最外层使用.
@for $var from start through end {}
@for $i from 1 through 3 {
.large-#{$i} { font-size: 10px * $i; }
}
输出:
.large-1 { font-size: 10px; }
.large-2 { font-size: 20px; }
.large-3 { font-size: 30px; }
@for $var from start to end {}
例子:
@for $i from 1 to 3 {
.large-#{$i} { font-size: 10px * $i; }
}
输出为:
.large-1 { font-size: 10px; }
.large-2 { font-size: 20px; }
如果你留意了上面的例子,应该可以发现through
和to
的区别:
当使用 through 时,条件范围包含 <start> 与 <end> 的值,而使用 to 时条件范围只包含 <start> 的值不包含 <end> 的值。
注意:start和end必须是整数@each $var in <list>
<list>是一系列以逗号分隔的值列表(数组):
@each $icon in user, nav, person {
.#{$icon}-icon {
background-image: url('/images/#{$icon}.png');
}
}
输出为:
.user-icon { background-image: url("/images/user.png"); }
.nav-icon { background-image: url("/images/nav.png"); }
.person-icon { background-image: url("/images/person.png"); }
对于多维数组:
@each $var1, $var2 in ($value,$value), ($value,$value)
例子:
@each $font, $size in (large-1, 10px), (large-2, 20px) {
.#{$font} {
font-size: $size;
}
}
输出为:
.large-1 { font-size: 10px; }
.large-2 { font-size: 20px; }
对于元素是键值对形式的数组:
@each $key, $value in (key: value, key: value)
例子:
@each $selector, $size in (div: 10px, p: 20px) {
#{$selector} {
font-size: $size;
}
}
输出为:
div { font-size: 10px; }
p { font-size: 20px; }
@while
$i: 6;
@while $i > 0 {
.item-#{$i} { width: 2em * $i; }
$i: $i - 2;
}
代码重用(Mixin和extend)
@mixin
语句来定义需要重复使用的代码,比如说清除浮动:
@mixin clearfix {
&:after {
content: "";
display: block;
height: 0;
clear: both;
visibility: hidden;
}
}
使用@include
语句来使用Mixin定义的代码:
div { @include clearfix; }
输出为:
div:after { content: ""; display: block; height: 0; clear: both; visibility: hidden; }
@mixin
语句还可以带参数和参数默认值:
@mixin text-font($size, $weight, $color: black) {
font: {
size: $size;
weight: $weight;
}
color: $color;
}
p { @include text-font(10px, bold); }
输出为:
p { font-size: 10px; font-weight: bold; color: black; }
$name...
):
@mixin box-shadow($shadows...) {
box-shadow: $shadows;
}
div {
@include box-shadow(0 0 3px black, 0 0 5px red);
}
输出为:
div { box-shadow: 0 0 3px black, 0 0 5px red; }
此外,多余参数也可以用在传参时:
@mixin colors($text, $background, $border) {
color: $text;
background-color: $background;
border-color: $border;
}
$values: #ff0000, #00ff00, #0000ff;
.primary {
@include colors($values...);
}
输出为:
.primary { color: #ff0000; background-color: #00ff00; border-color: #0000ff; }
@mixin blue-theme($background, $color) {
background: $background;
color: $color;
}
一般我们是如下调用:
div { @include blue-theme(red, white); }
但我们也可以忽略传参的顺序,传参时以键值对的形式传参:
div { @include blue-theme($color: white, $background: red); }
两种方式都会输出:
div { background: red; color: white; }
注意点:
@mixin
可以用 = 表示,而@include
可以用 + 表示@include
不仅可以用在块内,也可以直接用在最外层
@extend
语句用来实现继承:
.large {
font-size: 20px;
font-weight: bold;
}
.main {
@extend .large;
background: red;
}
输出为:
.large, .main { font-size: 20px; font-weight: bold; }
.main { background: red; }
@extend
实现的继承是继承所有:
.large {
font-size: 20px;
font-weight: bold;
}
.large.blue {
color: blue;
}
.main {
@extend .large;
background: red;
}
输出为:
.large, .main { font-size: 20px; font-weight: bold; }
.large.blue, .blue.main { color: blue; }
.main { background: red; }
@function
语句来声明函数:
@function large($n) {
@return $n * 2;
}
div { font-size: large(10px); }
输出为:
div { font-size: 20px; }
注:自定义函数也支持不定序传参和多余参数.import
,Sass也支持import
:@import "color.scss";
如有任何疑问或建议,欢迎在下方的评论区留言!