1:使用变量
1-1:变量声明
SASS使用$符号来标识变量。
$heignt-color: #F90;
变量可以在CSS规则块定义之外存在。当变量定义在CSS规则块内,那么该变量只能在此规则块内使用。当变量定义在了规则块外,那么该变量可以在任何地方使用。
1-2:变量引用
当引用变量后,如果你需要一个不同的值,只需要改变这个变量的值,则所有引用此变量的地方生成的值都会随之改变。
在声明变量时,变量值也可以引用其他的变量。
$height-color: #F90;
.selected{
border: 1px solid $height-color;
}
1-3:变量名用中划线还是下划线分割
SASS变量名可以用中划线或者下划线分割。
2:嵌套CSS规则
在SASS中,一个给定的规则块,即可以像普通的CSS那样包含属性,又可以嵌套其他规则块。
#content{
article{
h1{ color: #333 }
}
}
2-1:父选择器的标识符 &
当包含父选择器标识符的嵌套规则被打开时,它不会像后代选择器那样进行拼接,而是&被父选择器直接替换。
article a{
color: blue;
&:hover{
color: red;
}
}
父选择器标识符的另外一种写法,可以在父选择器之前添加选择器。
#content aside{
color: red;
body.ie & {
color: green;
}
}
2-2:群组选择器的嵌套
当SASS解开一个群组选择器规则内嵌的规则时,它会把每一个内嵌选择器的规则都正确地解出来。
.content{
h1,h2,h3{
margin-bottom: .8em;
}
}
nav,aside {
a{
color: blue;
}
}
2-3:子组合选择器和同层组合选择器 > + ~
你可以用子组合选择器>选择一个元素的直接子元素。
也可以用同层相邻组合选择器 + 选择某个元素后紧跟的元素。
也可以用同层全体组合选择器 ~,选择所有跟在某个元素后的同层元素。
article {
~ article { border-top: 1px dashed #ccc }
> section { background: #eee }
dl > {
dt { color: #333 }
dd { color: #555 }
}
nav + & { margin-top: 0 }
}
2-4:嵌套属性
把属性名从中划线的地方断开,在根属性后边添加一个冒号:,紧跟一个{ },把子属性部分写在这个 { }块中。
nav{
border:{
style: solid;
width: 1px;
color: #ccc;
}
}
nav{
border: 1px solid #ccc {
left: 0px;
right: 0px;
}
}
3:导入SASS文件
CSS有一个特别不常用的特性,即@import规则,它允许在一个CSS文件中导入其他的CSS文件。
3-1:使用SASS部分文件
当通过@import把sass样式分散到多个文件时,你通常只想生成少数几个css文件。那些专门为@import命令而编写的sass文件,并不需要生成对应的独立css文件,这样的sass文件称为局部文件。对此,sass有一个特殊的约定来命名这些文件。
此约定即,sass局部文件的文件名以下划线开头。这样,sass就不会在编译时单独编译这个文件输出css,而只把这个文件用作导入。当你@import一个局部文件时,还可以不写文件的全名,即省略文件名开头的下划线。举例来说,你想导入themes/_night-sky.scss这个局部文件里的变量,你只需在样式表中写@import “themes/night-sky”;。
3-2:默认变量值
使用SASS的!default标签来实现默认值。
$fancybox-width: 400px !default;
.fancybox{
width: $fancybox-width;
}
3-3:嵌套导入
SASS允许@import命名写在CSS规则内。这种导入方式下,生成的对应的CSS文件时,局部文件会被直接插入到CSS规则内导入它的地方。被导入的局部文件中定义的所有变量和混合器,也会在这个规则范围内生效。这些变量和混合器不会全局有效。
举例说明,有一个名为_blue-theme.scss的局部文件:
aside {
background: blue;
color: white;
}
.blue-theme {@import "blue-theme"}
3-4:原生的CSS导入
尽管通常在sass中使用@import时,sass会尝试找到对应的sass文件并导入进来,但在下列三种情况下会生成原生的CSS@import,尽管这会造成浏览器解析css时的额外下载:
被导入文件的名字以.css结尾;
被导入文件的名字是一个URL地址(比如http://www.sass.hk/css/css.css),由此可用谷歌字体API提供的相应服务;
被导入文件的名字是CSS的url()值。
但是,因为sass的语法完全兼容css,所以你可以把原始的css文件改名为.scss后缀,即可直接导入了。
4:静默注释
它们以 // 开头,注释内容直到行末。
5:混合器
混合器使用@mixin标识符定义。这个标识符给一大段样式赋予一个名字,这样你就可以轻易地通过引用这个名字重用这段样式。
@mixin rounded-corners{
-moz-border-radius: 5px;
-webkit-border-radius: 5px;
border-radius: 5px;
}
然后就可以在你的样式表中通过@include来使用这个混合器,放在你希望的任何地方。
notice {
background-color: green;
border: 2px solid #00aa00;
@include rounded-corners;
}
5-1:混合器中的CSS规则
混合器中不仅可以包含属性,也可以包含CSS规则,包含选择器和选择器中的属性,如下代码:
@mixin no-bullets {
list-style: none;
li {
list-style-image: none;
list-style-type: none;
margin-left: 0px;
}
}
当一个包含css规则的混合器通过@include包含在一个父规则中时,在混合器中的规则最终会生成父规则中的嵌套规则。
ul .plain {
color: #444;
@include no-bullets;
}
5-2:给混合器传参
可以通过在@include混合器时给混合器传参,来定制混合器生成的精确样式。当@include混合器时,参数其实就是赋值给CSS属性值的变量。
@mixin link-colors($normal, $hover, $visited) {
color: $normal;
&:hover { color: $hover; }
&:visited { color: $visited; }
}
当混合器被@include时,你可以把它当作一个css函数来传参。
a {
@include link-colors(blue, red, green);
}
SASS允许通过语法$name: value的形式指定每个参数的值。这种形式的传参,参数顺序就不必再在乎了,只需要保证没有漏掉参数即可:
a {
@include link-colors(
$normal: blue,
$visited: green,
$hover: red
);
}
5-3:默认参数值
为了在@include混合器时不必传入所有的参数,我们可以给参数指定一个默认值。参数默认值使用$name: default-value的声明形式,默认值可以是任何有效的css属性值,甚至是其他参数的引用。
@mixin link-colors(
$normal,
$hover: $normal,
$visited: $normal
)
{
color: $normal;
&:hover { color: $hover; }
&:visited { color: $visited; }
}
如果像下边这样调用:@include link-colors(red) h o v e r 和 hover和 hover和visited也会被自动赋值为red。
6:使用选择器继承来精简CSS
选择器继承是说一个选择器可以继承为另一个选择器定义的所有样式。通过@extend语法实现。
.error{
border: 1px solid red;
background-color: #fdd;
}
.seriousError{
@extend .error;
border-width: 3px;
}
6-1:继承的高级用法
第一种高级用法是继承一个html元素的样式。
接下来的这段代码定义了一个名为disabled的类,样式修饰使它看上去像一个灰掉的超链接。通过继承a这一超链接元素来实现:
.disabled {
color: gray;
@extend a;
}