首页 > 代码库 > 学习Sass(二)

学习Sass(二)

前面简单介绍了sass的安装,特点和使用方法等,这里记录下sass的基本语法。

技术分享

一、变量

变量以$开始,像css属性那样赋值,如:

1 $color: #ccc;2 div {3     color: $color;4 }

若变量定义在的选择器内,则仅在嵌套层级的范围内可用(可理解为块级作用域)。不在任何选择器内定义的变量则在任何地方可用(可理解为全局变量)。

1 $color: #ccc;  /*全局范围内可用*/2 div {3     $width: 200px; /*仅在定义的选择器内可用*/4     width: $width;5      color: $color;6 }7 p {8     color: $color;9 }

若在选择器内定义的变量后面加上!global标志,则可“升级”为“全局变量”,在任何地方可用。

 1 $color: #ccc;  /*全局范围内可用*/ 2 div { 3   $width: 200px; /*仅在定义的选择器内可用*/ 4   width: $width; 5   color: $color; 6   $height: 100px !global;/*全局范围内可用*/ 7  } 8 p { 9   color: $color;10   height: $height;11  }

字符串类型变量,有两种类型:带引号(包括单、双引号)和不使用引号。css文件会保留其字符串形式。特殊情况:在字符串中使用#{}引用字符串变量时会去掉引号,这样主要是为了便于使用,比如mixins中的选择器名称。例如:。

