SCSS 語法介紹

SCSS(Sassy CSS)是 Sass 的一種語法,它擴展了 CSS,提供了一些強大的功能,如變量、嵌套、Mixin、繼承、運算等,使樣式開發更加靈活和高效。SCSS 是 CSS 的超集,這表示所有有效的 CSS 代碼也是有效的 SCSS 代碼。

以下是 SCSS 語法的詳細介紹:

1. 變量 ($ 符號)

SCSS 支持變量,變量可以存儲顏色、字體、尺寸等值,並在樣式表中重複使用。

scss 範例:

$primary-color: #3498db;
$font-stack: Helvetica, sans-serif;
$base-margin: 10px;

body {
font-family: $font-stack;
color: $primary-color;
margin: $base-margin;
}
css 結果:

body {
  font-family: Helvetica, sans-serif;
  color: #3498db;
  margin: 10px;
}

2. 嵌套

SCSS 支持選擇器的嵌套,這使得樣式層次結構更加清晰,並且可以模仿 HTML 結構進行樣式設計。

scss 範例:

nav {
ul {
list-style: none;
}

li {
display: inline-block;
}

a {
text-decoration: none;
color: $primary-color;

&:hover {
text-decoration: underline;
}
}
}
css 結果:

nav ul {
  list-style: none;
}

nav li {
  display: inline-block;
}

nav a {
  text-decoration: none;
  color: #3498db;
}

nav a:hover {
  text-decoration: underline;
}

3. 父選擇器引用 (& 符號)

在嵌套中,& 用來引用父選擇器。這在處理偽類、偽元素或修改父元素樣式時非常有用。

scss 範例:

.button {
display: inline-block;
padding: 10px 20px;

&:hover {
background-color: darken($primary-color, 10%);
}

&.active {
background-color: $primary-color;
}
}
css 結果:

.button {
  display: inline-block;
  padding: 10px 20px;
}

.button:hover {
  background-color: #2980b9;
}

.button.active {
  background-color: #3498db;
}

4. Mixin(混合)

Mixin 是一種可以重複使用的樣式塊,類似於函數。你可以通過 @mixin 來定義 Mixin,並使用 @include 來調用。

scss 範例:

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

.button {
@include border-radius(10px);
}
css 結果:

.button {
  -webkit-border-radius: 10px;
  -moz-border-radius: 10px;
  border-radius: 10px;
}

5. 繼承 (@extend)

SCSS 支持繼承樣式,這樣可以讓一個選擇器繼承另一個選擇器的樣式。

scss 範例:

.message {
padding: 10px;
border: 1px solid #ddd;
color: #333;
}

.success {
@extend .message;
border-color: green;
}

.error {
@extend .message;
border-color: red;
}
css 結果:

.message, .success, .error {
  padding: 10px;
  border: 1px solid #ddd;
  color: #333;
}

.success {
  border-color: green;
}

.error {
  border-color: red;
}

6. 運算

SCSS 支持數字、顏色、字串等運算,可以在樣式中進行加減乘除或顏色操作。

scss 數字運算:

$base-padding: 10px;

.container {
padding: $base-padding * 2;
}
css 結果:

.container {
  padding: 20px;
}
scss 顏色運算:

$primary-color: #3498db;

.button {
background-color: lighten($primary-color, 10%);
}

.alert {
background-color: darken($primary-color, 10%);
}
css 結果:

.button {
  background-color: #5dade2;
}

.alert {
  background-color: #2980b9;
}

7. 條件與循環

SCSS 允許使用條件語句和循環來控制樣式的生成。

scss: @if 和 @else 條件:

$theme: light;

body {
@if $theme == light {
background-color: white;
color: black;
} @else {
background-color: black;
color: white;
}
}
css 結果:

body {
  background-color: white;
  color: black;
}
scss: @for 循環:

@for $i from 1 through 3 {
.col-#{$i} {
width: 100% / $i;
}
}
css 結果:

.col-1 {
  width: 100%;
}

.col-2 {
  width: 50%;
}

.col-3 {
  width: 33.3333%;
}

8. 部分(Partials)與導入

SCSS 支持將樣式拆分成多個文件,然後使用 @import 導入它們。這樣可以讓代碼更具結構性。

假設你有一個 _variables.scss 文件:

scss

// _variables.scss
$primary-color: #3498db;

在主 SCSS 文件中導入:

scss

// styles.scss
@import 'variables';

body {
color: $primary-color;
}
css 結果:

body {
  color: #3498db;
}

注意:使用 @import 時,導入的文件名需要以 _ 開頭,這樣它不會被單獨編譯成 CSS 文件。

9. 插值 (#{})

插值用來將變量或運算結果插入到選擇器或屬性中。

scss 範例:

$size: large;

.icon-#{$size} {
font-size: 32px;
}
css 結果:

.icon-large {
  font-size: 32px;
}

10. 顏色函數

SCSS 提供了大量的內建顏色函數來操作顏色值,比如 lighten、darken、fade-in、fade-out 等。

scss 範例:

$primary-color: #3498db;

.button {
background-color: lighten($primary-color, 20%);
border-color: darken($primary-color, 10%);
}

小結

SCSS 提供了許多強大的功能,讓你可以以更具模組化和可維護性的方式來編寫樣式。這些功能包括:

變量:存儲重複使用的值。
嵌套:更清晰的層次結構。
Mixin 和繼承:重複使用樣式片段,避免代碼重複。
運算:在樣式中進行數值和顏色運算。
條件和循環:動態生成樣式。
這些功能幫助開發者更高效地管理樣式表,特別是在大型項目中,SCSS 可以顯著提高開發和維護的效率。如果你有更多問題,隨時告訴我!

CSS 組合器( CSS combinators )

CSS Combinators 包括:

  1. 後代選擇器(Descendant Combinator): 「 」
  2. 子選擇器(Child Combinator):「 > 」
  3. 相鄰兄弟選擇器(Adjacent Sibling Combinator):「 + 」
  4. 一般兄弟選擇器(General Sibling Combinator):「 – 」
  5. 組合選擇器(Group Selector):「 , 」

1. 後代選擇器(Descendant Combinator):(空格)

  • 用法A B
  • 作用:選擇所有位於 A 元素內部的 B 元素,不論它們之間有多少層嵌套。
  • 例子
<div class="container">
  <p>我是第一個段落</p>
  <div>
    <p>我是嵌套的段落</p>
  </div>
</div>
.container p {
  color: red;
}

codepen 實測

結果:選擇 .container 內的所有 p 元素,無論它們是否直接位於 .container 內。例子中,兩個 p 元素都會變成紅色。

2. 子選擇器(Child Combinator)>

語法A > B

  • 作用:選擇 A直接子元素 B,不會選擇後代元素(孫元素及更深層次的後代元素)。
  • 例子
<div class="container">
  <p>我是直接子元素</p>
  <div>
    <p>我是嵌套的段落</p>
  </div>
</div>
.container > p {
  color: blue;
}

codepen 實測

結果:只會選擇 .container 的直接子元素 p,即第一個 p 會變成藍色。嵌套在 div 中的第二個 p 不會被選中。

3. 相鄰兄弟選擇器(Adjacent Sibling Combinator)+

語法A + B

  • 作用:選擇緊接在 A 元素後面的相鄰兄弟元素 B,中間不能有其他元素。
  • 例子
<h1>標題</h1>
<p>我是第一個段落</p>
<p>我是第二個段落</p>
h1 + p {
  color: green;
}

codepen 實測

結果:只會選擇緊接在 h1 後面的第一個 p,即第一個 p 會變成綠色。第二個 p 不會被影響,因為它不是緊鄰的兄弟元素。

4. 一般兄弟選擇器(General Sibling Combinator)~

語法A ~ B

  • 作用:選擇 A 元素後面的所有兄弟元素 B,不要求它們緊鄰在一起。
  • 例子
<h1>標題</h1>
<p>我是第一個段落</p>
<p>我是第二個段落</p>
<div>我是另一個元素</div>
<p>我是第三個段落</p>
h1 ~ p {
  color: orange;
}

codepen 實測

結果:所有位於 h1 後面的 p 元素都會變成橙色,包括第一個、第二個和第三個 p,即使它們中間隔著其他元素(如 <div> )。

組合選擇器(Group Selector),(逗號)

語法A, B, C

  • 作用:將多個選擇器組合在一起,使它們共享相同的樣式。
  • 例子
<h1>我是標題</h1>
<h2>我是副標題</h2>
<p>我是段落</p>
h1, h2, p {
  color: purple;
}

codepen 實測

結果:h1、h2 和 p 都會變成紫色,因為這三個選擇器共享相同的樣式。

6. 否定偽類選擇器(:not)(雖然不是組合器,但它常用於選擇元素時排除特定元素)

語法:not(A)

  • 作用:選擇除了 A 之外的所有元素。
  • 例子
<ul>
  <li>項目 1</li>
  <li>項目 2</li>
  <li class="special">特殊項目</li>
  <li>項目 3</li>
</ul>
li:not(.special) {
  color: gray;
}

codepen 實測

結果:除了類為 specialli 元素外,所有的 li 元素都會變成灰色。

7. 伺機選擇器(Universal Selector)*

語法*

  • 作用:選擇所有元素。
  • 例子
<div>
  <p>段落 1</p>
  <p>段落 2</p>
</div>
* {
  margin: 0;
  padding: 0;
  color: red;
}

codepen 實測

結果:所有的元素(包括 divp 等)都會把內邊距和外邊距設置為 0,並且文字顏色為紅色。

小結:所有 CSS 組合器及部分常用選擇器

  1. (空格):後代選擇器,選擇 A 內部的所有 B 元素。
  2. >:子選擇器,選擇 A 的直接子元素 B
  3. +:相鄰兄弟選擇器,選擇緊接在 A 後面的兄弟元素 B
  4. ~:一般兄弟選擇器,選擇 A 之後的所有兄弟元素 B
  5. ,:組合選擇器,將多個選擇器組合在一起,使它們共享相同的樣式。
  6. :not:否定偽類選擇器,用來排除特定元素。
  7. *:伺機選擇器,選擇所有元素。