引言
Sass(Syntactically Awesome Stylesheets)和SCSS(Sassy CSS)是两种用于编写层叠样式表(CSS)的CSS预处理器。
Sass是较早的一种语法形式,采用类似于缩进的格式来组织代码。它提供了一些有用的功能,如嵌套规则、变量、混合(Mixins)、继承(Inheritance)等,这些功能使得CSS代码更加模块化、可重用和易于维护。然而,由于其特殊的语法形式,有些开发者可能觉得难以理解和书写。
为了解决这个问题,Sass团队在Sass版本3中引入了SCSS语法,即Sassy CSS。SCSS语法采用了与CSS相似的语法形式,使用大括号和分号来组织代码,这使得CSS开发者更容易上手并且可以直接复用现有的CSS代码。因此,SCSS语法更受广大开发者的欢迎。
尽管Sass和SCSS语法形式不同,但它们的功能和特性基本上是相同的。事实上,Sass团队通常将这两种语法称为Sass,而不特别区分。之所以普遍称为Sass,可能是因为Sass这个名称比SCSS更早被广泛使用。
总结起来,Sass和SCSS是用于编写CSS的两种不同的语法形式。Sass使用缩进格式,而SCSS使用大括号和分号的形式。尽管它们有一些区别,但在实际使用中,它们的功能和特性几乎相同。
基础篇
变量声明style.scss
scss
$out-bg: deeppink;
scss
<style scoped lang="scss">
// 导入scss文件中声明的变量
@import './style.scss';
// 声明在当前style作用域下的变量,相对于当前style则是全局变量
$bg: pink;
.test-sass {
// 声明在test-sass块下的变量,不能在当前块外使用
$h: 200px;
.header {
background-color: $bg;
height: $h;
}
}
.test-sass-2 {
// 使用文件导入的变量
background-color: $out-bg;
}
</style>
变量名用中划线还是下划线分隔
使用中划线 还是下划线 ,这完全取决于个人的喜好,但使用中划线的方式更为普遍; 用中划线声明的变量可以使用下划线的方式引用,用下划线声明的变量也可以用中划线的方式引用。
scss
$bg-color: yellow;
.test-sass-2 {
background-color: $bg_color;
}
// 编译后
.test-sass-2 {
background-color: yellow;
}
父选择器的标识符&
scss
article a {
color: blue;
&:hover { color: red }
}
// 编译后
article a { color: blue }
article a:hover { color: red }
群组选择器的嵌套
scss
nav, aside {
a {color: blue}
}
// 编译后
nav a, aside a {color: blue}
子组合选择器和同层组合选择器:>、+和~;
scss
article {
~ article { border-top: 1px dashed #ccc }
> section { background: #eee }
dl > {
dt { color: #333 }
dd { color: #555 }
}
nav + & { margin-top: 0 }
}
// 编译后
article ~ article { border-top: 1px dashed #ccc }
article > footer { background: #eee }
article dl > dt { color: #333 }
article dl > dd { color: #555 }
nav + article { margin-top: 0 }
嵌套属性和属性缩写
嵌套属性的规则是这样的:把属性名从中划线-的地方断开,在根属性后边添加一个冒号:,紧跟一个{ }
块,把子属性部分写在这个{ }
块中。就像css
选择器嵌套一样,sass
会把你的子属性一一解开,把根属性和子属性部分通过中划线-连接起来,最后生成的效果与你手动一遍遍写的css
样式一样:
scss
nav {
border: {
style: solid;
width: 1px;
color: #ccc;
}
}
// 编译后
nav {
border-style: solid;
border-width: 1px;
border-color: #ccc;
}
对于属性的缩写形式,你甚至可以像下边这样来嵌套,指明例外规则:
scss
nav {
border: 1px solid #ccc {
left: 0px;
right: 0px;
}
}
// 编译后
nav {
border: 1px solid #ccc;
border-left: 0px;
border-right: 0px;
}
使用@import导入SASS文件
使用sass
的@import
规则并不需要指明被导入文件的全名。你可以省略.sass
或.scss
文件后缀(见下图)。 这样,在不修改样式表的前提下,你完全可以随意修改你或别人写的被导入的sass
样式文件语法,在sass
和scss
语法之间随意切换。举例来说,@import
"sidebar";这条命令将把sidebar.scss
文件中所有样式添加到当前样式表中。
使用SASS部分文件
当通过@import
把sass
样式分散到多个文件时,你通常只想生成少数几个css
文件。那些专门为@import
命令而编写的sass
文件,并不需要生成对应的独立css
文件,这样的sass
文件称为局部文件。对此,sass
有一个特殊的约定来命名这些文件。
此约定即,sass
局部文件的文件名以下划线开头。这样,sass
就不会在编译时单独编译这个文件输出css
,而只把这个文件用作导入。当你@import
一个局部文件时,还可以不写文件的全名,即省略文件名开头的下划线。举例来说,你想导入themes/_night-sky.scss
这个局部文件里的变量,你只需在样式表中写@import
"themes/night-sky";
。
局部文件可以被多个不同的文件引用。当一些样式需要在多个页面甚至多个项目中使用时,这非常有用。在这种情况下,有时需要在你的样式表中对导入的样式稍作修改,sass
有一个功能刚好可以解决这个问题,即默认变量值。
使用!default设置默认值
style.scss
scss
$size: 50px;
scss
// 导入scss文件中声明的变量
@import './style';
// 设置$size默认值,如果导入的scss文件中存在该变量,则会使用导入文件的变量值,否则使用默认值
$size: 20px !default;
.test-sass-2 {
font-size: $size; // 50px
}
嵌套导入
_blue-theme.scss
scss
aside {
background: blue;
color: white;
}
css
.blue-theme {@import "blue-theme"}
//生成的结果跟你直接在.blue-theme选择器内写_blue-theme.scss文件的内容完全一样。
.blue-theme {
aside {
background: blue;
color: #fff;
}
}
混合器@mixin
style.scss
scss
$size: 50px;
@mixin radius{
width: 100px;
height: 100px;
border: 2px solid deepskyblue;
border-radius: 50%;
}
scss
@import './style';
.test-sass-2 {
font-size: $size;
@include radius
}
// 编译后
.test-sass-2 {
font-size: 50px;
width: 100px;
height: 100px;
border: 2px solid deepskyblue;
border-radius: 50%;
}
给混合器传参
scss
@mixin link-colors($normal, $hover: pink, $visited: deeppink) {
color: $normal;
&:hover { color: $hover; }
&:visited { color: $visited; }
}
pink和deeppink分别为 <math xmlns="http://www.w3.org/1998/Math/MathML"> h o v e r 和 hover和 </math>hover和visited的默认值,当混合器被@include
时,你可以把它当作一个css
函数来传参。如果你像下边这样写:
scss
a {
@include link-colors(blue, red, green);
}
// 或者
a {
@include link-colors(
$normal: blue,
$visited: green,
$hover: red
)
}
//Sass最终生成的是:
a { color: blue; }
a:hover { color: red; }
a:visited { color: green; }
选择器样式继承@extend
scss
//通过选择器继承继承样式
.error {
border: 1px solid red;
background-color: #fdd;
}
.seriousError {
@extend .error;
border-width: 3px;
}
// 相当于class="seriousError error"
.seriousError
不仅会继承.error
自身的所有样式,任何跟.error
有关的组合选择器样式也会被.seriousError
以组合选择器的形式继承,如下代码:
css
//.seriousError从.error继承样式
.error a{ //应用到.seriousError a
color: red;
font-weight: 100;
}
h1.error { //应用到hl.seriousError
font-size: 1.2rem;
}
往期回顾
文章参考:sass中文网