SCSS 新手入門
SCSS 新手入門
CSS 預處理器
CSS 預處理器是個能透過該預處理器語法產生 CSS 的程式。CSS 預處理器有很多選擇,不過大多數的 CSS 預處理器都會添加純 CSS 所沒有的功能,例如:mixin、巢狀選擇器、繼承選擇器等。這些功能會令 CSS 結構的可讀性更高、也更容易維護。
常見的 CSS 預處理器:
SASS
LESS
Stylus
PostCSS
什麼是 SASS ?
SASS (Syntactically Awesome Stylesheets) 是一種 CSS 的擴充,是為 CSS 的超集合(透過編譯會 compiled 成傳統 CSS,讓瀏覽器可以閱讀),增加了變數、巢狀、繼承、函式等功能。讓開發者可以撰寫簡潔、富語意、重複性佳、可維護性佳和可延展性佳的 CSS 程式碼。
Sass 的語法分為舊的 SASS (向 Haml取經,具備不使用大括弧格式、使用縮排,不能直接使用 CSS 語法、學習曲線較高等特性,檔案名稱為
.sass
) 和新的 SCSS (Sassy CSS、Sass 3,檔案名稱為.scss
)由於新的 SCSS 語法是 CSS3 的超集合,所以傳統的 CSS3 檔案就算直接複製過來也不會出錯,學習曲線相對較緩,因此我們將使用 SCSS 語法。
SCSS 語法介紹
變數與運算
可以用錢號 $
來定義變數,用冒號 :
來指定變數的值,這與 CSS 定義屬性值很相似,在檔案中的其他地方就使用這些變數值。
幾個重點:
- CSS 變數的命名通常是全小寫英文並用 -
連接號,例如 $second-color
*** 變數在編譯後並不會出現在最後輸出的 CSS 檔案***
- 變數可以作加減乘除餘等運算 (+, -, *, /, %)
,包括字串與顏色色碼也可以進行運算
//scss
$color-white: #fff;
$color-pink: #ee11ab;
$title-font: normal 24px/1.5 'Open Sans', sans-serif;
$primary-color: $color-pink;
a {
background-color: $color-white;
color: $color-pink;
}
//scss
$_num: 5px;
.container {
color: $color-pink / 2;
margin: $_num * 2 $_num;
}
幾個推薦的小技巧:
- 對於會套用到整個網站的每個顏色、字體建議都先定義成變數
- 不要使用像 red、blue 的英文字詞來指定顏色,而是要用 16 進位碼來定義,例如 red 應該寫成 #ff0000
- 在 CSS 類別中定義時,按照英文字元 A-Za-z 來排列其中的 CS S樣式定義
巢狀 Nesting
巢狀讓我們可以使用更直觀的寫法撰寫具有階層關係的 style,並且可以避免撰寫出重複的 css
// css
ul {
list-style: none;
}
ul li {
display: inline-block;
padding: 15px;
}
ul li a {
color: #444;
font-size: 16px;
text-decoration: none;
}
// scss
ul {
list-style: none;
li {
display: inline-block;
padding: 15px;
a {
color: #444;
font-size: 16px;
text-decoration: none;
}
}
}
第二種巢狀結構是沒有空格,接著在一起的CSS定義,這時在巢狀結構語法裡,就需要加入與符號(&)來定義,代表是黏在一起中間沒有空格的,例如以下的範例:
// css
.parent:hover{}
.parent.other-class{}
// scss
.parent{
&:hover{}
&.other-class{}
}
匯入 Impot
匯入其他的 SCSS 檔案,最後編譯時會一併包含進來編譯。要被匯入的通常檔案名稱前會加下底線 _
作區分,這樣編譯工具在編譯時會略過這些檔案,而只會去編譯那些沒下底線 _
的檔案,例如 _reset.scss。
例如 base.scss 中要匯入 _reset.scss,base.scss 的檔案內容會如下,要注意的是只需要寫 @import 'reset'
,不用加副檔名或下底線 _
,編譯程式會自動尋找對應的檔案:
@import 'reset';
body {
background-color: #efefef;
font: 100% Helvetica, sans-serif;
}
混合 Mixin
@mixin border-radius($radius) {
-webkit-border-radius: $radius;
-moz-border-radius: $radius;
-ms-border-radius: $radius;
border-radius: $radius;
}
.box { @include border-radius(10px); }
這個mixin中的定義傳入值,是可以加上預設值的
@mixin label($text: 'Code', $background: $yellow, $color: rgba(black, 0.5)) {
position: relative;
&:before {
background: $background;
color: $color;
content: $text;
display: inline-block;
font-size: .6rem;
}
}
擴充 / 繼承 Extend
話不多說看程式碼就懂了 XDD
.message {
border: 1px solid #ccc;
padding: 10px;
color: #333;
}
.success {
@extend .message;
border-color: green;
}
.error {
@extend .message;
border-color: red;
}
另外可以使用佔位符 %
來定義這個只被繼承之用的 CSS 類別
%message {
border: 1px solid #ccc;
padding: 10px;
color: #333;
}
.success {
@extend %message;
border-color: green;
}
.error {
@extend %message;
border-color: red;
}
函式 Functions
SCSS 中也有 @function
可以定義自訂的函式,也有一些簡單的流程控制以及運算能力,例如 @return、@if、@for、@each
SCSS中也內建了許多[工具函式]](http://sass-lang.com/documentation/Sass/Script/Functions.html)
@function calculate-width ($col-span) {
@return 100% / $col-span;
}
.span-two {
width: calculate-width(2); // spans 2 columns, width = 50%
}
.span-three {
width: calculate-width(3); // spans 3 columns, width = 33.3%
}
$a: false
$b: true
@if $a {
p {
color: #fff000
}
}
@if not ($b) {
p {
color: #fff000
}
}
$radius: 5px !default;
.box-border{
border:1px solid #ccc;
padding:10px;
@if $radius != 0{
border-radius:$radius;
}
}
Author Yuyu
LastMod 2018-07-24