特色功能
- 完全兼容 CSS3
- 在 CSS 基础上增加变量、嵌套 (nesting)、混合 (mixins) 等功能
- 通过函数进行颜色值与属性值的运算
- 提供控制指令等高级功能
- 自定义输出格式
语法格式
SCSS
所有符合 CSS3 语法的样式表也都是具有相同语法意义的 SCSS 文件
Sass(缩排语法)
CSS拓展功能
选择器嵌套
1 | div { |
引用父元素 &
1 | a { |
属性嵌套
例如border-color属性嵌套
1 | div { |
占位符选择器 (%foo)
暂时空
注释
css注释
标准css注释,编译后保留
1 | /* |
sass注释
单行注释,只在sass中保留
1 | // 单行注释,只在sass中保留 |
重要注释
重要注释,在压缩文件中保留(通常为版本信息)
1 | /*! |
SassScript
在 CSS 属性的基础上 Sass 提供了一些名为 SassScript 的新功能。 SassScript 可作用于任何属性,允许属性使用变量、算数运算等额外功能。
变量
变量以美元符号开头,赋值方法与 CSS 属性的写法一样
块级作用域
变量支持块级作用域,嵌套规则内定义的变量只能在嵌套规则内使用(局部变量),不在嵌套规则内定义的变量则可在任何地方使用(全局变量)。
global
将局部变量转换为全局变量可以添加 !global
1 | div { |
数据类型
数字
1, 2, 13, 10px
字符串,有引号字符串与无引号字符串
“foo”, ‘bar’, baz
颜色
blue, #04a3f9, rgba(255,0,0,0.5)
布尔型
true, false
空值
null
数组 (list),用空格或逗号作分隔符
1.5em 1em 0 2em, Helvetica, Arial, sans-serif
1 | $stars: ( |
1 | $name:"lili","yaya","sansa"; //注意数组list的写法 |
maps, 相当于 JavaScript 的 object
(key1: value1, key2: value2)
1 | $name2: (name21:"lili", name22:"yaya", name23:"sansa"); |
运算
除法运算
/
在 CSS 中通常起到分隔数字的用途,SassScript 作为 CSS 语言的拓展当然也支持这个功能,同时也赋予了/
除法运算的功能。
- 如果值,或值的一部分,是变量或者函数的返回值
- 如果值被圆括号包裹
- 如果值是算数表达式的一部分
1 | p { |
颜色运算符
1 | p { |
当包含alpha channel 时,透明度必须相等才可以进行计算。
1 | p { |
alpha channel 调整
- opacify 增减
- transparentize 直接调整
1 | $translucent-red: rgba(255, 0, 0, 0.5); |
字符串运算
如果有引号字符串(位于
+
左侧)连接无引号字符串,运算结果是有引号的,相反,无引号字符串(位于+
左侧)连接有引号字符串,运算结果则没有引号。
1 | p:before { |
在有引号的文本字符串中使用
#{}
插值语句可以添加动态的值:
1 | p:before { |
布尔运算 (Boolean Operations)
SassScript 支持布尔型的
and
or
以及not
运算
数组运算 (List Operations)
数组不支持任何运算方式,只能使用 list functions 控制
圆括号
圆括号可以用来影响运算的顺序
1 | p { |
函数
关键词参数
关键词参数给函数提供了更灵活的接口,以及容易调用的参数。关键词参数可以打乱顺序使用,如果使用默认值也可以省缺,另外,参数名被视为变量名,下划线、短横线可以互换使用。
1 | p { |
&
1 | .foo.bar .baz.bang, .bip.qux { |
判断&是否存在
1 | @mixin does-parent-exist { |
变量定义 !default
变量是 null 空值时将视为未被 !default
赋值。
1 | $content: "First content"; |
@-Rules 与指令
@import
许其导入 SCSS 或 Sass 文件。
被导入的文件将合并编译到同一个 CSS 文件中
被导入的文件中所包含的变量或者混合指令 (mixin) 都可以在导入的文件中使用。
Sass 允许同时导入多个文件,例如同时导入 rounded-corners 与 text-shadow 两个文件:
1 | @import "rounded-corners", "text-shadow"; |
导入文件也可以使用
#{ }
插值语句,但不是通过变量动态导入 Sass 文件,只能作用于 CSS 的url()
导入方式:
注意:
通常,@import
寻找 Sass 文件并将其导入, 除以下情况:
- 文件拓展名是
.css
; - 文件名以
http://
开头; - 文件名是
url()
; @import
包含 media queries。
分音 (Partials)
如果需要导入 SCSS 或者 Sass 文件,但又不希望将其编译为 CSS,只需要在文件名前添加下划线
将文件命名为
_colors.scss
,便不会编译_colours.css
文件。
1 | @import "colors"; |
嵌套 @import
可以将
@import
嵌套进 CSS 样式或者@media
中,与平时的用法效果相同,只是这样导入的样式只能出现在嵌套的层中。
1 | // example.scss |
@media
允许其在 CSS 规则中嵌套
1 | .sidebar { |
@media 的 queries 允许互相嵌套使用,编译时,Sass 自动添加 and
1 | @media screen { |
@media
可以使用 SassScript(比如变量,函数,以及运算符)代替条件的名称或者值:
1 | $media: screen; |
@extend
一个选择器下的所有样式继承给另一个选择器
1 | .error { |
编译为
1 | .error, .seriousError { |
延伸复杂的选择器
Class 选择器并不是唯一可以被延伸 (extend) 的,Sass 允许延伸任何定义给单个元素的选择器
1 | .hoverlink { |
编译为
1 | a:hover, .hoverlink { |
多重延伸
同一个选择器可以延伸给多个选择器,它所包含的属性将继承给所有被延伸的选择器
多重延伸可以使用逗号分隔选择器名,比如
@extend .error, .attention;
与@extend .error;
@extend.attention
有相同的效果。
1 | .error { |
编译为
1 | .error, .seriousError { |
继续延伸
当一个选择器延伸给第二个后,可以继续将第二个选择器延伸给第三个
1 | .error { |
编译为:
1 | .error, .seriousError, .criticalError { |
选择器列
暂时不可以将选择器列 (Selector Sequences),比如
.foo .bar
或.foo + .bar
,延伸给其他元素可以将其他元素延伸给选择器列
合并选择器列
- 当两个列 (sequence) 合并时,如果没有包含相同的选择器,将生成两个新选择器:第一列出现在第二列之前,或者第二列出现在第一列之前:
1 | #admin .tabbar a { |
编译为
1 | #admin .tabbar a, |
- 如果两个列 (sequence) 包含了相同的选择器,相同部分将会合并在一起,其他部分交替输出。在下面的例子里,两个列都包含
#admin
,输出结果中它们合并在了一起:
1 | #admin .tabbar a { |
编译为
1 | #admin .tabbar a, |
@extend-Only 选择器
!optional 声明
在指令中延伸
Sass 不可以将
@media
层外的 CSS 规则延伸给指令层内的 CSS*如果在
@media
(或者其他 CSS 指令)中使用@extend
,必须延伸给相同指令层中的选择器。 *
1 | @media print { |
但不可以这样:
1 | .error { |
@at-root
将会渲染到根目录下而不是作用块内。
1 | .parent { |
编译为
1 | .parent { ... } |
@at-root (without: …)
1 | @media print { |
编译为:
1 | @media print { |
@at-root (with: …)
@debug
打印计算值到控制台,便于调试
@warn
打印标准错误输出流
@warn 和 @debug 的区别
- 可以使用 quiet 关闭警告
- 追踪栈也会一起打印出来,以便调试
1 | @mixin adjust-location($x, $y) { |
@error
抛出致命错误
1 | @mixin adjust-location($x, $y) { |
控制指令
控制指令是一种高级功能,日常编写过程中并不常用到,主要与混合指令 (mixin) 配合使用
if()
不建议使用
1 | div { |
@if
当 @if
的表达式返回值不是 false
或者 null
时,条件成立,输出 {}
内的代码:
1 | p { |
编译为
1 | p { |
@eles
1 | $type: monster; |
编译为
1 | p { |
@for
- @for $var from
through , [start, end] - @for $var from
to , [start, end)
1 | @for $i from 1 through 3 { |
@each
@each
指令的格式是 $var in
1 | @each $animal in puma, sea-slug, egret, salamander { |
Multiple Assignment
1 | @each $animal, $color, $cursor in (puma, black, default), |
编译为:
1 | .puma-icon { |
1 | @each $header, $size in (h1: 2em, h2: 1.5em, h3: 1.2em) { |
编译为:
1 | h1 { |
@while
@while
指令重复输出格式直到表达式返回结果为false
1 | $i: 6; |
1 | .item-6 { |
混合指令
定义混合指令 @mixin
混合指令的用法是在
@mixin
后添加名称与样式
1 | @mixin clearfix { |
引用混合样式 @include
1 | .page-title { |
参数
参数用于给混合指令中的样式设定变量,并且赋值使用(可以设定默认值 )
1 | @mixin sexy-border($color, $width: 1in) { |
关键词参数
类似于解构
1 | p { @include sexy-border($color: blue); } |
参数变量
可以使用参数变量 …
声明(写在参数的最后方)告诉 Sass 将这些参数视为值列表处理:
1 | @mixin box-shadow($shadows...) { |
编译为
1 | .shadowed { |
参数变量也可以用在引用混合指令的时候 (@include
)
1 | @mixin colors($text, $background, $border) { |
编译为
1 | .primary { |
向混合样式中导入内容
在引用混合样式的时候,可以先将一段代码导入到混合指令中,然后再输出混合样式,额外导入的部分将出现在 @content
标志的地方:
注意: 当 @content
在指令中出现过多次或者出现在循环中时,额外的代码将被导入到每一个地方。
1 | @mixin apply-to-ie6-only { |
编译为
1 | * html #logo { |
Variable Scope and Content Blocks
mixin的变量是块作用域不能在全局使用
1 | $color: white; |
编译为
1 | .colors { |
函数指令
1 | $grid-width: 40px; |
编译为
1 | #sidebar { |
与 mixin 相同,也可以传递若干个全局变量给函数作为参数。一个函数可以含有多条语句,需要调用 @return
输出结果。
输出格式
Sass 提供了四种输出格式,可以通过 :style option
选项设定,或者在命令行中使用 --style
选项。
:nested
Nested (嵌套)样式是 Sass 默认的输出格式,能够清晰反映 CSS 与 HTML 的结构关系。选择器与属性等单独占用一行,缩进量与 Sass 文件中一致,每行的缩进量反映了其在嵌套规则内的层数。当阅读大型 CSS 文件时,这种样式可以很容易地分析文件的主要结构。
1 | #main { |
:expanded
Expanded 输出更像是手写的样式,选择器、属性等各占用一行,属性根据选择器缩进,而选择器不做任何缩进。
1 | #main { |
:compact
Compact 输出方式比起上面两种占用的空间更少,每条 CSS 规则只占一行,包含其下的所有属性。嵌套过的选择器在输出时没有空行,不嵌套的选择器会输出空白行作为分隔符。
1 | #main { color: #fff; background-color: #000; } |
:compressed
Compressed 输出方式删除所有无意义的空格、空白行、以及注释,力求将文件体积压缩到最小,同时也会做出其他调整,比如会自动替换占用空间最小的颜色表达方式。
1 | #main{color:#fff;background-color:#000}#main p{width:10em}.huge{font-size:10em;font-weight:bold;text-decoration:underline} |