---
tags: CSS
---
# Sass, Scss
- CSS preprocessor
- Sass: Syntactically Awesome Style Sheets
- Scss: Sassy CSS
- `--watch` 可以在 `scss` 檔改變時,自動 re-compile `css` 檔。
## Sass vs SCSS
舊版的 Sass 採用 Ruby 編寫,語法不用寫大括號以及分號:
```sass
$primary-color: #333
body
color: $primary-color
```
但無法兼容舊有的 CSS,所以沒有那麼普及。後受 Less 影響,Sass 發展出兼容 CSS 的新語法,變成 SCSS,語法中就會包含大括號以及分號,之後越來越受歡迎。
## Compass
Sass 的框架,有許多預寫好的 mixin 可使用。
```sass
div {
@include border-radius(5px);
}
```
```css
div {
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
-ms-border-radius: 5px;
-o-border-radius: 5px;
border-radius: 5px;
...
}
```
## [Variables](https://sass-lang.com/documentation/variables)
可以存一些需要 reuse 的資料,例如顏色、大小、字體等任何變數。所以當有人靠杯說顏色或字體很醜要換一個時,可以直接修改一個變數,而非許多參數。
```sass
$font-stack: Helvetica, sans-serif;
$primary-color: #333;
body {
font: 100% $font-stack;
color: $primary-color;
}
```
## Nesting
結構清清楚楚。
```sass
nav {
ul {
margin: 0;
padding: 0;
list-style: none;
}
li { display: inline-block; }
a {
display: block;
padding: 6px 12px;
text-decoration: none;
}
}
```
## Partials
以 `_` 開頭的檔案,Sass 會知道這份檔案不須被編譯,這份檔案只會被其他檔案以 `@use` 當作 module 使用。
## [Modules](https://sass-lang.com/documentation/at-rules/use)
`@use` 來 include 其他檔案,注意可以不用加底線。
```sass
// _base.scss
$font-stack: Helvetica, sans-serif;
$primary-color: #333 !default;
body {
font: 100% $font-stack;
color: $primary-color;
}
```
```sass
// styles.scss
@use 'base';
.inverse {
background-color: base.$primary-color; /* #333 */
}
```
若變數有設置 `!default` ,代表此變數可以被替換掉:
```sass
@use 'base with (
$primary-color: #444;
);
.inverse {
background-color: base.$primary-color; /* #444 */
}
```
## [Mixins](https://sass-lang.com/documentation/at-rules/mixin)
跟 Function 很像,但是是**回傳一段 CSS**,可以在其中定義許多 declarations,可傳遞參數,參數也可以以 `:` 來給 default value。外部使用時用 `@include` 來呼叫。
```sass
@mixin transform($property: 10deg) {
-webkit-transform: $property;
-ms-transform: $property;
transform: $property;
}
.box {
@include transform(rotate(30deg));
}
.box2 {
@include transform(rotate($property: 30deg));
}
```
搭配上 `#{...}` 的 interpolation 也可以用在定義一堆 CSS 上:
```sass
@mixin corner-icon($name, $top-or-bottom, $left-or-right) {
.icon-#{$name} {
background-image: url("/icons/#{$name}.svg");
position: absolute;
#{$top-or-bottom}: 0;
#{$left-or-right}: 0;
}
}
@include corner-icon("mail", top, left);
@include corner-icon("phone", top, left);
```
## [Functions](https://sass-lang.com/documentation/at-rules/function)
- 跟 Mixin 很像,但是是**回傳一個值**。
- Function 名稱的 `-` 和 `_` 是通吃的,所以 `scale-color == sacle_color`
```sass
@function pow($base, $exponent: 1) {
$result: 1;
@for $_ from 1 through $exponent {
$result: $result * $base;
}
@return $result;
}
.sidebar {
margin-left: pow(4, 3) * 1px; /* 64px */
}
```
也可傳多個參數:
```sass
@function sum($numbers...) {
$sum: 0;
@each $number in $numbers {
$sum: $sum + $number;
}
@return $sum;
}
.micro {
width: sum(50px, 30px, 100px); /* 180px */
}
$widths: 50px, 30px, 100px;
.micro {
width: min($widths...); /* 180px */
}
```
## [Extend / Inheritance](https://sass-lang.com/documentation/at-rules/extend)
以 `@extend` 來繼承 CSS properties。
```sass
%message-shared {
border: 1px solid #ccc;
padding: 10px;
color: #333;
}
.message {
@extend %message-shared;
}
.success {
@extend %message-shared;
border-color: green;
}
.error {
@extend %message-shared;
border-color: red;
}
```
`&` 用來串接 CSS 的 naming:
```sass
.error {
border: 1px #f00;
background-color: #fdd;
&--serious {
@extend .error;
border-width: 3px;
}
}
```
```css
.error, .error--serious {
border: 1px #f00;
background-color: #fdd;
}
.error--serious {
border-width: 3px;
}
```
`&` 也能用於串接 `:hover` 等 action:
```sass
.slider {
coler: black;
&:hover {
color: red;
}
}
```
## [Operators](https://sass-lang.com/documentation/operators)
```sass
div {
width: 600px / 960px * 100%; /* 62.5% */
}
```
## [Colors](https://sass-lang.com/documentation/modules/color)
有許多 color function 可以使用。
```sass
@debug scale-color(#000000, $lightness: +15%); /* #262626 */
@debug mix(#000000, #FFFFFF); /* gray */
@debug complement(green); /* purple */
```
## [Lists](https://sass-lang.com/documentation/values/lists)
```sass
@debug nth(10px 12px 16px, 2); /* 12px */
@debug nth([line1, line2, line3], -1); /* line3 */
```
## [Booleans](https://sass-lang.com/documentation/values/booleans)
```sass
@debug if(true, 10px, 30px); /* 10px */
@debug if(false, 10px, 30px); /* 30px */
```
## 參考資料
- [Sass Basics](https://sass-lang.com/guide)
- [Sass Documentation](https://sass-lang.com/documentation)