09-移動端開發教程-Sass入門
1. 引言
CSS3之前的CSS都大都是列舉屬性樣式,而程式語言強大的變數、函式、迴圈、分支等功能基本都不能在CSS中使用,讓CSS的程式設計黯淡無光,Sass就是一種增強CSS程式設計的擴充套件語言(CSS4也可以期待),有了像Sass這種預處理語言後,CSS的程式設計不再侷限在列舉屬性了,可以有更廣闊的舞臺。
2. Sass的原理
Sass本質就是在CSS的語法的基礎上增加了自定義的變數、迴圈、分支、函式、mixin、繼承、運算等功能,讓CSS程式設計變得異常強大。
當然瀏覽器是不認識Sass語法。開發人員寫完了Sass的語法檔案後需要通過工具轉成原始的CSS程式碼。
//sass 程式碼 //------------------------------- $fontSize: 12px; body{ font-size:$fontSize; } // 通過工具將上面的sass程式碼可以轉成下面的CSS程式碼↓↓↓ //css 程式碼 //------------------------------- body{ font-size:12px; }
3. Sass的編譯環境
Sass程式碼的編譯轉換工具可以用sass命令列工具、gulp、開發工具外掛、webpack等。
我推薦大家學習階段直接用開發工具的外掛自動生成即可。如果你是在專案階段使用,那肯定有自動化的流程構建工具比如:gulp、webpack都有對應的外掛或者loader,直接對應配置即可。
老馬推薦vscode的自動編譯Sass檔案的外掛:Live Sass Compiler
使用方法:
第一步: 用vscode開啟scss檔案。
第二步:ctrl+shift+p
(mac ctrl→command
)輸入sass選擇入下圖選項
4. Sass的兩種檔案字尾
sass有兩種字尾名檔案:一種字尾名為sass,語法要求不使用大括號和分號;另一種就是我們這裡使用的scss檔案,這種和我們平時寫的CSS檔案格式差不多,使用大括號和分號。
//檔案字尾名為sass的語法
body
background: #eee
font-size:12px
p
background: #0982c1
//檔案字尾名為scss的語法
body {
background: #eee;
font-size:12px;
}
p{
background: #0982c1;
}
老馬推薦使用scss檔案字尾及使用括號和分號的編寫方式。
5. Sass中的變數和註釋
5.1 定義變數及使用
Sass的變數必須是$開頭,後面緊跟變數名,而變數值和變數名之間就需要使用冒號(:)分隔開(就像CSS屬性設定一樣)。
$a-color: blue; // 定義變數。 .box { color: $a-color; // => blue 使用變數 }
用vscode外掛轉換一下試試?
5.2 區域性變數和全域性變數。
變數支援塊級作用域,巢狀規則內定義的變數只能在巢狀規則內使用(區域性變數),不在巢狀規則內定義的變數則可在任何地方使用(全域性變數)。將區域性變數轉換為全域性變數可以新增 !global 宣告。
//sass style
//-------------------------------
$a-color: blue; // 全域性變數
.box {
$a-color: red; // 區域性變數,box內部不使用。
color: $a-color; // => red 區域性變數
}
.child {
color: $a-color; // => blue 全域性變數
$main-width: 16em !global; // 在區域性定義全域性的變數。
}
.main {
width: $main-width; // 使用在內部定義的全域性變數。
}
/*===============生成的CSS程式碼===================*/
.box {
color: red;
}
.child {
color: blue;
}
.main {
width: 16em;
}
從以上程式碼中也可以看到Sass支援CSS的註釋/**/之外還支援雙斜線的註釋: //
5.3 特殊變數
如果變數作為CSS屬性或在某些特殊情況下等則必須要以 #{$variables}形式使用。
//sass style
//-------------------------------
$side: top;
.box {
border-#{$side}: 1px solid #09c;
}
//css style
//-------------------------------
.box {
border-top: 1px solid #0098cc;
}
6. 巢狀(Nesting)
6.1 巢狀規則 (Nested Rules)
Sass 允許將一套 CSS 樣式巢狀進另一套樣式中,內層的樣式將它外層的選擇器作為父選擇器。
//sass style
//-------------------------------
#main p {
color: #00ff00;
width: 97%;
.redbox {
background-color: #ff0000;
color: #000000;
}
}
//css style
//-------------------------------
#main p {
color: #00ff00;
width: 97%;
}
#main p .redbox {
background-color: #ff0000;
color: #000000;
}
6.2 父選擇器 & (Referencing Parent Selectors: &)
在巢狀 CSS 規則時,有時也需要直接使用巢狀外層的父選擇器,可以用 & 代表巢狀規則外層的父選擇器。
//sass style
//-------------------------------
.box {
border-#{$side}: 1px solid #09c;
&::before {
content: '';
display: block;
position: absolute;
left: 100px;
top: 5px;
}
}
//css style
//-------------------------------
.box {
border-top: 1px solid #09c;
}
.box::before {
content: '';
display: block;
position: absolute;
left: 100px;
top: 5px;
}
& 必須作為選擇器的第一個字元,其後可以跟隨後綴生成複合的選擇器。
//sass style
//-------------------------------
#main {
color: black;
&-sidebar { border: 1px solid; }
}
//css style
//-------------------------------
#main {
color: black;
}
#main-sidebar {
border: 1px solid;
}
6.3 @at-root
@at-root用來跳出當前選擇器巢狀。
//sass style
//-------------------------------
.demo {
...
animation: motion 3s infinite;
@at-root {
@keyframes motion {
...
}
}
}
//css style
//-------------------------------
.demo {
...
animation: motion 3s infinite;
}
@keyframes motion {
...
}
7. 運算
Sass支援多種資料型別的變數,比如:
- 數字,1, 2, 13, 10px
- 字串,有引號字串與無引號字串,"foo", 'bar', baz
- 顏色,blue, #04a3f9, rgba(255,0,0,0.5)
- 布林型,true, false
- 空值,null
所有資料型別均支援相等運算 == 或 !=,此外,每種資料型別也有其各自支援的運算方式。
7.1 數值運算
Sass支援數字的加減乘除、取整等運算 (+, -, *, /, %),如果必要會在不同單位間轉換值。
//sass style
//-------------------------------
.box {
height: 17px + 20px; // => 37px 數字加法運算
width: (75rem/16); // => 4.6875rem 除法運算
color: #303030*2; // => #606060; 乘法運算(顏色運算)
padding: 20px - 3; // => 17pex 數字減法
font-family: sans- + "serif"; // => sans-serif 字串加法
width: 1em + (2em * 3); // 帶括號的運算
}
//css style
//-------------------------------
.box {
height: 37px;
width: 4.6875rem;
color: #606060;
padding: 17px;
font-family: sans-serif;
width: 7em;
}
8. Sass語句
Sass提供了常用的迴圈、判斷分支語句的相關指令,可以讓我們按照程式語言一樣編寫Sass程式碼。
8.1 if語句
當 @if 的表示式返回值不是 false 或者 null 時,條件成立,輸出 {} 內的程式碼。
//sass style
//-------------------------------
$w: 960px;
$type: monster;
.box {
@if 2*3 > 5 { // 簡單if判斷語句
color: red;
}
@if $w > 900px {
width: $w;
} @else { // if else 語句
width: 900px;
}
@if $type == ocean { // 多個if和else語句
color: blue;
} @else if $type == matador {
color: red;
} @else if $type == monster {
color: green;
} @else {
color: black;
}
}
//css style
//-------------------------------
.box {
color: red;
width: 960px;
color: green;
}
@if 聲明後面可以跟多個 @else if 宣告,或者一個 @else 宣告。 如果 @if 宣告失敗,Sass 將逐條執行 @else if 宣告,如果全部失敗,最後執行 @else 宣告
8.2 for迴圈語句
@for 指令可以在限制的範圍內重複輸出格式。類似for迴圈。 兩種格式:
-
@for $var from <start> through <end>
:條件範圍包含 <start> 與 <end> 的值 -
@for $var from <start> to <end>
: 圍只包含 <start> 的值不包含 <end> 的值
//scss style
//------------for througth迴圈-------------------
@for $i from 1 through 3 {
.item-#{$i} { width: 2em * $i; }
}
//css style
//-------------------------------
.item-1 { width: 2em; }
.item-2 { width: 4em; }
.item-3 { width: 6em; }
//scss style
//------------for to 迴圈-------------------
@for $i from 1 to 3 {
.item-#{$i} { width: 2em * $i; }
}
//css style
//-------------------------------
.item-1 { width: 2em; }
.item-2 { width: 4em; }
8.3 each迴圈
@each 指令的格式是 $var in <list>, $var 可以是任何變數名,比如 $length 或者 $name,而 <list> 是一連串的值,也就是值列表。
//sass style
//-------------------------------
@each $animal in puma, sea-slug, egret, salamander {
.#{$animal}-icon {
background-image: url('/images/#{$animal}.png');
}
}
//css style
//-------------------------------
.puma-icon {
background-image: url("/images/puma.png");
}
.sea-slug-icon {
background-image: url("/images/sea-slug.png");
}
.egret-icon {
background-image: url("/images/egret.png");
}
.salamander-icon {
background-image: url("/images/salamander.png");
}
複雜對應each
//sass style
//-------------------------------
@each $header, $size in (h1: 2em, h2: 1.5em, h3: 1.2em) {
#{$header} {
font-size: $size;
}
}
//css style
//-------------------------------
h1 { font-size: 2em; }
h2 { font-size: 1.5em; }
h3 { font-size: 1.2em; }
9. 混合指令 (Mixin Directives)
9.1 不帶引數的簡單Mixin
混合指令(Mixin)用於定義可重複使用的樣式,可以直接把一整段Sass程式碼替換到某個地方去。
//sass style
//-------------------------------
// 定義mixin reset, 用@mixin開頭,後面跟空格和混合塊的名字。然後是語句塊
@mixin reset {
padding: 0;
margin: 0;
}
html, body, div , input {
@include reset(); // 引用 reset 混合塊。用@include指令引用混合塊。
}
//css style
//-------------------------------
html, body, div, input {
padding: 0;
margin: 0;
}
9.2 帶引數的Mixin
Mixin還可也新增引數,跟函式一樣使用。
//sass style
//-------------------------------
@mixin sexy-border($color, $width) {
border: $width solid $color;
}
p { @include sexy-border(blue, 1px); }
//css style
//-------------------------------
p {
border: 1px solid blue;
}
10. 函式指令 (Function Directives)
雖然Mixin功能強大,但是某些場景下還是函式應用更方便,Sass也提供了自定義函式的用法。
//sass style
//-------------------------------
$grid-width: 40px;
$gutter-width: 10px;
// 定義自定義函式 grid-width
@function grid-width($n) { // 接受一個引數$n
@return $n * $grid-width + ($n - 1) * $gutter-width; // 返回值。
}
#sidebar { width: grid-width(5); } // 在屬性中呼叫函式
//css style
//-------------------------------
#sidebar {
width: 240px;
}
11. 繼承(擴充套件)
11.1 基本繼承
sass中,選擇器繼承可以讓選擇器繼承另一個選擇器的所有樣式,並聯合聲明。使用選擇器的繼承,要使用關鍵詞 @extend,後面緊跟需要繼承的選擇器。
//sass style
//-------------------------------
h1{
border: 4px solid #ff9aa9;
}
.speaker{
@extend h1;
border-width: 2px;
}
//css style
//-------------------------------
h1, .speaker{
border: 4px solid #ff9aa9;
}
.speaker{
border-width: 2px;
}
11.2 佔位符%
可以定義佔位選擇器 %。這種選擇器的優勢在於:如果不呼叫則不會有任何多餘的css檔案,避免了以前在一些基礎的檔案中預定義了很多基礎的樣式,然後實際應用中不管是否使用了 @extend去繼承相應的樣式,都會解析出來所有的樣式。佔位選擇器以 %標識定義,通過 @extend呼叫。
//sass style
//-------------------------------
%ir { // 定義佔位符。沒有選擇器名字的一段程式碼而已。
color: transparent;
text-shadow: none;
background-color: transparent;
border: 0;
}
#header{
h1{
@extend %ir;
width:300px;
}
}
.ir{
@extend %ir;
}
//css style
//-------------------------------
#header h1, .ir {
color: transparent;
text-shadow: none;
background-color: transparent;
border: 0;
}
#header h1 {
width: 300px;
}
12. 匯入檔案
Sass的匯入( @import)Sass檔案規則和CSS的有所不同,編譯時會將 @import的scss檔案合併進來只生成一個CSS檔案。 但是如果你在Sass檔案中匯入css檔案如 @import 'reset.css',那效果跟普通CSS匯入樣式檔案一樣,匯入的css檔案不會合併到編譯後的檔案中,而是以 @import方式存在。
所有的Sass匯入檔案都可以忽略字尾名 .scss。一般來說基礎的檔案命名方法以_開頭,如 _mixin.scss。這種檔案在匯入的時候可以不寫下劃線,可寫成 @import "mixin"。
例如: a.scss 檔案
//a.scss
//-------------------------------
body {
background: #eee;
}
main.scss 主檔案。
//sass style
//-------------------------------
@import "reset.css"; // 匯入css檔案,不會進行編譯。
@import "a"; // 匯入a.scss 檔案,字尾省略
p{
background: #0982c1;
}
//css style
//-------------------------------
@import "reset.css";
body {
background: #eee;
}
p{
background: #0982c1;
}
參考列表: