學習筆記之SCSS

一、 變量

$btn-bg : darken(#fff, 6.5%) !default;
$btn-bg : darken(#000, 6.5%); //重寫就會覆蓋,無論順序是什麼樣的
$btn-border : darken($btn-bg, 5%) !default;

.btn-primary{
  $btn-bg : darken(#00f, 6.5%); //定義局部變量
  background-color: $btn-bg; //調用局部變量
  border: 1px solid $btn-border;
}

 

二、 嵌套

1.  選擇器嵌套

nav {
  a {
    color: red;
    header & {
      color: green;
    }
  }
}

編譯結果:

nav a {
  color: red;
}
header nav a {
  color: green;
}

 

2.  屬性嵌套

.box {
  border: {
   top: 1px solid red;
   bottom: 1px solid green;
  }
}

編譯結果:

.box {
    border-top: 1px solid red;
    border-bottom: 1px solid green;
}

 

3.  僞類嵌套

.clearfix {
  &:before,
  &:after {
    content: "";
    display: table;
  }
  &:after {
    clear: both;
    overflow: hidden;
  }
}

編譯結果:

.clearfix:before, .clearfix:after {
  content: "";
  display: table;
}
.clearfix:after {
  clear: both;
  overflow: hidden;
}

 

三、 混合宏

1.  混合宏不帶值的參數

(1) 聲明

@mixin border-radius($radius){
  -webkit-border-radius: $radius;
  border-radius: $radius;
}

(2) 調用

.box {
  @include border-radius(3px);
}

(3) 編譯

.box {
  -webkit-border-radius: 3px;
  border-radius: 3px;
}

 

2. 混合宏帶值的參數

(1) 聲明

@mixin border-radius($radius:3px){
  -webkit-border-radius: $radius;
  border-radius: $radius;
}

(2) 調用

.btn {
  @include border-radius;
}

或者重寫

.box {
  @include border-radius(50%);
}

(3) 編譯

.btn {
  -webkit-border-radius: 3px;
  border-radius: 3px;
}

.box {
  -webkit-border-radius: 50%;
  border-radius: 50%;
}

 

3. 傳多個參數

(1) 聲明

@mixin center($width,$height){
  width: $width;
  height: $height;
  position: absolute;
  top: 50%;
  left: 50%;
  margin-top: -($height) / 2;
  margin-left: -($width) / 2;
}

(2) 調用

.box-center {
  @include center(500px,300px);
}

(3) 編譯

.box-center {
  width: 500px;
  height: 300px;
  position: absolute;
  top: 50%;
  left: 50%;
  margin-top: -150px;
  margin-left: -250px;
}

 

4. 參數“...”

當混合宏傳的參數過多之時,可以使用參數來替代

(1) 聲明

@mixin box-shadow($shadows...){
  @if length($shadows) >= 1 {
    -webkit-box-shadow: $shadows;
    box-shadow: $shadows;
  } @else {
    $shadows: 0 0 2px rgba(#000,.25);
    -webkit-box-shadow: $shadow;
    box-shadow: $shadow;
  }
}

(2) 調用

.box {
  @include box-shadow(0 0 1px rgba(#000,.5),0 0 2px rgba(#000,.2));
}

(3) 編譯

@mixin box-shadow($shadows...){
  @if length($shadows) >= 1 {
    -webkit-box-shadow: $shadows;
    box-shadow: $shadows;
  } @else {
    $shadows: 0 0 2px rgba(#000,.25);
    -webkit-box-shadow: $shadow;
    box-shadow: $shadow;
  }
}

 

四、 擴展/繼承

.btn {
  border: 1px solid #ccc;
  padding: 6px 10px;
  font-size: 14px;
}

.btn-primary {
  background-color: #f36;
  color: #fff;
  @extend .btn;
}

.btn-second {
  background-color: orange;
  color: #fff;
  @extend .btn;
}

編譯結果:

.btn, .btn-primary, .btn-second {
  border: 1px solid #ccc;
  padding: 6px 10px;
  font-size: 14px;
}

.btn-primary {
  background-color: #f36;
  color: #fff;
}

.btn-second {
  background-clor: orange;
  color: #fff;
}

 

五、 佔位符 %placeholder

%placeholder 聲明的代碼,如果不被 @extend 調用的話,不會產生任何代碼。所以它可以取代以前 CSS 中的基類造成的代碼冗餘的情形。

%mt {
  margin-top: 5px;
}
%pt{
  padding-top: 5px;
}
.btn {
  @extend %mt;
}

編譯結果:

.btn {
  margin-top: 5px;
}

 

混合宏、繼承、佔位符比較

 

混合宏

繼承

佔位符

聲明方式

@mixin

.class

%placeholder

調用方式

@include

@extend

@extend

使用環境

代碼塊中涉及到變量

代碼塊不需要專任何變量參數,而且有一個基類已在文件中存在

和繼承基本類似

不足

多次出現調用的混合宏對應的代碼塊,代碼冗餘

如果基類並不存在於HTML結構時,無論調用與否,在編譯出來的CSS中都將產生基類對應的樣式代碼

 

六、 插值#{}

可以在@extend 中使用,不能在@mixin使用

$properties: (margin, padding);
@mixin set-value($side, $value) {
    @each $prop in $properties {
        #{$prop}-#{$side}: $value;
    }
}
.login-box {
    @include set-value(top, 14px);
}

.login-box {
    margin-top: 14px;
    padding-top: 14px;
}

 

七、 註釋

/* 註釋 */

在編譯出來的 CSS 顯示

// 註釋

在編譯出來的 CSS 中不會顯示

 

八、 運算

p {
  font: 10px/8px;             // 純 CSS,不是除法運算
  $width: 1000px;
  width: $width/2;            // 使用了變量,是除法運算
  width: round(1.5)/2;        // 使用了函數,是除法運算
  height: (500px/2);          // 使用了圓括號,是除法運算
  margin-left: 5px + 8px/2px; // 使用了加(+)號,是除法運算
}

編譯結果:

p {
  font: 10px/8px;
  width: 500px;
  height: 250px;
  margin-left: 9px;
 }

對於攜帶不同類型的單位時,在 Sass 中計算會報錯,如下例所示:

.box {
  width: 20px - 1em;
}

編譯的時候,編譯器會報錯:“Incompatible units: 'em' and ‘px'.”

 

九、 @for循環

@for $i from <start> through <end>

through 表示包括 end 這個數

@for $i from <start> to <end>

 to 不包括 end 這個數

實例:

$grid-prefix: span !default;
$grid-width: 60px !default;
$grid-gutter: 20px !default;

%grid {
  float: left;
  margin-left: $grid-gutter / 2;
  margin-right: $grid-gutter / 2;
}

@for $i from <start> through <end>

@for $i from 1 through 12 {
  .#{$grid-prefix}#{$i}{
    width: $grid-width * $i + $grid-gutter * ($i - 1);
    @extend %grid;
  }  
}

@for $i from <start> to <end>

@for $i from 1 to 13 {
  .#{$grid-prefix}#{$i}{
    width: $grid-width * $i + $grid-gutter * ($i - 1);
    @extend %grid;
  }  
}

 

十、 @while循環

$types: 4;
$type-width: 20px;

@while $types > 0 {
    .while-#{$types} {
        width: $type-width + $types;
    }
    $types: $types - 1;
}

編譯結果:

.while-4 {
  width: 24px;
}

.while-3 {
  width: 23px;
}

.while-2 {
  width: 22px;
}

.while-1 {
  width: 21px;
}

 

十一、 @each循環

$list: adam john wynn mason kuroir;  //$list 就是一個列表

@mixin author-images {
    @each $author in $list {
        .photo-#{$author} {
            background: url("/images/avatars/#{$author}.png") no-repeat;
        }
    }
}

.author-bio {
    @include author-images;
}

編譯結果:

.author-bio .photo-adam {
  background: url("/images/avatars/adam.png") no-repeat;
}
.author-bio .photo-john {
  background: url("/images/avatars/john.png") no-repeat;
}
.author-bio .photo-wynn {
  background: url("/images/avatars/wynn.png") no-repeat;
}
.author-bio .photo-mason {
  background: url("/images/avatars/mason.png") no-repeat;
}
.author-bio .photo-kuroir {
  background: url("/images/avatars/kuroir.png") no-repeat;
}

 

十二、 字符串函數

1. unquote()函數

scss

css

unquote('Hello Sass!')

Hello Sass!

unquote("'Hello Sass!")

'Hello Sass!

unquote("I'm Web Designer")

I'm Web Designer

unquote("'Hello Sass!'")

'Hello Sass!'

unquote('"Hello Sass!"')

"Hello Sass!"

unquote(Hello Sass)

Hello Sass

 

2. quote() 函數

quote() 函數剛好與 unquote() 函數功能相反,主要用來給字符串添加引號。如果字符串,自身帶有引號會統一換成雙引號 ""。

 

3. 其他函數

函數

作用

scss

css

To-upper-case()

將字符串轉換成大寫字母

to-upper-case(aA-a)

AA-A

To-lower-case()

將字符串轉換成小寫字母

to-lower-case(aA-a)

aa-a

percentage($value)

將一個不帶單位的數轉換成百分數

percentage(2px / 10px)

20%

round($value)

將數值四捨五入,轉換成一個最接近的整數

round(12.3px)

12px;

ceil($value)

將大於自己的小數轉換成下一位整數

ceil(2.3%)

3%

floor($value)

將一個數去除他的小數部分

floor(10.8em)

10em

abs($value)

返回一個數的絕對值

abs(-.5%)

0.5%

min($numbers…)

找出幾個數值之間的最小值

min(1,2,1%,3,300%)

1%

max($numbers…)

找出幾個數值之間的最大值

max(1px,5px)

5px

random()

獲取隨機數

random()

隨機數

length($list)

返回一個列表的長度值

length(10px 20px (border 1px solid) 2em)

4

nth($list, $n)

返回一個列表中指定的某個標籤值

nth((1px solid red) border-top green,1)

 

(1px "solid" #ff0000)

join($list1, $list2, [$separator])

兩個列表連接合併成一個列表

join((blue,red),(#abc,#def),comma)

 

(#0000ff, #ff0000, #aabbcc, #ddeeff)

append($list1, $val, [$separator])

將某個值放在列表的最後

append((blue green),red,space)

(#0000ff #008000 #ff0000)

zip($lists…)

將幾個列表結合成一個多維的列表

zip(1px 2px 3px,solid dashed dotted,green blue red)

((1px "solid" #008000), (2px "dashed" #0000ff), (3px "dotted" #ff0000))

index($list, $value)

返回一個值在列表中的位置值,第一個值就是1,不在列表中返回false,

index(1px solid red, red)

3

 

type-of($value)

返回一個值的類型

type-of(1 / 2 = 1)

"string"

unit($number)

返回一個值的單位(只充許乘、除運算)

unit(10px * 3em)

 

"em*px"

 

(加、減碰到不同單位時,unit() 函數將會報錯,除 px 與 cm、mm 運算之外)

unit(1px - 1cm)

"px"

unitless($number)

判斷一個值是否帶有單位,不帶單位返回的值爲 true,帶單位返回的值爲 false

unitless(1 /2 + 2 )

 

true

comparable($number-1, $number-2)

判斷兩個值是否可以做加、減和合並

comparable(2rem,1em)

 

false

if($condition,$if-true,$if-false)

當條件成立返回一種值,當條件不成立時返回另一種值

if(true,1px,2px)

 

1px

 

十三、 Map

1. map示例

$map: (
    $key1: value1,
    $key2: value2,
    $key3: value3
)

示例:

換皮膚的項目,可能每一套皮膚對應的顏色蠻多的,那麼使用此功能來管理顏色的變量就非常的有條理性,便於維護與管理。

$theme-color: (
    default: (
        bgcolor: #fff,
        text-color: #444,
        link-color: #39f
    ),
    primary:(
        bgcolor: #000,
        text-color:#fff,
        link-color: #93f
    ),
    negative: (
        bgcolor: #f36,
        text-color: #fefefe,
        link-color: #d4e
    )
);

 

2. map-get($map,$key)

map-get($map,$key):根據給定的 key 值,返回 map 中相關的值。

map-get($map,$key) 函數的作用是根據 $key 參數,返回 $key 在 $map 中對應的 value 值。如果 $key 不存在 $map中,將返回 null 值。此函數包括兩個參數:

$map:定義好的 map。

$key:需要遍歷的 key。

 

示例:

$social-colors: (
    dribble: #ea4c89,
    facebook: #3b5998,
    github: #171515,
    google: #db4437,
    twitter: #55acee
);
.btn-dribble{
  color: map-get($social-colors,facebook);
}

編譯結果:

.btn-dribble {
  color: #3b5998;
}

 

3. map-merge($map1,$map2)

map-merge($map1,$map2) 函數是將 $map1 和 $map2 合併,然後得到一個新的 $map。

$color: (
    text: #f36,
    link: #f63,
    border: #ddd,
    backround: #fff
);
$typo:(
    font-size: 12px,
    line-height: 1.6
);
$newmap: map-merge($color,$typo);

編譯結果:

$newmap:(
    text: #f36,
    link: #f63,
    border: #ddd,
    background: #fff,
    font-size: 12px,
    line-height: 1.6
);

 

注意,如果 $map1 和 $map2 中有相同的 $key 名,那麼將 $map2 中的 $key 會取代 $map1 中的:

$color: (
    text: #f36,
    link: #f63,
    border: #ddd,
    backround: #fff
);
$typo:(
    font-size: 12px,
    line-height: 1.6,
    border: #ccc,
    background: #000
);
$newmap: map-merge($color,$typo);

編譯結果:

$newmap:(
    text: #f36,
    link: #f63,
    font-size: 12px,
    line-height: 1.6,
    border: #ccc,
    background: #000
);

 

4. keywords($args)

動態創建 map 的函數。可以通過混合宏或函數的參數變創建 map

@mixin map($args...){
    @debug keywords($args);
}

@include map(
  $dribble: #ea4c89,
  $facebook: #3b5998,
  $github: #171515,
  $google: #db4437,
  $twitter: #55acee
);

在命令終端可以看到一個輸入的 @debug 信息:

 DEBUG: (dribble: #ea4c89, facebook: #3b5998, github: #171515, google: #db4437, twitter: #55acee)

 

5. 其它

 

函數

作用

示例

編譯結果

map-has-key($map,$key)

 

當 $map 中有這個 $key,則函數返回 true,否則返回 false。

 

map-has-key($social-colors,$color)

true/false

map-keys($map)

將會返回 $map 中的所有 key

map-keys($social-colors);

"dribble","facebook","github","google","twitter"

map-values($map)

)獲取的是 $map 的所有 value 值,如果有相同的 value 也將會全部獲取出來

map-values($social-colors)

#ea4c89,#3b5998,#171515,#db4437,#55acee

map-remove($map,$key)

刪除當前 $map 中的某一個 $key

$map:map-remove($social-colors,dribble);

$map:(

    facebook: #3b5998,

    github: #171515,

    google: #db4437,

    twitter: #55acee

);

 

十四、 顏色

函數

作用

示例

編譯結果

red($color)

從一個顏色中獲取其中紅色值

red(#c82858)

200

green($color)

從一個顏色中獲取其中綠色值

green(#c82858)

40

blue($color)

從一個顏色中獲取其中藍色值

blue(#c82858)

88

mix($color-1,$color-2,[$weight])

 

將兩種顏色根據一定的比例混合在一起(weight爲第一個顏色所佔比例)

mix(#f00, #00f, 25%)

#3f00bf

hsl($hue,$saturation,$lightness)

通過色相(hue)、飽和度(saturation)和亮度(lightness)的值創建一個顏色

hsl(200,30%,60%)

#7aa3b8

hsla($hue,$saturation,$lightness,$alpha)

通過色相(hue)、飽和度(saturation)、亮度(lightness)和透明(alpha)的值創建一個顏色

hsla(200,30%,60%,.8)

rgba(122, 163, 184, 0.8)

hue($color)

從一個顏色中獲取色相(hue)值

hue(#7ab)

195deg

saturation($color)

從一個顏色中獲取飽和度(saturation)值

saturation(#7ab)

33.33333%

lightness($color)

從一個顏色中獲取亮度(lightness)值

lightness(#ad141e)

37.84314%

adjust-hue($color,$degrees)

通過改變一個顏色的色相值,創建一個新的顏色

adjust-hue($baseColor,30deg)

#ad5614

lighten($color,$amount)

通過改變顏色的亮度值,讓顏色變亮,創建一個新的顏色

lighten($baseColor,70%)

#db1926

darken($color,$amount)

通過改變顏色的亮度值,讓顏色變暗,創建一個新的顏色

darken($baseColor,40%)

#7f0f16

saturate($color,$amount)

通過改變顏色的飽和度值,讓顏色更飽和,從而創建一個新的顏色

saturate($baseColor,30%)

#c1000d

desaturate($color,$amount)

通過改變顏色的飽和度值,讓顏色更少的飽和,從而創建出一個新的顏色

desaturate($baseColor,30%)

#903137

grayscale($color)

將一個顏色變成灰色,相當於desaturate($color,100%)

grayscale($baseColor)

#616161

complement($color)

返回一個補充色,相當於adjust-hue($color,180deg)

complement(#f36)

 

#33ffcc

invert($color)

反回一個反相色,紅、綠、藍色值倒過來,而透明度不變

invert(#f36)

 

#00cc99

alpha($color) /opacity($color)

獲取顏色透明度值

alpha(rgba(red,.8))

0.8

opacify($color, $amount) / fade-in($color, $amount)

使顏色更不透明

opacify(red,.15)

#ff0000

fade-in(rgba(23,34,34,.5),.15)

rgba(23, 34, 34, 0.65)

transparentize($color, $amount) / fade-out($color, $amount)

使顏色更加透明

transparentize(#fde,.9)

rgba(255, 221, 238, 0.1)

fade-out(hsla(98,6%,23%,.5),.6)

rgba(58, 62, 55, 0)

 

十五、 @ 規則

1. @import 

引入 SCSS 和 Sass 文件

 

(1) 示例

@import "foo.css";
@import "foo" screen;
@import "http://foo.com/bar";
@import url(foo);

編譯結果:

@import "foo.css";
@import "foo" screen;
@import "http://foo.com/bar";
@import url(foo);

 

(2) 嵌套@import

example.scss

.example {
  color: red;
}
#main {
  @import "example";
}

編譯結果:

#main .example {
  color: red;
}

 

2. @media

(1) 示例:

.sidebar {
  width: 300px;
  @media screen and (orientation: landscape) {
    width: 500px;
  }
}

編譯結果:

.sidebar {
  width: 300px;
}
@media screen and (orientation: landscape) {
  .sidebar {
    width: 500px;
  }
}

 

(2) 嵌套 @media

@media screen {
  .sidebar {
    @media (orientation: landscape) {
      width: 500px;
    }
  }
}

編譯結果:

@media screen and (orientation: landscape) {
  .sidebar {
    width: 500px;
  }
}

 

3. @at-root

跳出根元素

.a {
  color: red;

  .b {
    color: orange;

    .c {
      color: yellow;

      @at-root .d {
        color: green;
      }
    }
  }
}

編譯結果

.a {
    color: red;
}

.a .b {
    color: orange;
}

.a .b .c {
    color: yellow;
}

.d {
    color: green;
}

 

4. @debug

@debug 在 Sass 中是用來調試的,在 Sass 的源碼中使用了 @debug 指令之後,Sass 代碼在編譯出錯時,在命令終端會輸出設置的提示 Bug:
 

@debug 10em + 12em;

會輸出:

Line 1 DEBUG: 22em

 

5. @warn

@warn 和 @debug 功能類似,用來幫助我們更好的調試 Sass。如:

@mixin adjust-location($x, $y) {
  @if unitless($x) {
    @warn "Assuming #{$x} to be in pixels";
    $x: 1px * $x;
  }
  @if unitless($y) {
    @warn "Assuming #{$y} to be in pixels";
    $y: 1px * $y;
  }
  position: relative; left: $x; top: $y;
}

 

6. @error

@error 和 @warn、@debug 功能是如出一轍。

@mixin error($x){
  @if $x < 10 {
    width: $x * 10px;
  } @else if $x == 10 {
    width: $x;
  } @else {
    @error "你需要將#{$x}值設置在10以內的數";
  }

}

.test {
  @include error(15);
}

編譯的時候:

你需要將15值設置在10以內的數 on line 7 at column 5

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章