sass的变量必须是$开头,后面紧跟变量名,而变量值和变量名之间就须要使用冒号(:)分隔开(就像CSS属性设置同样),若是值后面加上!default则表示默认值。css
//sass style //------------------------------- $baseLineHeight: 2; $baseLineHeight: 1.5 !default; body{ line-height: $baseLineHeight; } //css style //------------------------------- body{ line-height:2; }
通常咱们定义的变量都为属性值,可直接使用,可是若是变量做为属性或在某些特殊状况下等则必需要以#{$variables}形式使用。api
//sass style //------------------------------- $borderDirection: top !default; $baseFontSize: 12px !default; $baseLineHeight: 1.5 !default; //应用于class和属性 .border-#{$borderDirection}{ border-#{$borderDirection}:1px solid #ccc; } //应用于复杂的属性值 body{ font:#{$baseFontSize}/#{$baseLineHeight}; } //css style //------------------------------- .border-top{ border-top:1px solid #ccc; } body { font: 12px/1.5; }
多值变量分为list类型和map类型,简单来讲list类型有点像js中的数组,而map类型有点像js中的对象。数组
list
list数据可经过空格,逗号或小括号分隔多个值,可用nth($var,$index)取值。关于list数据操做还有不少其余函数如length($list),join($list1,$list2,[$separator]),append($list,$value,[$separator])等sass
----------定义---------------- //一维数据 $px: 5px 10px 20px 30px; //二维数据,至关于js中的二维数组 $px: 5px 10px, 20px 30px; $px: (5px 10px) (20px 30px); ------------使用--------------- //sass style //------------------------------- $linkColor: #08c #333 !default;//第一个值为默认值,第二个鼠标滑过值 a{ color:nth($linkColor,1); &:hover{ color:nth($linkColor,2); } } //css style //------------------------------- a{ color:#08c; } a:hover{ color:#333; }
map
map数据以key和value成对出现,其中value又能够是list。格式为:$map: (key1: value1, key2: value2, key3: value3);。可经过map-get($map,$key)取值。关于map数据还有不少其余函数如map-merge($map1,$map2),map-keys($map),map-values($map)等app
--------------定义---------------------- $heading: (h1: 2em, h2: 1.5em, h3: 1.2em); --------------使用---------------------- //sass style //------------------------------- $headings: (h1: 2em, h2: 1.5em, h3: 1.2em); @each $header, $size in $headings { #{$header} { font-size: $size; } } //css style //------------------------------- h1 { font-size: 2em; } h2 { font-size: 1.5em; } h3 { font-size: 1.2em; }
sass的嵌套包括两种:一种是选择器的嵌套;另外一种是属性的嵌套。咱们通常提及或用到的都是选择器的嵌套。函数
选择器嵌套
所谓选择器嵌套指的是在一个选择器中嵌套另外一个选择器来实现继承,从而加强了sass文件的结构性和可读性。
在选择器嵌套中,能够使用&表示父元素选择器url
//sass style //------------------------------- #top_nav{ line-height: 40px; text-transform: capitalize; background-color:#333; li{ float:left; } a{ display: block; padding: 0 10px; color: #fff; &:hover{ color:#ddd; } } } //css style //------------------------------- #top_nav{ line-height: 40px; text-transform: capitalize; background-color:#333; } #top_nav li{ float:left; } #top_nav a{ display: block; padding: 0 10px; color: #fff; } #top_nav a:hover{ color:#ddd; }
所谓属性嵌套指的是有些属性拥有同一个开始单词,如border-width,border-color都是以border开头。spa
//sass style //------------------------------- .fakeshadow { border: { style: solid; left: { width: 4px; color: #888; } right: { width: 2px; color: #ccc; } } } //css style //------------------------------- .fakeshadow { border-style: solid; border-left-width: 4px; border-left-color: #888; border-right-width: 2px; border-right-color: #ccc; }
sass3.3.0中新增的功能,用来跳出选择器嵌套的。默认全部的嵌套,继承全部上级选择器,但有了这个就能够跳出全部上级选择器。code
//sass style //------------------------------- //没有跳出 .parent-1 { color:#f00; .child { width:100px; } } //单个选择器跳出 .parent-2 { color:#f00; @at-root .child { width:200px; } } //多个选择器跳出 .parent-3 { background:#f00; @at-root { .child1 { width:300px; } .child2 { width:400px; } } } //css style //------------------------------- .parent-1 { color: #f00; } .parent-1 .child { width: 100px; } .parent-2 { color: #f00; } .child { width: 200px; } .parent-3 { background: #f00; } .child1 { width: 300px; } .child2 { width: 400px; }
@at-root与&配合使用orm
//sass style //------------------------------- .child{ @at-root .parent &{ color:#f00; } } //css style //------------------------------- .parent .child { color: #f00; }
sass中使用@mixin声明混合,能够传递参数,参数名以$符号开始,多个参数以逗号分开,也能够给参数设置默认值。声明的@mixin经过@include来调用。
无参数mixin
//sass style //------------------------------- @mixin center-block { margin-left:auto; margin-right:auto; } .demo{ @include center-block; } //css style //------------------------------- .demo{ margin-left:auto; margin-right:auto; }
有参数mixin
//sass style //------------------------------- @mixin opacity($opacity:50) { opacity: $opacity / 100; filter: alpha(opacity=$opacity); } //css style //------------------------------- .opacity{ @include opacity; //参数使用默认值 } .opacity-80{ @include opacity(80); //传递参数 }
sass中,选择器继承可让选择器继承另外一个选择器的全部样式,并联合声明。使用选择器的继承,要使用关键词@extend,后面紧跟须要继承的选择器。
//sass style //------------------------------- h1{ border: 4px solid #ff9aa9; } .speaker{ @extend h1; border-width: 2px; } //css style //------------------------------- h1,.speaker{ border: 4px solid #ff9aa9; } .speaker{ border-width: 2px; }
从sass 3.2.0之后就能够定义占位选择器%。这种选择器的优点在于:若是不调用则不会有任何多余的css文件,避免了之前在一些基础的文件中预约义了不少基础的样式,而后实际应用中无论是否使用了@extend去继承相应的样式,都会解析出来全部的样式。占位选择器以%标识定义,经过@extend调用。
//sass style //------------------------------- %ir{ color: transparent; text-shadow: none; background-color: transparent; border: 0; } %clearfix{ @if $lte7 { *zoom: 1; } &:before, &:after { content: ""; display: table; font: 0/0 a; } &:after { clear: both; } } #header{ h1{ @extend %ir; width:300px; } } .ir{ @extend %ir; } //css style //------------------------------- #header h1, .ir{ color: transparent; text-shadow: none; background-color: transparent; border: 0; } #header h1{ width:300px; }
语法为:if($condition, $if_true, $if_false) 。三个参数分别表示:条件,条件为真的值,条件为假的值。
if(true, 1px, 2px) => 1px if(false, 1px, 2px) => 2px
sass的导入(@import)规则和CSS的有所不一样,编译时会将@import的scss文件合并进来只生成一个CSS文件。可是若是你在sass文件中导入css文件如@import 'reset.css',那效果跟普通CSS导入样式文件同样,导入的css文件不会合并到编译后的文件中,而是以@import方式存在。
//a.scss //------------------- body { background: #eee; } --------------------- @import "reset.css"; @import "a"; p{ background: #0982c1; } ===================== css @import "reset.css"; body { background: #eee; } p{ background: #0982c1; }
for循环有两种形式,分别为:@for $var from <start> through <end>和@for $var from <start> to <end>。$i表示变量,start表示起始值,end表示结束值,这两个的区别是关键字through表示包括end这个数,而to则不包括end这个数。
//sass style //------------------------------- @for $i from 1 through 3 { .item-#{$i} { width: 2em * $i; } } //css style //------------------------------- .item-1 { width: 2em; } .item-2 { width: 4em; } .item-3 { width: 6em; }
语法为:@each $var in <list or map>。其中$var表示变量,而list和map表示list类型数据和map类型数据。sass 3.3.0新加入了多字段循环和map数据循环。
单个字段list数据循环
//sass style //------------------------------- $animal-list: puma, sea-slug, egret, salamander; @each $animal in $animal-list { .#{$animal}-icon { background-image: url('/images/#{$animal}.png'); } } //css style //------------------------------- .puma-icon { background-image: url('/images/puma.png'); } .sea-slug-icon { background-image: url('/images/sea-slug.png'); } .egret-icon { background-image: url('/images/egret.png'); } .salamander-icon { background-image: url('/images/salamander.png'); }
多个字段list数据循环
//sass style //------------------------------- $animal-data: (puma, black, default),(sea-slug, blue, pointer),(egret, white, move); @each $animal, $color, $cursor in $animal-data { .#{$animal}-icon { background-image: url('/images/#{$animal}.png'); border: 2px solid $color; cursor: $cursor; } } //css style //------------------------------- .puma-icon { background-image: url('/images/puma.png'); border: 2px solid black; cursor: default; } .sea-slug-icon { background-image: url('/images/sea-slug.png'); border: 2px solid blue; cursor: pointer; } .egret-icon { background-image: url('/images/egret.png'); border: 2px solid white; cursor: move; }
多个字段map数据循环
//sass style //------------------------------- $headings: (h1: 2em, h2: 1.5em, h3: 1.2em); @each $header, $size in $headings { #{$header} { font-size: $size; } } //css style //------------------------------- h1 { font-size: 2em; } h2 { font-size: 1.5em; } h3 { font-size: 1.2em; }