sass入门指南

很详细的sass入门指南,学习一下。原文sass入门指南
css预处理器已经算不上一个新鲜的词了,当前比较有代表性的css预处理器有sass、less、stylus。关于三者选择问题一直都是比较受争议的话题,这里就不在讨论了,适合的就是最好的。这篇文章主要会介绍一些sass的常见用法,当然很多理论都是相通的。
[图片上传失败...(image-2759b3-1558100923537)]
在介绍sass前,我们先得明确几点:
sass并不是css的替代品,它只是让css变得更加高效、可维护
永远不要去修改生成后的css
部署到线上的是生成的css文件,不是sass文件,sass的工作流如下图

[图片上传失败...(image-14e888-1558100923537)]

一、安装sass
sass是基于ruby的产物,因此在安装sass前需要先安装ruby。(ps: 本机系统环境,win7 64位)
https://www.ruby-lang.org/zh_cn/downloads/

下载对应系统的版本,一路next即可。安装完成后,在命令行输入ruby -v
可查看ruby版本。

$ ruby -vruby 2.0.0p451 (2014-02-24) [x64-mingw32]

安装完ruby后,在命令行输入gem install sass
即可安装sass,安装完后可通过sass -v
来查看sass版本。
$ sass -vSass 3.3.5 (Maptastic Maple)
二、编译sass文件
2.1 sass文件格式
sass有两种可选的文件后缀.sass
和.scss
,两者的主要区别就是在书写格式上。
.sass
文件是缩进式的写法,对格式要求比较严谨,末尾不能有分号

.testmargin: 5px 10px
font-size: 14px
color: #333

