sass基本语法
1.定义一个变量,变量定义以$开头,以冒号分隔开。
$blue:#1875e7; div{ color:$blue; } 编译之后的css代码: div { color: #1875e7; }
定义一个带默认值的变量。默认变量只需要在普通变量后面加上 !default
$baseLineHeight:1.5 !default; $baseLineHeight:3; body{ line-height:$baseLineHeight; } 编译后的css代码: body { line-height: 3; }
line-height的默认值是1.5,然后被3覆盖了,所以值是3. 和赋值的先后顺序无关,即使把默认值放到赋值的后面,结果也还是3.
此外,sass局部变量和全局变量(sass 3.4之后的版本才会有局部变量,3.4之前的都是全局变量)。变量值后面加上!global 变成全局变量。
/* sass3.4之后的版本 */ $fontSize:16px; body{ $fontSize:20px; font-size:$fontSize; } p{ font-size:$fontSize; } 编译之后的css代码: body { font-size: 20px; } p { font-size: 16px; }//3.4之前的版本值是20px,因为都是全局变量
使用全局变量之后,sass 3.4之后才能转换成功
$fontSize:16px; body{ $fontSize:20px !global; font-size:$fontSize; } p{ font-size:$fontSize; } 转换之后css代码: body { font-size: 20px; } p { font-size: 20px; }
变量作为属性名来使用(一般我们定义的变量都是属性值),要以#{$variableName}形式。
$side:left; div{ border-#{$side}-radius:5px; } //转化之后的css代码: div { border-left-radius: 5px; }
2.变量复杂一点的用法,多值变量。多值变量分为list类型和map类型,list类似js数组,map类似js中的对象。list数据可以通过空格,逗号,小括号分隔多个值,常用的函数,nth($list,$index), length($list), append($list, $value, [$separator]).
$pxs:5px 10px 15px 20px; h8{ margin-left:nth($pxs,1); &:hover{ margin-top:nth($pxs,2); } } //转换之后的css代码: h8 { margin-left: 5px; } h8:hover { margin-top: 10px; }
list另外一个栗子,
$pxs:5px,10px,15px,20px; h9{ $len:length($pxs); margin-right:nth($pxs,$len); } //转换之后的css: h15 { margin-right: 20px; }
map类型的例子。。。map数据以key和value成对出现。看看w3cplus上的一个例子。开始的时候,总是转换失败,后面发现是sass版本的问题,我sass用的是3.4.21版本,之前用的是3.2.13老是转换失败,还以为是语法写的有错误呢。。。
$headings: (h1: 2em, h2: 1.5em, h3: 1.2em); @each $header, $size in $headings { #{$header} { font-size: $size; } } //转化过后的css h1 { font-size: 2em; } h2 { font-size: 1.5em; } h3 { font-size: 1.2em; }
3.嵌套,嵌套包括两种:选择器嵌套 和 属性嵌套。
选择器嵌套,在一个选择器中嵌套另一个选择器,通过&引用外层选择器。
$blue:#1875e7; a{ color:red; &:hover{ color:$blue; } } //转换后的css a { color: red; } a:hover { color: #1875e7; }
属性嵌套,有些属性拥有相同的前缀,可以提取出来,书写更方便。
/*属性嵌套*/ h16{ margin:{ left:5px; right:15px; } } //转换之后的css /*属性嵌套*/ h16 { margin-left: 5px; margin-right: 15px; }
4.继承, 选择器的继承可以让选择器继承另一个选择器的所有样式,要使用关键词@extend ,后面紧跟要继承的选择器。
/*选择器的继承*/ .class1{ border:1px; } .class2{ @extend .class1; font-size:120%; } //转换之后的css .class1, .class2 { border: 1px; } .class2 { font-size: 120%; }
占位选择器% ,占位选择器的优势是,对于预先定义的基础样式,需要的时候使用@extend去继承它,不需要的时候,不会继承到。
%ir{ color: transparent; border: 0; } #header{ h1{ @extend %ir; width:300px; } h2{ width:500px; } } .ir{ @extend %ir; } //转换之后的css #header h1, .ir { color: transparent; border: 0; } #header h1 { width: 300px; } #header h2 { width: 500px; }
5.函数,sass已经定义好了很多函数,可以直接使用,如:length($list) ,nth($list,$n) .也可以自己定义一个函数使用@function。
下面是把px转换成rem的例子。
$baseFontSize:16px!default; @function pxToRem($px){ @return $px/$baseFontSize*1rem; } body{ font-size:pxToRem(10px); } //转换之后的css body { font-size: 0.625rem; }
6.混合(mixin),混合定义可重用的代码块,sass中通过@mixin来声明混合,@include来调用。
@mixin left($value:10px){ float:left; margin-right:$value; } h16{ @include left(5px); } h17{ @include left(); } //转换后的css h16 { float: left; margin-right: 5px; } h17 { float: left; margin-right: 10px; }
@content 用来解决css3的@media问题。。。。。。。。。。。。
@mixin 可以接受一整块样式,接受的样式从@content开始。
@mixin max-screen($res){ @media only screen and (max-width:$res){ @content; } } @include max-screen(480px){ body{color:red;} } //转换后的css @media only screen and (max-width: 480px) { body { color: red; } }
7.条件判断及循环。
a.@if{}@else{}
b.@if($condition,$if_true,$if_else)
c.@for($i from <start> through <end>) 包含end
d.@for($i from <start> to <end>) 不包含end
e.@each $item in <list or map>
之前在写@each 的时候碰到个问题。我之前使用的是sass3.2.13版本 对于对字段循环不支持,sass3.3.0之后的版本才会支持哦。不然转换时一直会报错,不能成功。
$headings: (h1: 2em, h2: 1.5em, h3: 1.2em); @each $header, $size in $headings { #{$header} { font-size: $size; } } //转换成css h1 { font-size: 2em; } h2 { font-size: 1.5em; } h3 { font-size: 1.2em; }
把px转换成rem,支持同时输入多个值,以及一些特殊值如0的输入。
@function rem($values...) { $all_rem: (); $separator: list-separator($values); @each $value in $values { $rem: null; @if type-of($value) == list { // List: process each value on its own $rem: rem($value...); } @else if is_zero($value) { // Zero: enforce no units $rem: 0; } @else if need_convert($value) { // if need convert we will convert it to rem depend on the base font size. $base_font_value: strip_units($rem_font_size); $rem: (strip_units($value / $base_font_value) * 1rem); } @else { $rem: $value; } $all_rem: append($all_rem, $rem, $separator); } @return $all_rem; } @function strip_units($num) { @return $num / (($num * 0) + 1); } @function is_zero($value) { @return type-of($value) == number and strip_units($value) == 0; } @function need_convert($value) { $px_units: 'px', 'pt'; @return type-of($value) == number and not unitless($value) and index($px_units, unit($value)); }
测试一下
div{ padding:rem(0 5px 0 10px); } //转换之后的css div { padding: 0rem 0.3125rem 0rem 0.625rem; }