一、 SASS
sass 采用编程式的写法来编写样式表,最后编译成我们常见的css样式表。
二、 安装
SASS 由 Ruby 语言编写,但是不懂Ruby,不妨碍我们学习使用 SASS,因为两者之间没有关联性。
唯一的条件是必须在 Ruby 环境下运行 SASS。SASS 是普通的文本文件,兼容 css 语法。
SASS 文件的后缀名为 .sass 或者 .scss。严重推荐使用 .scss 写法
.sass 语法
1 | body |
.scss 语法
1 | body { |
安装 Ruby 之后,安装 SASS
1 | gem install sass |
三、 命令
显示 test.scss 文件编译后的 css 代码:
1 | sass test.scss |
将 test.scss 文件编译后的 css 代码保存到 test.css 文件:
1 | sass test.scss test.css |
或者写成
1 | sass test.scss:test.css |
1. 编译风格
nested:嵌套缩进的css代码,默认
expanded:没有缩进的、扩展的css代码
compact:简洁格式的css代码
compressed:压缩后的css代码,一般用于生产环境
i. 使用 nested 风格
1 | sass test.scss test.css --style nested |
1 | body { |
ii. 使用 expanded 风格
1 | sass test.scss test.css --style expanded |
1 | body { |
iii. 使用 compact 风格
1 | sass test.scss test.css --style compact |
1 | body {background: #eee;font-size:12px;} |
iv. 使用 compressed 风格
1 | sass test.scss test.css --style compressed |
1 | body{background:#eee;font-size:12px;}p{background:#0982c1;}p span{color:red;} |
2. 监听某个文件或目录,一旦文件被修改,立即编译
监听一个文件1
sass --watch test.scss test.css
监听一个目录1
sass --watch app/sass output/stylesheets
四、 基本写法
1. File Encoding
如果 SASS 文件中存在中文等其他字符,一般是注释,请在文件第一行写上:
1 | @charset "utf-8"; |
2. 变量
所有变量以 $ 开头
1 | $width: 10px !default; // 默认变量 |
3. 变量的作用域
1 | $color: blue; // 定义变量1 |
编译后1
2
3
4
5
6
7
8
9nav span{
color: blue;
}
nav ul{
color: red;
}
nav p{
color: blue;
}
4. 选择器嵌套
使用 & 表示父级
1 | #top_nav { |
编译后1
2
3
4
5
6
7
8#top_nav a {
padding: 0 10px;
color: #fff;
}
#top_nav a:hover {
color: #ddd;
}
5. 属性嵌套
1 | .wrap { |
编译后1
2
3
4.wrap {
font-size: 14px;
font-weight: bold;
}
6. 混合申明
i. 无参数
1 | @mixin radius1 { |
ii. 有参数( 变量[:默认值] )
1 | @mixin radius2($radius: 3px) { |
iii. 多个参数
- 声明一个混合boxSize,有两个参数高度和宽度
- 在.box中调用此混合并为赋值宽度100px,高度200px
1 | @mixin boxSize($width: 10px, $height: 100px) { |
编译后1
2
3
4
5.box,
.box2 {
width: 100px;
height: 200px;
}
iv. 多组值参数
1 | @mixin box-shadow($shadow...) { |
7. 继承
i. 简单继承
1 | a { |
ii. 继承多个选择器
1 | .one { |
8. 选择器占位符 %
没有被继承的选择器占位不会被编译成css
1 | %bgd { |
编译后 (此处没有编译scss中的占位选择器 %bgd )
1 | .btn, .block { |
五、 进阶
1. 数据类型
SassScript 支持的6种数据类型
- 数字(例如 1.2、13、10px)
- 文本字符串,无论是否有引号(例如 “foo”、’bar’、baz)
- 颜色(例如 blue、#04a3f9、rgba(255, 0, 0, 0.5))
- 布尔值(例如 true、false)
- 空值(例如 null)
- 值列表,用空格或逗号分隔(例如 1.5em 1em 0 2em、 Helvetica, Arial, sans-serif)
SassScript 还支持所有其他 CSS 属性值类型,例如 Unicode 范围和 !important 声明。然而,它不会对这些类型做特殊处理。 它们只会被当做不带引号的字符串看待。
2. 插值语句 #{}
使用 #{} 插值语句 (interpolation) 时,有引号的字符串将被编译为无引号字符串
如果你希望在纯 CSS 中使用变量和斜杠(/), 你可以用 #{} 包住变量。
1 | p { |
编译后1
2
3p {
font: 12px/30px;
}
在文本字符串中,#{} 形式的表达式可以被用来在字符串中添加动态值:1
2
3p:before {
content: "I ate #{5 + 10} pies!";
}
编译后1
2
3p:before {
content: "I ate 15 pies!";
}
3. 字符串运算:
i. “+” 可以用来连接字符
1 | p { |
编译后1
2
3p {
cursor: e-resize;
}
ii. 有引号和无引号的连接规则:遵循 “+” 左边字符串的规则
1 | p:before { |
编译后1
2
3
4p:before {
content: "Foo Bar";
font-family: sans-serif;
}
4. 空值(null)会被视作空字符串
1 | $value: null; |
编译后1
2
3p:before {
content: "I ate pies!";
}
5. @if 判断
除非你的代码中有偏复杂的逻辑,否则没必要在日常开发的样式表中使用条件语句。
实际上,条件语句主要适用于库和框架。
无论何时,如果你感觉需要它们,请遵守下述准则:
- 除非必要,不然不需要括号;
- 务必在 @if 之前添加空行;
- 务必在左开大括号( { )后换行;
- @else 语句和它前面的右闭大括号( } )写在同一行;
- 务必在右闭大括号( } )后添加空行;
- 除非下一行还是右闭大括号( } ),那么就在最后一个右闭大括号( } )后添加空行。
1 | p { |
编译后1
2
3p {
border: 1px solid;
}
@if @else 结合使用方法
1 | p { |
编译后1
2
3p {
width: 30px;
}
6. 三目运算符
1 | if($condition, $condition_true, $condition_false) |
三个参数分别表示:条件,条件为真的值,条件为假的值。
PS:这个 if 没有 @ 前缀,和 @if 判断不同
1 | $fontBold: true; |
编译后1
2
3p {
font-weight: bold;
}
7. for 循环
使用 @for 指令
@for 循环有两种方式:1
@for $i from start through end {}
1 | @for $i from start to end {} |
$i: 表示变量
start: 表示起始值
end: 表示结束值
区别:through 表示包括 end 这个数,而 to 则不包括 end 这个数
i. through
1 | @for $i from 1 through 3 { |
编译后1
2
3
4
5
6
7
8
9
10
11.item-1 {
width: 2em;
}
.item-2 {
width: 4em;
}
.item-3 {
width: 6em;
}
ii. to
1 | @for $i from 10 to 30 { |
编译后1
2
3
4
5
6.item-1 {
width: 2em;
}
.item-2 {
width: 4em;
}
8. each 循环
each 循环就是去遍历一个列表,然后从列表中取出对应的值。
使用 @each 指令
1 | @each $var in <list> |
$var: 变量名
< list >: SassScript 的数据类型–值列表,它将返回一个列表值。
1 | @each $animal in puma, egret, salamander { |
编译后1
2
3
4
5
6
7
8
9.puma-icon {
background-image: url('/course/img/puma.png');
}``
.egret-icon {
background-image: url('/course/img/egret.png');
}
.salamander-icon {
background-image: url('/course/img/salamander.png');
}
9. while循环
使用 @while 指令
@while 指令需要 SassScript 表达式,并且会生成不同的样式块。
直到表达式的值为 false 时停止循环,这个和 for 循环很相似,只要 @while 后面的表达式的值为 true 就会执行。
1 | $i: 6; |
编译后1
2
3
4
5
6
7
8
9.item-6 {
width: 12em;
}
.item-4 {
width: 8em;
}
.item-2 {
width: 4em;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////// 我是华丽的分割线 ///////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////
PS: 想开启开挂模式,请继续往下读
六、 函数
1. 颜色函数
rgb($red,$green,$blue):根据红、绿、蓝三个值创建一个颜色;
rgba($red,$green,$blue,$alpha):根据红、绿、蓝和透明度值创建一个颜色;
red($color):从一个颜色中获取其中红色值;
green($color):从一个颜色中获取其中绿色值;
blue($color):从一个颜色中获取其中蓝色值;
mix($color-1,$color-2,[$weight]):把两种颜色混合在一起。
测试:在终端中开启 SASS 的颜色计算
1 | sass -i |
根据 r:200, g:40, b:88 计算出一个十六进制颜色值: #c828581
rgb(200,40,88)
根据 #c82858 的 65% 透明度计算出一个 rgba 颜色值: rgba(200, 40, 88, 0.65)1
rgba(#c82858,.65)
从 #c82858 颜色值中得到红色值200 2001
red(#c82858)
从 #c82858 颜色值中得到绿色值40 401
green(#c82858)
从 #c82858 颜色值中得到蓝色值88 881
blue(#c82858)
把 #c82858 和 rgba(200, 40, 88, .65) 两颜色按比例混合得到一个新颜色 rgba(200, 40, 80, 0.65105)1
mix(#c82858, rgba(200,40,80,.65), .3)
2. 列表函数
length($list):返回一个列表的长度值;
PS: length()函数中的列表参数之间使用空格隔开,不能使用逗号,否则函数将会出错
nth($list, $n):返回一个列表中指定的某个标签值
join($list1, $list2, [$separator]):将两个列给连接在一起,变成一个列表;
append($list1, $val, [$separator]):将某个值放在列表的最后;
zip($lists…):将几个列表结合成一个多维的列表;
index($list, $value):返回一个值在列表中的位置值。
1 | length(10px); // 1 |
3. 更多函数请查阅文档
其实 SASS 函数在一般的项目中基本用不上,除了写写插件装装B,能用上的场合是…… 思来想去,也没想出来那里用最合适!!