.scss
文件的写法和css一致
.test {margin: 5px 10px;font-size: 14px;color: #333;}
可以根据个人的书写习惯来选择这两种风格,只要同一个文件中不混用即可。(ps: 文章后面用到的代码采用的是第二种风格)
2.2 编译sass
编译单个文件

sass test.scss test.css

也可以设置输出css文件的风格

sass --style compressed test.scss test.css

输出样式的风格可以有四种选择,默认为nested
nested:嵌套缩进的css代码
expanded:展开的多行css代码
compact:简洁格式的css代码
compressed:压缩后的css代码

watch单个文件

sass --watch test.scss:test.css

watch文件夹

sass --watch src:dest

三、sass语法
3.1 变量
普通变量
sass的一个重要特性就是引入了变量。我们可以把反复用到的属性值或者经常修改的值定义成变量,方便调用和修改。

$base-gap: 10px;
$base-color: #333;
.test {margin-top: $base-gap;
       color: $base-color;}

如果在字符串中引用变量,则需要将变量名写在#{}
中。如:

$img-dir: "public/images/";
.test {background-image: url(#{$img-dir}icon.png);}

默认变量
默认变量用来提供sass的默认值。它的含义是:如果这个变量被声明赋值了,那就用它声明的值,否则就用默认值。这在书写sass库文件时非常有用。设置默认变量的方法也非常简单,只需在变量值后加上!default
即可。

$color: #ccc;
$color: #000 !default;
p {color: $color;}

多值变量
多值变量类似js中的数组,声明时只需用空格将多个值隔开即可。如:

$colors: #fff #ccc #999 #666 #333;

我们可以通过

length($colors)

来获取多值变量的值的个数,通过

nth($colors, index)

来获取第index个位置的值。ps: index的取值范围为1到length($colors)

$colors: #fff #ccc #999 #666 #333;
p::after { content: "#{length($colors)}"; 
// 5 color: nth($colors, 1); // #fff}

3.2 嵌套
嵌套是一个比较实用的功能,它不仅可以省去书写大量重复选择器的时间,还能够让代码显得更有条理、更易维护。

.list {margin-top: 10;}
.list li {padding-left: 15px;}
.list a {color: #333;}
.list a:hover {text-decoration: none;}

用嵌套改写

.list {margin-top: 10px;
li { padding-left: 15px;}
a { color: #333;
 &:hover { text-decoration: none; }}
}

嵌套代码中的&
表示父元素选择器。嵌套虽然很方便,但不建议嵌套层次太深,以免生成的css选择器过长。除了选择器可以嵌套外,css属性也可以嵌套(用的相对较少),如:

.test {border: { width: 2px; 
style: solid; 
color: #000;}
}

3.3 sass导入文件
导入.sass或.scss文件
css有一个不太常用的特性,即@import
导入功能,它允许在一个css文件中导入其他css文件。然而,结果是只有执行到@import
规则时,浏览器才会去下载其他css文件,这会导致页面样式加载特别慢,从而容易出现页面闪的问题。
sass也有@import
导入规则,与css不同的是,sass中的@import
规则会在生成css文件时,把相关的文件导入合并成一个文件,而无需浏览器去下载其他的文件。另外在被导入文件中定义的变量等也可以在导入文件中正常使用。
在使用@import
导入sass文件时,可以省略sass文件的后缀名.sass
或.scss
,例如:

a.scssbody { background-color: #f00;}- style.scss@import "a";div { color: #333;}

编译后的style.css
文件内容如下:

body {background-color: #f00;}div {color: #333;}

如果你是编译整个sass目录的话,会发现一个问题,在生成style.css
的同时也生成了一个a.css
,这个结果并不是我们想要的,a.scss
作为一个中间文件,一般情况下是不需要在生成css的。sass开发者也考虑到了这点,我们只需要在文件名前加上下划线_
,sass编译的时候就会忽略这个文件,@import
引用的时候可以加下划线引用,也可以不加。还是上面的例子,我们可以进行修改:
-```
_a.scssbody { background-color: #f00;}- style.scss@import "a";div { color: #333;}

这样一来就只会生成style.css
文件,不会再生成多余的a.css
了。
导入css文件
当然,如果你需要像原生css那样去导入其他的css文件,也是可以的,如果符合以下三条中的任意一种情况,sass就会认为你想用css原生的@import
:
被导入的文件名以.css
结尾
被导入的文件是一个在线的url地址
以

@import url(...)

方式去导入文件

3.4 注释
sass支持原生css的注释格式/* 注释内容 */
,同时也支持类似js中的单行注释// 注释内容
。对于单行注释,sass会在生成的css文件中删除单行注释,只保留css原生的注释内容,例如:

.test {margin: 10px; // 这块注释不会出现在生成的css文件中color: #333; /* 这块注释会出现在生成的css文件中 */}

当然,如果你把多行注释写在原生css不允许的地方时,在编译生成css文件时,sass会将这些注释抹掉。例如:
.test {padding /* 这块注释不会出现在生成的css文件中 */: 10pxmargin: 5px /* 这块注释也不会出现在生成的css文件中 */ 10px;}

3.5 混合器mixin
简单混合器
sass中的混合器一般用来解决大段代码重复的问题。比如我们经常使用的单行文本溢出显示省略号,可以使用@mixin
来定义一个简单的混合器:

@mixin ellipsis {width: 100%;overflow: hidden;white-space: nowrap;text-overflow: ellipsis;}
```
然后在需要用到的地方我们可以通过@include
来使用这个混合器:

```
.text {@include ellipsis;}
```
输出的css为:
```
```
.text {width: 100%;overflow: hidden;white-space: nowrap;text-overflow: ellipsis;}
```
带参数的混合器
混合器不仅可以实现代码的重复利用,还可以传递参数,根据需要生成不同的css。这在跨浏览器的css3
兼容方面尤为好用。例如:

```
@mixin radius($value) {-moz-border-radius: $value;-webkit-border-radius: $value;border-radius: $value;}
```
使用时,我们只需传入相应的参数值即可。

```
.test {@include radius(3px);}
```
生成的css为:

```
.test {-moz-border-radius: 3px;-webkit-border-radius: 3px;border-radius: 3px;}
```
另外我们还可以给参数提供默认值,如:

```
@mixin link-colors($normal: #333, $hover: $normal, $visited: $normal) {color: $normal;&:hover { color: $hover;}&:visited { color: $visited;}}
```
调用时,可以传参,也可以不传:

```
.text {@include link-colors;}.error {@include link-colors(red);}a {@include link-colors(blue, green, yellow);}
```
生成的css为:

```
// 鉴于篇幅问题,已将生成的代码改成单行.text { color: #333;}.text:hover { color: #333;}.text:visited { color: #333;}.error { color: red;}.error:hover { color: red;}.error:visited { color: red;}a { color: blue;}a:hover { color: green;}a:visited {color: yellow;}
```
3.6 继承extend
使用sass时,继承是一个很不错的减少css重复代码的功能。继承可以让一个选择器继承另一个选择器的所有样式,并联合声明。可以使用@extend
语法来实现继承。

```
.text {color: #333;font-size: 14px;margin: 10px 0;}.error {@extend .text;color: #f00;}
```
上面代码中,.error
继承了.text
中的所有样式,并且.error
和.text
中的公共样式会进行联合声明。生成的css为:

```
.text, .error {color: #333;font-size: 14px;margin: 10px 0;}.error {color: #f00;}
```


这种继承虽然方便,但是也有一定的弊端。比如我们仅仅想继承.text
类中的样式,而实际并不需要.text
的这个类。换句话说就是我们的html中并没有class="text"
这样的代码,这样的话生成的css中的.text
其实就是多余的。
对于这种情况,sass
3.2.0及以后的版本也给我们提供了解决方案:占位选择器%。
占位选择器%
占位选择器的优势在于:声明之后,如果不调用,则不会产生类似.text
的多余css代码。占位选择器通过%
标识来定义,也是通过@extend
来调用。
```
```
%text {color: #333;font-size: 14px;margin: 10px 0;}.warn {@extend %text;color: #fdd;}.error {@extend %text;color: #f00;}
```
生成的css为:
```
.warn, .error {color: #333;font-size: 14px;margin: 10px 0;}.warn {color: #fdd;}.error {color: #f00;}
```


这样就不会再额外生成多余的样式了。
3.7 sass条件判断
@if添加判断
sass中的@if
语句和js中的if
很相似。可以单独使用,也可以配合@else
使用。
```
$lte7: true; // 是否支持ie7以下版本$theme: yellow;.clearfix {@if $lte7 { zoom: 1;}&:after { content: "."; display: block; height: 0; clear: both; visibility: hidden;}}body {@if $theme == red { background: rgba(255, 0, 0, 0.5);} @else if $theme == yellow { background: rgba(255, 255, 0, 0.5);} @else if $theme == black { background: rgba(0, 0, 0, 0.5);}}
```
生成css为:
```
.clearfix {zoom: 1;}.clearfix:after {content: ".";display: block;height: 0;clear: both;visibility: hidden;}body {background: rgba(255, 255, 0, 0.5);}
```
三目运算判断
三目运算符的语法为:

```
@if($condition, $condition_true, $condition_false)
```
,例如:
```

$fontBold: true;.title {font-weight: if($fontBold, bold, normal);}
```

生成的css为

```
.title {font-weight: bold;}
```

sass相关工具推荐
[sass在线编译](http://sassmeister.com/)
[sass可视化编译工具: Koala](http://koala-app.com/index-zh.html)

PS:更多前端资讯、技术干货,请关注公众号「**前端新视界**」,后台回复 “1” 获取100本PDF前端电子书

回复 “2” 获取小编精选的Python编程电子书

![111.jpg](https://upload-images.jianshu.io/upload_images/1709462-0dad498e267d1926.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,378评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,356评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,702评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,259评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,263评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,036评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,349评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,979评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,469评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,938评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,059评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,703评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,257评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,262评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,501评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,792评论 2 345

推荐阅读更多精彩内容