1 $name: "peter";2 $job: ‘programmer‘;3 $weight: bold;4 5 body.chrome{6     content:"Hi #{$name},chrome users!My job is #{$job}";7     //也可写成如下形式content:"Hi "+ $name+",chrome users!The job is "+$job;      8     font-weight:$weight;9 }

编译为:

1 body.chrome {2   content: "Hi peter,chrome users!My job is programmer";3   font-weight: bold; 4 }

变量值后面加!default,当变量被赋予其他值时引用新值,没有就使用默认的值,换句话说就是个“备胎”啊! 

$content: "First content";$content: "Second content?" !default;$new_content: "First time reference" !default;#main {  content: $content;  /* 引用新值 */}#main:after{  content: $new_content; /* 引用默认值 */}编译为:#main {  content: "First content"; }#main:after {  content: "First time reference"; } 

注:变量中的连字符下划线_和划线-可以互换的,如定义了$body_height,可以使用$body-height访问。 

二、运算

SassScript 支持对数字标准的算术运算(加法+,减法 - ,乘法*,除法/和取模%)。数字支持关系运算符(<><=>=),并且所有类型支持相等运算符(==!=)。这里介绍常用的除法和加法。

2.1 除法

原生CSS允许‘/‘ 出现在属性值之间作为分隔数字的方式,sass是CSS属性语法的扩展,所以也必须支持这一点。那么‘/’何时被作为除法预算符呢?

  1. 如果该值,或值的任何部分,存储在一个变量中或通过函数返回。

  2. 如果该值被括号括起来,作为列表的外部括号除外。

  3. 如果该值被用作算数表达式的一部分。

例如:

 1 p { 2   font: 10px/8px;             // 原生的CSS,不作为除法 3   $width: 1000px; 4   width: $width/2;            // 使用了变量, 作为除法 5   width: round(1.5)/2;        // 使用了函数, 作为除法 6   height: (500px/2);          // 使用了括号, 作为除法 7   margin-left: 5px + 8px/2px; // 使用了 +, 作为除法 8   font: (italic bold 10px/8px); // 在一个列表(list)中,括号可以被忽略。 9 }10 11 编译为:12 p {13   font: 10px/8px;14   width: 500px;15   width: 1;16   height: 250px;17   margin-left: 9px;18   font: italic bold 10px/8px; 19 }

2.2 加法

加法可用于连接字符串

p {  cursor: e + -resize;}
编译为:p { cursor: e-resize; }

用作运算表达式

1 p {2   margin: 3px + 4px auto;3 }4 5 编译为:6 p {7   margin: 7px auto;8 }

三、嵌套

sass允许选择器嵌套 

 1 div { 2   h1 { 3     color: red; 4   } 5 } 6  7 编译为: 8 div h1 { 9   color: red;10 } 

属性嵌套

div {  border: {        width: 1px;    color: #ccc;    style: solid;  }}编译为:div {  border-width: 1px;  border-color: #ccc;  border-style: solid; }

注意:border必须加上后面的冒号。

在嵌套的代码块内,使用&引用父元素。

 1 a { 2   color: #000; 3   &:hover{ 4     color: blue; 5   } 6 } 7  8 编译为: 9 a {10   color: #000;11 }12 a:hover {13   color: blue;14 }

如果没有父选择器,&的值将是空。这意味着你可以在一个mixin中使用它来检测父选择是否存在:

 1 @mixin does-parent-exist { 2   @if & { 3     &:hover { 4       color: red; 5     } 6   } @else { 7     a { 8       color: red; 9     }10   }11 } 

四、代码复用

4.1 @import

@import可以导入css文件也可导入sass文件。通常,@import会寻找 Sass 文件并将其导入,但在以下情况下,@import 仅作为普通的 CSS 语句,不会导入任何 Sass 文件。

  • 如果文件的扩展名是 .css
  • 如果文件名以 http:// 开始。
  • 如果文件名是 url()
  • 如果@import 中包含任何的媒体查询(media queries)。
1 //以下代码导入的是css文件2 @import "foo.css";3 @import "foo" screen;4 @import "http://foo.com/bar";5 @import url(foo);

@import可同时导入多个文件

1 @import  “reset.css”, "style";

@import导入的css文件在编译后不会被合并,但sass会被编译合并到css文件中。如果你有一个 SCSS 或 Sass 文件要导入,但不希望将其编译到一个CSS文件中,你可以在文件名的开头添加一个下划线,告诉Sass不要将其编译到一个正常的CSS文件中。但注意,在导入语句中不要添加下划线。例如:要导入的文件为"_main.scss",导入语句要写成:@import "main.scss";。另外注意,请不要将带下划线与不带下划线的同名文件放置在同一个目录下,因为带下划线的文件将会被忽略。

4.2 @extend

sass允许一个选择器继承另一选择器的样式,这也是工作中常遇到的需求。例如现在有class1 

.class1 {  border: 1px solid #ccc;  background-color: #fff;} 

class2要继承class1的样式,可以使用@extend

 1 .class1 { 2   border: 1px solid #ccc; 3   background-color: #fff; 4 } 5 .class2 { 6   @extend .class1; 7   font-size: 16px; 8 } 9 10 编译为:11 .class1, .class2 {12   border: 1px solid #ccc;13   background-color: #fff;14 }15 16 .class2 {17   font-size: 16px;18 }

4.3 @mixin

 混入(mixin)允许您定义可以在整个样式表中重复使用的样式,而避免了使用无语意的选择器。通过@mixin 加名称 就可以定义一个Mixins模块,在模块内你可以添加任何你想重复使用的样式。 

@mixin btn {    height: 40px;  padding: 5px 10px;  text-decoration: none;}.btn-block{  @include btn;  display: block;}编译为:.btn-block {  height: 40px;  padding: 5px 10px;  text-decoration: none;  display: block;} 

@mixin也可以包含在任何规则的外部(即,在文档的根),但注意不能被其他父选择器引用。

 1 @mixin silly-links { 2   a { 3     color: blue; 4     background-color: red; 5   } 6 } 7  8 @include silly-links; 9 /*以下p选择器会报错*/10 p{11   font-size: 14px;12   @include still-links;13 } 14 15 编译为:16 a {17   color: blue;18   background-color: red;19 }

@mixin另一个重要用处是可以指定参数和缺省值。

@mixin left($value: 10px) {  float: left; margin-left: $value;}div {  @include left(20px);}编译为:div {  float: left;  margin-left: 20px;}

利用混入,生成浏览器前缀的实例:

 1 @mixin rounded($vert, $horz,$radius: 10px){ 2     border-#{$vert}-#{$horx}-radius: $radius; 3     -moz-border-#{$vert}-#{$horx}radius: $radius; 4     -webkit- border-#{$vert}-#{$horx}-radius: $radius; 5 } 6 #navbar li { @include rounded(top, left); } 7  8 编译为: 9 #navbar li {10   border-top-left-radius: 10px;11   -moz-border-radius-topleft: 10px;12   -webkit-border-top-left-radius: 10px;13 } 

五、高级语法

sass支持基本的控制语句和表达式。

5.1 @if...@else 

$type: monster; p {   @if $type == ocean {      color: blue;    } @else if $type == matador {      color: red;    } @else if $type == monster {      color: green;    } @else {      color: black;    }  }编译为:p {  color: green;} 

5.2 @for语句

该指令有两种形式:@for $var from <start> through <end> 和 @for $var from <start> to <end>。

  @for $var from <start> through <end>:范围包括<start>和<end>的值。

  @for $var from <start> to <end>:从<start>开始运行,但不包括<end>的值。

<start><end>大的时候,计数器将递减,而不是增量。$var可以是任何变量名,比如$i。 

@for $i from 1 through 3 {    .item-#{$i} {      border: #{$i}px solid #ccc;    }  }  @for $i from 3 to 1 {    .list-#{$i} {      border: #{$i}px solid #ccc;    }  }编译为:.item-1 {  border: 1px solid #ccc;}.item-2 {  border: 2px solid #ccc;}.item-3 {  border: 3px solid #ccc;}.list-3 {  border: 3px solid #ccc;}.list-2 {  border: 2px solid #ccc;}

 5.3 @while语句

 1 $i:6; 2   @while $i > 0{ 3     .item-#{$i} { 4      width: #{$i}em; 5     } 6     $i: $i - 2; 7   } 8  9 编译为:10 .item-6 {11   width: 6em;12 }13 14 .item-4 {15   width: 4em;16 }17 18 .item-2 {19   width: 2em;20 }

5.4 @each

@each指令通常格式是@each $var in <list or map>。$var 可以是任何变量名,<list or map>是一个返回列表或map 的 SassScript 表达式。

 1 @each $animal in puma, sea-slug, egret, salamander { 2   .#{$animal}-icon { 3     background-image: url(‘/images/#{$animal}.png‘); 4   } 5 } 6  7 编译为: 8 .puma-icon { 9   background-image: url("/images/puma.png");10 }11 12 .sea-slug-icon {13   background-image: url("/images/sea-slug.png");14 }15 16 .egret-icon {17   background-image: url("/images/egret.png");18 }19 20 .salamander-icon {21   background-image: url("/images/salamander.png");22 }

还可以多重赋值

 1 @each $animal, $color, $cursor in (puma, black, default),(sea-slug, blue, pointer),(egret, white, move) { 2   .#{$animal}-icon { 3     background-image: url(‘/images/#{$animal}.png‘); 4     border: 2px solid $color; 5     cursor: $cursor; 6   } 7 } 8  9 编译为:10 .puma-icon {11   background-image: url("/images/puma.png");12   border: 2px solid black;13   cursor: default;14 }15 16 .sea-slug-icon {17   background-image: url("/images/sea-slug.png");18   border: 2px solid blue;19   cursor: pointer;20 }21 22 .egret-icon {23   background-image: url("/images/egret.png");24   border: 2px solid white;25   cursor: move;26 }

@each 用在maps键值对中。注意maps用圆括号括起来,而不是大括号。

 1 @each $key, $value in (h1:6em, h2:4em, h3:2em){ 2   #{$key}{ 3     height: $value; 4   } 5 } 6  7 编译为: 8 h1 { 9   height: 6em;10 }11 12 h2 {13   height: 4em;14 }15 16 h3 {17   height: 2em;18 } 

六、自定义函数

学习Sass(二)