SCSS 语法使用 .scss 文件扩展名。除了极少部分的例外, 它是 CSS 的超集,也就是说 全部有效的 CSS 也一样都是有效的 SCSS 。 因为其与 CSS 的类似性,它是最容易上手的语法, 也是最流行的语法。css
SASS全部变量以$开头,例如:html
$blue : #1875e7; div { color : $blue; }
若是变量须要镶嵌在字符串之中,就必须须要写在#{}之中。vue
$side : left; .rounded { border-#{$side}-radius: 5px; }
SASS容许在代码中使用算式:git
body { margin: (14px/2); top: 50px + 100px; right: $var * 10%; }
SASS容许选择器嵌套。好比,下面的CSS代码:github
div h1 { color : red; }
能够写成:web
div { hi { color:red; } }
属性也能够嵌套,好比border-color属性,能够写成:api
p { border: { color: red; } }
注意,border后面必须加上冒号。浏览器
在嵌套的代码块内,可使用&引用父元素。好比a:hover伪类,能够写成:sass
a { &:hover { color: #ffb3ff; } }
SASS共有两种注释风格。网络
标准的CSS注释 / comment / ,会保留到编译后的文件。
单行注释 // comment,只保留在SASS源文件中,编译后被省略。
含义是“by default",即”默认值是“,例如:
$heading-font-family:$body-font-family !default;`
我的理解的一点补充:在指出默认值的同时,还强调这个值的重要性。
继承
SASS容许一个选择器,继承另外一个选择器。好比,现有class1:
.class1 { border: 1px solid #ddd; }
class2要继承class1,就要使用@extend命令:
.class2 { **@extend** .class1; font-size:120%; }
Mixin有点像C语言的宏(macro),是能够重用的代码块。
使用@mixin命令,定义一个代码块。
@mixin left { float: left; margin-left: 10px; }
使用@include命令,调用这个mixin。
div {
@include left;
}
mixin的强大之处,在于能够指定参数和缺省值。
@mixin left($value: 10px) {
float: left;
margin-right: $value;
}
使用的时候,根据须要加入参数:
div {
@include left(20px);
}
下面是一个mixin的实例,用来生成浏览器前缀。
@mixin rounded($vert, $horz, $radius: 10px) {
border-#{$vert}-#{$horz}-radius: $radius;
-moz-border-radius-#{$vert}#{$horz}: $radius;
-webkit-border-#{$vert}-#{$horz}-radius: $radius;
}
使用的时候,能够像下面这样调用:
#navbar li { @include rounded(top, left); }
#footer { @include rounded(top, left, 5px); }
SASS提供了一些内置的颜色函数,以便生成系列颜色。
lighten(#cc3, 10%) // #d6d65c
darken(#cc3, 10%) // #a3a329
grayscale(#cc3) // #808080
complement(#cc3) // #33c
@import命令,用来插入外部文件。
@import "path/filename.scss";
若是插入的是.css文件,则等同于css的import命令。
@import "foo.css";
@if能够用来判断:
p {
@if 1 + 1 == 2 { border: 1px solid; }
@if 5 < 3 { border: 2px dotted; }
}
配套的还有@else命令:
@if lightness($color) > 30% {
background-color: #000;
} @else {
background-color: #fff;
}
SASS支持for循环:
@for $i from 1 to 10 {
.border-#{$i} {
border: #{$i}px solid blue;
}
}
也支持while循环:
$i: 6;
@while $i > 0 {
.item-#{$i} { width: 2em * $i; }
$i: $i - 2;
}
做用与for相似:
@each $member in a, b, c, d {
.#{$member} {
background-image: url("/image/#{$member}.jpg");
}
}
SASS容许用户编写本身的函数。
@function double($n) {
@return $n * 2;
}
#sidebar {
width: double(5px);
}
在 Sass 中 map 自身带了七个函数:
map-get($map,$key):根据给定的 key 值,返回 map 中相关的值。
map-merge($map1,$map2):将两个 map 合并成一个新的 map。
map-remove($map,$key):从 map 中删除一个 key,返回一个新 map。
map-keys($map):返回 map 中全部的 key。
map-values($map):返回 map 中全部的 value。
map-has-key($map,$key):根据给定的 key 值判断 map 是否有对应的 value 值,若是有返回 true,不然返回 false。
keywords($args):返回一个函数的参数,这个参数能够动态的设置 key 和 value。
Sass Maps的函数
map-get($map,$key) 函数的做用是根据 $key 参数,返回 $key 在 $map 中对应的 value 值。若是 $key 不存在 $map中,将返回 null 值。此函数包括两个参数:
$map:定义好的 map。
$key:须要遍历的 key。
//SCSS
$social-colors: (
dribble: #ea4c89,
facebook: #3b5998,
github: #171515,
google: #db4437,
twitter: #55acee
);
.btn-dribble{
color: map-get($social-colors,facebook);
}
//编译后的css
.btn-dribble {color: #3b5998; }
map-has-key($map,$key) 函数将返回一个布尔值。当 $map 中有这个 $key,则函数返回 true,不然返回 false。
@if map-has-key($social-colors,facebook){
.btn-facebook {
color: map-get($social-colors,facebook);
}
} @else {
@warn "No color found for faceboo in $social-colors map. Property ommitted."
}
但总以为这样写是傻傻的,总不可能每获取一个 key 都写一个 @if 语句吧。其实不用这么复杂,咱们能够自定义一个函数,好比 colors():
@function colors($color){
@if not map-has-key($social-colors,$color){
@warn "No color found for #{$color}
in $social-colors map. Property omitted.";
}
@return map-get($social-colors,$color);
}
有了这个函数以后,咱们就能够这样使用
.btn-dribble {
color: colors(dribble);
}
.btn-facebook {
color: colors(facebook);
}
.btn-github {
color: colors(github);
}
.btn-google {
color: colors(google);
}
.btn-twitter {
color: colors(twitter);
}
.btn-weibo {
color: colors(weibo);
}
固然,若是你对 Sass 的指令熟悉的话,可使用 @each:
ocial-network:dribble,facebook,github,google,twtter,weibo;<br>@each $social-network,$social-color in $social-colors {
.btn-#{$social-network} {
color: colors($social-network);
}
}
map-keys($map) 函数将会返回 $map 中的全部 key。这些值赋予给一个变量,那他就是一个列表。如:
map-keys($social-colors);
其返回的值为:
"dribble","facebook","github","google","twitter"
换句话说:
$list: map-keys($social-colors);
至关于:
$list:"dribble","facebook","github","google","twitter";
这个时候,就能够配合 Sass 的 list 作不少事情。
上面的示例,能够作经过 map-keys($map) 来作一个修改:
@function colors($color){
$names: map-keys($social-colors);
@if not index($names,$color){
@warn "Waring: #{$color} is not a valid color name.
";
}
@return map-get($social-colors,$color);
}
上面代码中最不一样之处,咱们使 用map-key s将 $social-colors 这个 map 的全部 key 取出,并赋予给一个名 为 $names 的列表。而后经过 index($names,$color) 返回 $color 在 $names 位置,若是这个位置不存在,将返回提示信息,若是存在将返回正确的值。
一样,也能够经过 @each 或者 @for 遍历出全部值:
// @each
@each $name in map-keys($social-colors){
.btn-#{$name}{
color: colors($name);
}
}
//@for
@for $i from 1 through length(map-keys($social-colors)){
.btn-#{nth(map-keys($social-colors),$i)} {
color: colors(nth(map-keys($social-colors),$i));
}
}
虽然使用的方法不同,但最终获得的 CSS 是同样的
map-values($map) 函数相似于 map-keys($map) 功能,不一样的是 map-values($map )获取的是 $map 的全部 value 值,能够说也将是一个列表。并且,map-values($map) 中若是有相同的 value 也将会所有获取出来。
如前面的示例,使用:
map-values($social-colors)
将会返回:
#ea4c89,#3b5998,#171515,#db4437,#55acee
值与值以前一样用逗号分隔。
map-merge($map1,$map2)
map-merge($map1,$map2) 函数是将 $map1 和 $map2 合并,而后获得一个新的 $map。若是你要快速将新的值插入到 $map 中的话,这种方法是最佳方法
如:
$color: (
text: #f36,
link: #f63,
border: #ddd,
backround: #fff
);
$typo:(
font-size: 12px,
line-height: 1.6
);
//若是但愿将这两个 $map 合并成一个 map,咱们只要这样作:
$newmap: map-merge($color,$typo);
//将会生成一个新的 map:
$newmap:(
text: #f36,
link: #f63,
border: #ddd,
background: #fff,
font-size: 12px,
line-height: 1.6
);
这样你就能够借助 map-get( ) 等函数作其余事情了。
不过有一点须要注意,若是 $map1 和 $map2 中有相同的 $key 名,那么将 $map2 中的 $key 会取代 $map1 中的值
map-remove($map,$key) 函数是用来删除当前 $map 中的某一个 $key,从而获得一个新的 map。其返回的值仍是一个 map。他并不能直接从一个 map 中删除另外一个 map,仅能经过删除 map 中的某个 key 获得新 map。如:
$map:map-remove($social-colors,dribble);
返回的是一个新 map:
facebook: #3b5998, github: #171515, google: #db4437, twitter: #55acee
);
若是删除的 key 并不存在于 $map 中,那么 map-remove() 函数返回的新 map 和之前的 map 同样。
最近,我在分析vuetify自带的SASS变量定义列表中发现map-deep-merge映射函数频繁出现,网络搜索没有直接对应内容。
最后,在SASS官网上找到相关定义,以下:
map.deep-merge($map1, $map2) //=> map
解释是:”Identical to map.merge(), except that nested map values are also recursively merged.“
示例代码以下:
$helvetica-light: ("weights": ("lightest": 100, "light": 300)) $helvetica-heavy: ("weights": ("medium": 500, "bold": 700)) @debug map.deep-merge($helvetica-light, $helvetica-heavy)
其实,在Vuetify应用中更常出现的是以下形式:
$grid-breakpoints: map-deep-merge( ( 'xs': 0, 'sm': 600px, 'md': 960px, 'lg': 1280px - 16px, 'xl': 1920px - 16px ), $grid-breakpoints );
http://www.ruanyifeng.com/blog/2012/06/sass.html
https://sass-lang.com/documentation/modules/map#deep-merge
https://www.cnblogs.com/kt520/p/5711740.html
https://vuetifyjs.com/en/api/vuetify/