$age: 12;
body {
font-size: if($age > 10, 10px, 20px);
}
// => body {font-size: 10px;}
循环指令
@for循环
for循环有两种形式,分别为:@for $var from <start> through <end>和@for $var from <start> to <end>。 $i表示变量,start表示起始值,end表示结束值,这两个的区别是关键字through表示包括end这个数,而to则不包括end这个数。
// from ... through
@for $i from 1 through 3 {
.item-#{$i} {
width: 2em * $i;
}
}
// from ... to
@for $i from 1 to 4 {
.item-#{$i} {
width: 2em * $i;
}
}
中文文档:sass.hk 、sasschina 、
参考手册:http://www.tangshuang.net/3625.html
在线编译:https://www.sassmeister.com/
嵌套
选择器嵌套和
&
Sass 允许将一套 CSS 样式嵌套进另一套样式中,内层的样式将它外层的选择器作为父选择器。
嵌套功能避免了重复输入父选择器,而且令复杂的 CSS 结构更易于管理。
结果
属性嵌套
有些 CSS 属性遵循相同的命名空间 (namespace),比如
font-family, font-size, font-weight
都以font
作为属性的命名空间。跳出嵌套
@at-root
sass3.3.0中新增的功能,用来跳出选择器嵌套的。默认所有的嵌套,继承所有上级选择器,但有了这个就可以跳出所有上级选择器。
普通跳出嵌套
编译后:
without和with
默认
@at-root
只会跳出选择器嵌套,而不能跳出@media
或@support
,如果要跳出这两种,则需使用@at-root (without: media)
,@at-root (without: support)
。这个语法的关键词有四个:all
(表示所有),rule
(表示常规css),media
(表示media),support
(表示support,因为@support
目前还无法广泛使用,所以在此不表)。我们默认的@at-root
其实就是@at-root (without:rule)
。编译后:
@import
导入Sass 拓展了
@import
的功能,允许其导入 SCSS 或 Sass 文件。被导入的文件将合并编译到同一个 CSS 文件中,另外,被导入的文件中所包含的变量或者混合指令 (mixin) 都可以在导入的文件中使用。且Sass 允许同时导入多个文件。通常,
@import
寻找 Sass 文件并将其导入,但在以下情况下,@import
仅作为普通的 CSS 语句,不会导入任何 Sass 文件。.css
;http://
开头;url()
;@import
包含 media queries。如果不在上述情况内,文件的拓展名是
.scss
或.sass
,则导入成功。没有指定拓展名,Sass 将会试着寻找文件名相同,拓展名为.scss
或.sass
的文件并将其导入。分音 (Partials)
如果需要导入 SCSS 或者 Sass 文件,但又不希望将其编译为 CSS,只需要在文件名前添加下划线,这样会告诉 Sass 不要编译这些文件,但导入语句中却不需要添加下划线。
例如,将文件命名为
_colors.scss
,便不会编译_colours.css
文件。嵌套
@media
Sass 中
@media
指令允许其在 CSS 规则中嵌套。如果@media
嵌套在 CSS 规则内,编译时,@media
将被编译到文件的最外层,包含嵌套的父选择器。@media
的queries
允许互相嵌套使用,编译时,Sass 自动添加and
@media
也可以使用 SassScript(比如变量,函数,以及运算符)代替条件的名称或者值。变量
$Variables
变量以美元符号开头,赋值方法与 CSS 属性的写法一样。
变量支持块级作用域,嵌套规则内定义的变量只能在嵌套规则内使用(局部变量),不在嵌套规则内定义的变量则可在任何地方使用(全局变量)。将局部变量转换为全局变量可以添加
!global
声明。变量定义
!default
可以在变量的结尾添加
!default
给一个未通过!default
声明赋值的变量赋值,此时,如果变量已经被赋值,不会再被重新赋值,但是如果变量还没有被赋值,则会被赋予新的值。插值
#{$var}
通过
#{}
插值语句可以在选择器或属性名中使用变量。数据类型
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
(key1: value1, key2: value2)
SassScript 也支持其他 CSS 属性值,比如 Unicode 字符集,或
!important
声明。然而Sass 不会特殊对待这些属性值,一律视为无引号字符串。运算 Operations
1. 数字运算
SassScript 支持数字的加减乘除、取整等运算 (
+, -, *, /, %
),如果必要会在不同单位间转换值。关系运算
<, >, <=, >=
也可用于数字运算,相等运算==, !=
可用于所有数据类型。除法运算
/
(Division and/
)/
在 CSS 中通常起到分隔数字的用途,SassScript同时也赋予了/
除法运算的功能。以下三种情况
/
将被视为除法运算符号:2. 颜色值运算
3. 字符串运算
+
可用于连接字符串4. 布尔运算
SassScript 支持布尔的
and
or
和not
运算5. 数组运算
数组不支持任何运算方式,只能使用 list functions 控制。
条件判断
@if
判断当
@if
的表达式返回值不是false
或者null
时,条件成立,输出{}
内的代码。三目判断
语法为:
if($condition, $if_true, $if_false)
。三个参数分别表示:条件,条件为真的值,条件为假的值。循环指令
@for
循环for循环有两种形式,分别为:
@for $var from <start> through <end>
和@for $var from <start> to <end>
。 $i表示变量,start表示起始值,end表示结束值,这两个的区别是关键字through表示包括end这个数,而to则不包括end这个数。编译后的结果都是一样的:
@each
循环语法为:
@each $var in <list or map>
。其中$var
表示变量,而list和map表示list类型数据和map类型数据。1. 单字段list数据循环
2. 多字段list数据循环
3. 多字段map数据循环
@while
循环混合
@mixin
混合指令(Mixin)用于定义可重复使用的样式,避免了使用无语意的 class,比如
.float-left
。混合指令可以包含所有的 CSS 规则,绝大部分 Sass 规则,甚至通过参数功能引入变量,输出多样化的样式。1. 无参数
编译后:
2. 有参数
参数用于给混合指令中的样式设定变量,并且赋值使用。在定义混合指令的时候,按照变量的格式,通过逗号分隔,将参数写进圆括号里。引用指令时,按照参数的顺序,再将所赋的值对应写进括号。
编译后:
3. 多参数
混合指令也可以使用关键词参数。
编译后:
4. 多组值参数
有时,不能确定混合指令需要使用多少个参数,比如一个关于
box-shadow
的混合指令不能确定有多少个 'shadow' 会被用到。这时,可以使用参数变量…
声明(写在参数的最后方)告诉 Sass 将这些参数视为值列表处理,如$variables...
编译后:
参数变量也可以用在引用混合指令的时候 (@include),与平时用法一样,将一串值列表中的值逐条作为参数引用
编译后:
5.
@content
传递样式片段编译后:
继承
@extend
sass中,选择器继承可以让选择器继承另一个选择器的所有样式,并联合声明。使用选择器的继承,要使用关键词
@extend
,后面紧跟需要继承的选择器。Class 选择器
并不是唯一可以被延伸 (extend) 的,Sass 允许延伸任何定义给单个元素的选择器,比如.special.cool
,a:hover
或者a.user[href^="http://"]
等@extend
还可以多重延伸,继续延伸。编译后:
缺点:
@extend
命令不够灵活,不能向它传递参数(对比@mixin
)@media
中有限制,比如不能横跨多个@media
指令使用@extend
@extend
增加了选择器之间的联系占位选择器
%
占位选择器以
%
标识定义,通过@extend
调用。编译后:
函数
@function
sass定义了很多函数可供使用,当然也可以自己定义函数,以
@fuction
开始。 sass的官方函数链接为:sass fuction,实际项目中我们使用最多的应该是颜色函数,而颜色函数中又以lighten减淡和darken加深为最,其调用方法为lighten($color,$amount)
和darken($color,$amount)
,它们的第一个参数都是颜色值,第二个参数都是百分比。编译后: