概览
Sass(CSS预处理器) 是一个最初由 Hampton Catlin 设计并由 Natalie Weizenbaum 开发的层叠样式表语言。在 CSS 语法的基础上增加了变量 (variables)、嵌套 (nested rules)、混合 (mixins)、导入 (inline imports) 等高级功能,可以帮助我们减少CSS重复的代码,易于组织和维护,节省了开发时间。
安装
使用 npm来安装 Sass:
npm install -g sass
安装完成后可查看版本:
sass --version
编译
对于scss文件,我们最终还是要编译成css文件才能使用。 编译也很简单,只需要在终端输入下列命令:
sass input.scss output.css //input.scss是你的Sass文件,output.css是你需要输出的文件
还可以实现实时自动编译:
sass --watch input.scss:output.css
这样,每次修改并保存时都会自动编译输出。 此外,你也可以监视整个文件夹的变化:
sass --watch app/sass:public/stylesheets
输出风格
sass给我们提供了四种输出风格:
nested: 嵌套缩进的css代码,它是默认值。expanded: 标准格式的代码compact: 行格式的代码compressed: 压缩后的代码,一般用于生产环境
使用方法:
sass --style compressed input.scss output.css
更多帮助命令:
sass --help
变量
Sass变量使用 $ 符号声明变量:
$Variablesname:value;
以下实例设置了3个变量:ourFont、ourSize、ourColor
$ourFont:sans-serif;
$ourSize:8px;
$ourColor:#000;
body{
font-family:$ourFont;
font-size:$ourSize;
color:$ourColr;
}
编译成CSS代码,如下所示:
body{
font-family:sans-serif;
font-size:8px;
color:#000;
}
注意:Sass变量的作用域只能在当前层级上有效果,如下所示可得,h1的颜色样式为内部定义的red, h2的则是#000;
$ourColor:#000;
h1{
$ourColor:red;
color:$ourColor;
}
h2{
color:$ourColor;
}
输出为:
h1{
color:red;
}
h2{
color:#000;
}
若需要设置变量为全局,可使用!global 关键词,如下所示:
$ourColor:#000;
h1{
$ourColor:red !global;
color:$ourColor;
}
h2{
color:$ourColor;//color:red;
}
此外,变量也可以拼接在CSS属性里,不过要借助插值语句(#{}):
$theme: ".dark";
#{$theme} div {
color: black
}
输出为:
.dark div { color: black; }
也可以这样:
$side: top;
div {
border-#{$side}-color: red;
}
输出为:
div {border-top-color: red; }
注:如果传入的是字符串,插值语句输出的最终都是不带引号的字符串。
嵌套
Sass 嵌套 CSS 选择器类似于 HTML 的嵌套规则。假设我们有以下css代码:
nav ul{
margin:0;
padding:0;
list-style;:none;
}
nav li{
display:inline-block;
}
nav a{
display:block;
padding:4px;
text-decoration: none;
}
用Sass语言编写代码的话,可以这样书写:
nav {
ul{
margin:0;
padding:0;
list-style;:none;
}
li{
display:inline-block;
}
a{
display:block;
padding:4px;
text-decoration: none;
}
}
我们常用的CSS属性中,如:font-family、font-size、font-weight、,或者是text-align、text-indent、text-overflow,他们都有同样的前缀,这个时候我们可以用Sass的嵌套属性编写:
font:{
family:sans-serif;
size:#000;
weight:bold;
}
text:{
align:center;
indent:2em;
overflow:hidden;
}
输出为:
font-family:sans-serif;
font-size:#000;
font-weight:bold;
text-align:center;
text-indent:2em;
text-overflow:hidden;
混合
@mixin 指令定义一个可以在整个样式表中重复使用的样式,@include 指令可以将混入(mixin)引入到文档中。
@mixin 定义混入:
@mixin main-text{
font-size:16px;
font-weight:bold;
color:green;
}
**注意:**Sass 的连接符号 - 与下划线符号 _ 是相同的,也就是 @mixin main-text { } 与 @mixin main_text { } 是一样的混入。
@include 引入混入:
.demo{
@include main-text;
banckground-color:green;
}
输出为:
.demo{
font-size:16px;
font-weight:bold;
color:green;
banckground-color:green;
}
向@mixin传递变量
@mixin bordered($color, $width) {
border: $width solid $color;
}
.mytitle {
@include bordered(#000, 1px);
}
.myword {
@include bordered(#fff, 2px);
}
输出为:
.mytitle{
border:1px solid #000;
}
.myword {
border:2px solid #fff;
}
混入的参数也可以定义默认值(即没写就为默认值,写了便是其值),语法格式如下:
@mixin bordered($color: #000, $width: 1px) {
border: $width solid $color;
}
继承
@extend 指令告诉 Sass 一个选择器的样式从另一选择器继承,如下所示:
.button_father{
border: none;
padding: 10px 20px;
text-align: center;
font-size: 16px;
cursor: pointer;
}
.button_child{
@extend button_father;
background-color:green;
}
输出为:
.button_father,
.button_child{
border: none;
padding: 10px 20px;
text-align: center;
font-size: 16px;
cursor: pointer;
}
.button_child{
background-color:green;
}
使用 @extend 后,在 HTML 按钮标签中就不需要指定多个类 class="button_father button_child" ,只需要设置 class="button_child" 类就好了。@extend 很好的体现了代码的复用。
循环语句
@for
from...through...
#for $var from start through end{}
例子:
@for $i from 1 through 3{
.large-#{$i}{
font-size:10px *$i;
}
}
输出为:
.large-1{
font-size:10px;
}
.large-2{
font-size:20px;
}
.large-3{
font-size:30px;
}
from...to...
#for $var from start to end{}
例子:
@for $i from 1 to 3{
.large-#{$i}{
font-size:10px *$i;
}
}
输出为:
.large-1{
font-size:10px;
}
.large-2{
font-size:20px;
}
@each
在Sass中,数组便是通过空格或者逗号分隔的一系列的值,比如1 2 3 4或1,2,3,4;还可以由多维数组,比如1 2, 3 4表示包含1 2与3 4两个数组的数组,还可以这样(1 2) (3 4)
@each $var in <list>
是一系列以逗号分隔的值列表(数组):
@each $demo in user, nav, person {
.#{$demo}-icon {
background-image: url('/images/#{$demo}.png');
}
}
输出为:
.user-icon { background-image: url("/images/user.png"); }
.nav-icon { background-image: url("/images/nav.png"); }
.person-icon { background-image: url("/images/person.png"); }
对于多维数组:
@each $var1, $var2 in ($value,$value),($value,$value)
例子:
@each $font, $size in (large-1, 10px), (large-2, 20px) {
.#{$font} {
font-size: $size;
}
}
输出为:
.large-1 { font-size: 10px; }
.large-2 { font-size: 20px; }
对于元素是键值对形式的数组:
@each $key, $value in (key: value, key: value)
例子:
@each $selector, $size in (div: 10px, p: 20px) {
#{$selector} {
font-size: $size;
}
}
输出为:
div { font-size: 10px; }
p { font-size: 20px; }
@while
@while 指令重复输出格式直到表达式返回结果为 false:
$i: 6;
@while $i > 0 {
.item-#{$i} { width: 2em * $i; }
$i: $i - 2;
}
函数
字符串函数
数字相关函数
List相关函数
Map(映射)函数
Sass 选择器相关函数
Introspection 函数
Sass 颜色相关函数
Sass、LESS 和 Stylus的差异
Sass的安装需要Ruby环境,是在服务端处理的;
Less是需要引入less.js来处理Less代码输出css到浏览器,也可以在开发环节使用Less,然后编译成css文件,直接放到项目中;
Stylus需要安装node,然后安装最新的stylus包即可使用
变量符不一样
Less是@,而Scss是”符号开始。结尾的分号(;)可有可无,但变量名和变量值之间的等号(=)是需要的。有一点需要注意的是,如果我们使用“@”符号开头来声明变量,Stylus会进行编译,但其对应的值并不会赋值给变量。换句话说,在Stylus中不要使用“@”符号开头声明变量。Stylus中调用变量的方法和LESS、Sass是完全相同的。
输出设置
Less没有输出设置,Sass提供4中输出选项:nested, compact, compressed 和 expanded
Sass输出样式的风格可以有四种选择,默认为nested
- nested:嵌套缩进的css代码
- expanded:展开的多行css代码
- compact:简洁格式的css代码
- compressed:压缩后的css代码
处理条件语句
Sass支持条件语句,可以使用if{}else{},for{}循环等等。 LESS的条件语句使用有些另类,他不是我们常见的关键词if和else if之类,而其实现方式是利用关键词“when”。stylus的条件语句的使用和其他编程的条件语句使用基本类似,不同的是他可以在样式去省略大括号({}):
引用外部CSS文件
scss引用的外部文件命名必须以开头, 如下例所示:其中 test1.scss、test2.scss、test3.scss文件分别设置的h1 h2 h3。文件名如果以下划线_开头的话,Sass会认为该文件是一个引用文件,不会将其编译为css文件.
// 源代码:
@import "_test1.scss";
@import "_test2.scss";
@import "_test3.scss";
// 编译后:
h1 {
font-size: 17px;
}
h2 {
font-size: 17px;
}
h3 {
font-size: 17px;
}
Less引用外部文件和css中的@import没什么差异。
Stylus同样可以用@import,也支持其他文件通过@import进行引入,和js联系更加紧密
优缺点
-
sass(sass.bootcss.com/)
优点:用户多,更容易找到会用scss的开发,更容易找到scss的学习资源; 可编程能力比较强,支持函数,列表,对象,判断,循环等; 相比less有更多的功能; Bootstrap/Foundation等使用scss; 丰富的sass库:Compass/Bourbon;
缺点:在公司内部安装node-sass会失败,需要使用cnpm或者手工安装
-
less(less.bootcss.com/)
优点:可以在浏览器中运行,实现主题定制功能;
缺点:编程能力弱,不直接支持对象,循环,判断等。
-
stylus(www.zhangxinxu.com/jq/stylus/)
优点:简洁和灵活,可选的冒号,分号,逗号和大括号,只需要正确使用缩进,一下子大大提高了编程效率。
缺点:人气不高和教程较少,有一定的学习成本