很详细的sass入门指南,学习一下。原文sass入门指南css
css预处理器已经算不上一个新鲜的词了,当前比较有表明性的css预处理器有sass、less、stylus。关于三者选择问题一直都是比较受争议的话题,这里就不在讨论了,适合的就是最好的。这篇文章主要会介绍一些sass的常见用法,固然不少理论都是相通的。html
在介绍sass前,咱们先得明确几点:css3
sass是基于ruby的产物,所以在安装sass前须要先安装ruby。(ps: 本机系统环境,win7 64位)web
下载对应系统的版本,一路next便可。安装完成后,在命令行输入ruby -v
可查看ruby版本。浏览器
$ ruby -v ruby 2.0.0p451 (2014-02-24) [x64-mingw32]
安装完ruby后,在命令行输入gem install sass
便可安装sass,安装完后可经过sass -v
来查看sass版本。sass
$ sass -v Sass 3.3.5 (Maptastic Maple)
sass有两种可选的文件后缀.sass
和.scss
,二者的主要区别就是在书写格式上。ruby
.sass
文件是缩进式的写法,对格式要求比较严谨,末尾不能有分号app
.test margin: 5px 10px font-size: 14px color: #333
.scss
文件的写法和css一致less
.test { margin: 5px 10px; font-size: 14px; color: #333; }
能够根据我的的书写习惯来选择这两种风格,只要同一个文件中不混用便可。(ps: 文章后面用到的代码采用的是第二种风格)
sass test.scss test.css
也能够设置输出css文件的风格
sass --style compressed test.scss test.css
输出样式的风格能够有四种选择,默认为nested
sass --watch test.scss:test.css
sass --watch src:dest
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 }
嵌套是一个比较实用的功能,它不只能够省去书写大量重复选择器的时间,还可以让代码显得更有条理、更易维护。
.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; } }
css有一个不太经常使用的特性,即@import
导入功能,它容许在一个css文件中导入其余css文件。然而,结果是只有执行到@import
规则时,浏览器才会去下载其余css文件,这会致使页面样式加载特别慢,从而容易出现页面闪的问题。
sass也有@import
导入规则,与css不一样的是,sass中的@import
规则会在生成css文件时,把相关的文件导入合并成一个文件,而无需浏览器去下载其余的文件。另外在被导入文件中定义的变量等也能够在导入文件中正常使用。
在使用@import
导入sass文件时,能够省略sass文件的后缀名.sass
或.scss
,例如:
- a.scss body { 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.scss body { background-color: #f00; } - style.scss @import "a"; div { color: #333; }
这样一来就只会生成style.css
文件,不会再生成多余的a.css
了。
固然,若是你须要像原生css那样去导入其余的css文件,也是能够的,若是符合如下三条中的任意一种状况,sass就会认为你想用css原生的@import
:
.css
结尾@import url(...)
方式去导入文件sass支持原生css的注释格式/* 注释内容 */
,同时也支持相似js中的单行注释// 注释内容
。对于单行注释,sass会在生成的css文件中删除单行注释,只保留css原生的注释内容,例如:
.test { margin: 10px; // 这块注释不会出如今生成的css文件中 color: #333; /* 这块注释会出如今生成的css文件中 */ }
固然,若是你把多行注释写在原生css不容许的地方时,在编译生成css文件时,sass会将这些注释抹掉。例如:
.test { padding /* 这块注释不会出如今生成的css文件中 */: 10px margin: 5px /* 这块注释也不会出如今生成的css文件中 */ 10px; }
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;}
使用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; }
这样就不会再额外生成多余的样式了。
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; }