Sass - SCSS 語法初學
在上一篇【在 VISUAL STUDIO 撰寫 SASS(SCSS) 讓您快樂似神仙】中,我們完成了在 Visual Studio 裡開發 SCSS 的設定,這一篇主要是參考【Sass Reference】網站內容與【Sass & Compass: The future of stylesheets now.】簡報內容裡的程式碼做一些註解,未來查詢時方便自我取用。
SCSS 語法:Nesting Rules, 巢狀規則
就那麼簡單: {} 一層,{{}} 兩層,以此類推。在 SCSS 語法裡巢狀規則也很簡單,你就看包幾層的 {} 符號,那就是幾層。
巢狀規則 SCSS 範例
/* 巢狀規則1 */ /* article 與 border-top 一條規則 */ /* article 與 header 一條規則 */ article { border-top: 1px dashed #eee; header { margin-bottom: 1.5em; } } /* 巢狀規則2 */ /* article 與 header 一條規則 */ /* article 與 section 一條規則 */ article { header, section { margin-bottom: 1.5em; } } /* 巢狀規則3 */ /* article 與 >, ~, +, * 各一條規則(共 4 條規則) */ article { > h2 { border-top: 1px dashed #eee; } ~ article { padding-top: 1.5em; } + footer { margin-top: 0; } * { color: #000; } } /* 巢狀規則4 */ /* Parent Selector - & 參考父選擇器 */ /* a 一條規則 */ /* &:hover 一條規則 */ a { color: blue; &:hover { color: red; } display: inline-block; line-height: 1.8em; } /* 巢狀規則5 */ /* Parent Selector - & 新增內容至選擇器 */ /* article 與 h1 一條規則 */ /* .blog-index & 參考(&)父選擇器形成 ".blog-index article",.blog-index article 與 h1 一條規則 */ article { h1 { font-size: 2.4em; } .blog-index & { h1 { font-size: 2em; } } } /* 巢狀規則6 */ /* Parent Selector - & 與 Modernizr 一起運作 */ /* button 與 backgroud 一條規則 */ /* .no-cssgradients & 參考(&)父選擇器形成 ".no-cssgradients button" 一條規則 */ button { background: linear-gradient(#444, #222); .no-cssgradients & { background: #333; } }
巢狀規則 SCSS 轉成 CSS
@charset "UTF-8"; /* 巢狀規則1 */ article { border-top: 1px dashed #eee; } article header { margin-bottom: 1.5em; } /* 巢狀規則2 */ article header, article section { margin-bottom: 1.5em; } /* 巢狀規則3 */ article > h2 { border-top: 1px dashed #eee; } article ~ article { padding-top: 1.5em; } article + footer { margin-top: 0; } article * { color: #000; } /* 巢狀規則4 */ a { color: blue; display: inline-block; line-height: 1.8em; } a:hover { color: red; } /* 巢狀規則5 */ article h1 { font-size: 2.4em; } .blog-index article h1 { font-size: 2em; } /* 巢狀規則6 */ button { background: linear-gradient(#444444, #222222); } .no-cssgradients button { background: #333; }
父選擇器碰到子選擇器,就形成一條規則。碰到 &(參考) 就形成一條規則。例如以下 SCSS,
a { color: red; b { color: greed; c { color:blue; } } }
產生的 CSS,
a { color: red; } a b { color: greed; } a b c { color: blue; }
a、ab、abc 一共三條,這樣清楚了嗎。
SCSS 語法: Media Bubbling, 媒體查詢
@media 是 CSS3 的功能,SCSS 語法裡媒體查詢語法會自動包含父選擇器,有點像泡泡會上升去包著一樣。
媒體查詢 SCSS 範例
/* 媒體查詢 */ /* 媒體查詢會像氣泡般包含內容(#content) */ #content { margin: 0 1.5em; @media screen and (min-width: 1280px) { margin: 0 2.5em; } }
以上有巢狀關係,會產生二條規則,第二條規則使用媒體查詢語法,會自動包含父選擇器。
媒體查詢 SCSS 轉成 CSS
@charset "UTF-8"; /* 媒體查詢 */ /* 媒體查詢會像氣泡般包含內容(#content) */ #content { margin: 0 1.5em; } @media screen and (min-width: 1280px) { #content { margin: 0 2.5em; } }
媒體查詢把父選擇器(#content)包進來形成規則。
SCSS 語法:Variables, 變數
就那麼簡單: $變數:值;,$ 符號宣告一個變數,接下來如 CSS 一樣透過 : 符號設定值。
變數 SCSS 範例
/* 就那麼簡單: $變數:值; */ /* 可使用在: 顏色(Colors), 數字(Numbers), 文字(text) 了解單位上 */ /* 變數1 */ $link-color: blue; $link-hover: red; a { color: $link-color; &:hover { color: $link-hover; } } /* 變數2 */ /* 負數要用刮弧包起來,例如,(-變數) */ $msg-pad: 24px; .msg { padding: $msg-pad; h3 { padding: $msg-pad; margin: (-$msg-pad) (-$msg-pad) 0; } }
在 a {} 樣式規則裡有個 &,那個 & 會去參考父選擇器,&:hover 的父選擇器是 a,所以下面的 css 出來的就是 a:hover {},有沒有很方便。
變數 SCSS 轉成 CSS
@charset "UTF-8"; /* 變數1 */ a { color: blue; } a:hover { color: red; } /* 變數2 */ .msg { padding: 24px; } .msg h3 { padding: 24px; margin: -24px -24px 0; }
SCSS 語法: @extend, 延伸
@extend 延伸像我們頁面的主版頁面裡會使用的使用者控制項(Webform)或Partial方法(MVC),把一個一個子版先切好,然後在需要的地方放入使用。像 Login 頁面,因為每一頁都會用到,我們就切出來一個子頁,讓每一頁去引用,當我們修改更新任何 Login 頁面,所以頁面就會立即使用最新的 Login 頁面一樣道理。
延伸 SCSS 範例
/* 定義.button */ /* 這裡被拿去做延伸使用,所以在 CSS 不會出現 */ .button { background: blue; color: white; padding: 0.2em 0.8em; border-radius: 0.4em; } /* .button-delete 與 @extend .button 形成一條規則 */ /* .button-delete 形成一條規則 */ .button-delete { @extend .button; // .button .button-delete {} background: red; }
用白話來說:.button-delete 要延伸自 .button 的規則,所以注意產生的 CSS 規則會是 .button .button-delete {}。
延伸 SCSS 轉成 CSS
@charset "UTF-8"; .button, .button-delete { background: blue; color: white; padding: 0.2em 0.8em; border-radius: 0.4em; } /* .button-delete 與 @extend .button 形成一條規則 */ /* .button-delete 形成一條規則 */ .button-delete { background: red; }
SCSS 語法: Mixins, 混合使用
@mixin 把可重覆使用的規則提煉出來,而且還可以與變數、&(參考)…一起使用,大大增加彈性。在要引用的樣式規則裡使用 @include 引用定義的好的規則即可。
混合使用 SCSS 範例
/* 把可重覆使用的規則提煉出來 */ /* 混合1 */ @mixin hover-link { text-decoration: none; &:hover { text-decoration: underline; } } /* 使用 hover-link 規則 */ nav a { @include hover-link; } /* 混合2 - 與變數一併使用 */ @mixin border-radius($amount) { border-radius: $amount; -webkit-border-radius: $amount; -moz-border-radius: $amount; } /* 傳入變數 */ .msg { @include border-radius(5px); } /* 混合3 - 預設與名稱參數 */ /* $text:blue 給$text變數預設值,如果未傳入變數值,即使用預設值 */ @mixin link-color ($text:blue, $hover:red){ color: $text; &:hover { color: $hover;} } /* $text 使用預設值, $hover 使用 green */ a { @include link-color($hover:green); }
混合使用 SCSS 轉成 CSS
@charset "UTF-8"; /* 混合1 */ /* 使用 hover-link 規則 */ nav a { text-decoration: none; } nav a:hover { text-decoration: underline; } /* 混合2 - 與變數一併使用 */ /* 傳入變數 */ .msg { border-radius: 5px; -webkit-border-radius: 5px; -moz-border-radius: 5px; } /* 混合3 - 預設與名稱參數 */ a { color: blue; } a:hover { color: green; }
SCSS 語法: Importing, 匯入
在 SCSS 裡的匯入與 CSS 的匯入有些不同,在 CSS 裡假設我們在 main.css 匯入了三個 *.css 檔案,總共瀏覽器會發出 4 條 request,main.css + 裡面三個 import *.css = 4 request,這樣才會完成整個 CSS 下載的動作。在 SCSS 裡,它是會匯整成一個檔案來產出,例如,我在 main.scss 裡匯入三個 *.scss 檔案,那它會產出一個 main.css 檔案,面裡包含了那三個 *.scss 檔案的內容。當我更新那三個 *.scss 任何內容,就會重新產生 main.css。
匯入 SCSS 範例
/* 使用 import 請對應至"_檔名.scss",然後 import "檔名" */ /* 對應 _core.scss */ @import "core"; /* 對應 _typography.scss, _grid.scss */ @import "typography", "grid"; /* 你也能在巢狀裡使用 import */ @media screen and (min-width: 320px) { @import "core"; } /* 這裡用巢狀 a, ab, ac 共三條規則 */ #account { @import "typography", "grid"; }
注意,你要讓 SCSS 匯入的檔名必須在開頭加底線(_檔名.scss)。
匯入 SCSS 轉成 CSS
@charset "UTF-8"; /* import 測試用 _core.scss */ body { color: red; } /* import 測試用 _typography.scss */ body { color: blue; } /* import 測試用 _grid.scss */ body { color: greed; } /* 你也能在巢狀裡使用 import */ @media screen and (min-width: 320px) { /* import 測試用 _core.scss */ body { color: red; } } /* 這裡用巢狀 a, ab, ac 共三條規則 */ #account { /* import 測試用 _typography.scss */ /* import 測試用 _grid.scss */ } #account body { color: blue; } #account body { color: greed; }
設計初期,可以功能區分、部門區分…來設計相關 SCSS,最後再進行匯入整合即可,而且只產生一整合的檔案,可大大減少 request 數量,比起 CSS 的匯入好太多了。
SCSS 語法: Math, 數學
在 SCSS 語法裡,只要是數字型態(可含單位,例如 1em, 5px)都可以進行【+, -, *, /, %】等運算,讓你透過公式去計算而不是在那裡按計算機老半天。
數學 SCSS 範例
/* Scss 可進行數學操作(+, -, *, /, %) 在數字型態 例如: 1em + 1em; // 2em 1em - 1em; // 0em 1in + 72pt; // 2in 6px * 4; // 24px 18 % 5; // 3 */ /* Math 1 - 除法 */ /* font: 18px / 1.45em; font: (20px / 5); // 4px font: 20px / 5 + 1; // 5px font: $base / 5; $size: 20px / 5; // 4px */ /* Math 2 */ $container : 960px; $main: 680px; $gutter: 30px; #sidebar { width: $container - $main - $gutter; } /* Math 3 - 數學函式 */ /* Scss 提供一些好用的函式可使用 */ /* percentage(13/25) // 52%, 百分比 round(2.4) // 2, 取最大整數 ceil(2.2) // 3, 無條件進位 floor(2.6) // 2, 無條件去位 abs(-24) // 24, 絕對值 */
數學 SCSS 轉成 CSS
#sidebar { width: 250px; }
SCSS 語法: Loops & Conditions, 迴圈與條件
在 SCSS 裡我們也能包含如【邏輯運算: < > <= >= == !=】、【條件運算:@if, @else, @else if】、【and, or】,也就是說,你可以在樣式規則中使用程式的方法來動態產生你所想要的規則。
迴圈與條件 SCSS 範例
/* 條件包含: 邏輯運算: < > <= >= == != @if, @else, @else if and, or */ /* 運算 */ /* 1 < 20 // true 10 <= 20 // true 4 > 1 // true 4 >= 1 // true */ /* 1 + 1 == 2 // true small != big // true #000 == black // true */ /* red == #f00 red == #ff0000 red == rgb(255, 0, 0) red == rgba(255, 0, 0, 1.0) red == hsl(0deg, 100%, 100%) reg == hsla(0deg, 100%, 100%, 1) */ /* if-else 條件 */ $theme: ocean; $color: red; div { @if $theme == dusty { background: #c6bba9; color: $color; } @else if $theme == ocean { background: blue; color: white; } } /* if() 函式 */ $main-bg: #000; .main{ color: if( $main-bg == black, #fff, #000); } /* @for 迴圈 */ @for $level from 0 to 5 { .tag-#{$level + 1} { font-size: .7em + ($level * .5em); } } /* @while 迴圈 */ $level2: 0; @while $level2 < 5 { .tag-#{$level2 + 1} { font-size: .7em + ($level2 * .5em); } $level2: $level2 + 1; } /* @each 迴圈 */ $animals: puma, crab, emu, duck; @each $animal in $animals { .#{$animal}-icon { background: url('/images/#{$animal}.png'); } }
程式的【if, if-else, for, while, for each, 二元判斷】都有提供,而且能使用在 CSS 裡,再說一次,SCSS 太棒了。
迴圈與條件 SCSS 轉成 CSS
@charset "UTF-8"; /* if-else 條件 */ div { background: blue; color: white; } /* if() 函式 */ .main { color: white; } /* @for 迴圈 */ .tag-1 { font-size: 0.7em; } .tag-2 { font-size: 1.2em; } .tag-3 { font-size: 1.7em; } .tag-4 { font-size: 2.2em; } .tag-5 { font-size: 2.7em; } /* @while 迴圈 */ .tag-1 { font-size: 0.7em; } .tag-2 { font-size: 1.2em; } .tag-3 { font-size: 1.7em; } .tag-4 { font-size: 2.2em; } .tag-5 { font-size: 2.7em; } /* @each 迴圈 */ .puma-icon { background: url("/images/puma.png"); } .crab-icon { background: url("/images/crab.png"); } .emu-icon { background: url("/images/emu.png"); } .duck-icon { background: url("/images/duck.png"); }
SCSS 語法: Color, 顏色
SCSS 的顏色是提供一大堆顏色運算函式,建議看簡報檔的 page 54 ~ 67 頁,裡面有詳細的圖解。
顏色 SCSS 範例
/* RGBA 函式 */ a { color: rgba(blue, .75); } p { background: rgba(#ffa, .25); } /* Color 檢查函式 */ /* $color: red; hue($color); // 0deg, 色度 saturation($color); // 100%, 飽合度 lightness($color); // 50%, 淡 red($color); // 100 green($color); // 0 blue($color); // 0 alpha($color); // 100 */ $bg: silver; $darkgb: lightness($bg) < lightness(gray); button { color: if($darkgb, #fff, #000); } /* Color 操作 */ /* invert(blue) // 顛倒, blue --> yellow mix(red, yellow) // 混合, red + yellow = orange mix(red, yellow, 30%) // red 30% + yellow 70% = orange (亮一些) grayscale(yellow) // 灰度 complement(#6cf620) // 補足 */ /* HSLA 操作 */ /* adjust-hue(#77a7f9, 90) adjust-hue(#77a7f9, -90) saturate(#9b8a60, 50%) // 飽合 desaturate(#d9a621, 50%) darken(#6cf620, 30%) // 深 lighten(#2e7805, 50%) // 亮 fade-out(#fab, .5) fade-in(rgba(#fab, .5), .5) */ /* change-color函式 - 為color設定任何屬性 */ /* change-color($color, [$red], [$green], [$blue], [$hue], [$saturation], [$lightness], [$alpha]) change-color(#ba5637, $hue:60); change-color(#8e9cb3, $saturation:100); change-color(#6cf620, $green:60, &blue:100); */ /* adjust-color函式 - 為color設定任何操作屬性 */ /* adjust-color($color, [$red], [$green], [$blue], [$hue], [$saturation], [$lightness], [$alpha]); adjust-color(#d3fa7b, $hue:60, $lightness: -20%); adjust-color(#5f8fe3, $green:100, $alpha: -0.25); */ /* scale-color函式 - 為color設定動態比例屬性(以百分比為基礎) */ /* scale-color($color, [$red], [$green], [$blue], [$saturation], [$lightness], [$alpha]); scale-color(#adf609, $lightness:50%); adjust-color(#adf609, $lightness:50%); 如果: lightness 是 0% #adf609 是 50% scale-color 是 75% adjust-color 是 100% */
顏色 SCSS 轉成 CSS
@charset "UTF-8"; /* RGBA 函式 */ a { color: rgba(0, 0, 255, 0.75); } p { background: rgba(255, 255, 170, 0.25); } button { color: black; }
簡報 Page 55 裡的 a {color: rgba(blue, .75);} 給的 CSS 答案是錯誤的。
SCSS 語法: Custom Functions, 自訂函式
與程式裡的自訂函式觀念相同,我們能自行定義要執行的函式運作,進行 SCSS 相關運算之後,再將結果回傳。
自訂函式 SCSS 範例
/* 自訂函式1 */ @function pxem($px, $context: 16px) { @return ($px / $context) * 1em; } /* 使用自訂函式 pxem */ article h2 { font-size: pxem(45px); } /* 自訂函式2 */ @function text-contrast($gb, $light:#fff, $dark:#000) { $darkgb: lightness($gb) < lightness(gray); @return if($darkgb, $light, $dark); } /* 使用自訂函式 text-contrast */ @mixin easy-button($gb) { color: text-contrast($gb); background: linear-gradient(lighten($gb, 8), darken($gb, 8)); } button { @include easy-button(blue); }
自訂函式 SCSS 轉成 CSS
@charset "UTF-8"; /* 使用自訂函式 pxem */ article h2 { font-size: 2.813em; } /* 使用自訂函式 text-contrast */ button { color: white; background: linear-gradient(#2929ff, #0000d6); }
沒有留言:
張貼留言
感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。