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/