SASS經常使用語法備忘錄

關於SCSS

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源文件中,編譯後被省略。

!default

含義是「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

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;
  }

each命令

做用與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)

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-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-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-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)
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-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 同樣。

map-deep-merge新映射函數

最近,我在分析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/

相關文章
相關標籤/搜索