npm install --save-dev sass-loader //sass-loader依賴於node-sass npm install --save-dev node-sass
// 若是你是.sass文件要設置 { test: /\.sass$/, loaders: ['style', 'css', 'sass'] }
<style lang="scss">
sass
讓人們受益的一個重要特性就是它爲css
引入了變量。你能夠把反覆使用的css
屬性值 定義成變量,而後經過變量名來引用它們,而無需重複書寫這一屬性值。或者,對於僅使用過一 次的屬性值,你能夠賦予其一個易懂的變量名,讓人一眼就知道這個屬性值的用途。sass
使用$
符號來標識變量(老版本的sass
使用!來標識變量。改爲$是多半由於!highlight-color
看起來太醜了。)css
$back: red #app color: $back // 變量聲明也分爲全局變量和局部變量 // 這樣也是好用的 $highlight-color: #F90; $highlight-border: 1px solid $highlight-color; .selected { border: $highlight-border; } //編譯後 .selected { border: 1px solid #F90; }
在sass
中使用-
和_
實際上是同樣的 例如$link-color
和$link_color
其實指向的是同一個變量。html
$link-color: blue; a { color: $link_color; } //編譯後 a { color: blue; }
css
中重複寫選擇器是很是惱人的。若是要寫一大串指向頁面中同一塊的樣式時,每每須要 一遍又一遍地寫同一個ID
:vue
#content article h1 { color: #333 } #content article p { margin-bottom: 1.4em } #content aside { background-color: #EEE }
像這種狀況,sass
可讓你只寫一遍,且使樣式可讀性更高。在Sass
中,你能夠像俄羅斯套娃那樣在規則塊中嵌套規則塊。sass
在輸出css
時會幫你把這些嵌套規則處理好,避免你的重複書寫。node
#content { article { h1 { color: #333 } p { margin-bottom: 1.4em } } aside { background-color: #EEE } } /* 編譯後 */ #content article h1 { color: #333 } #content article p { margin-bottom: 1.4em } #content aside { background-color: #EEE }
使用後代選擇器和爲了僞類的時候可能就是比較麻煩了 不知道怎麼寫。這個時候&
就派上用場了webpack
article a { color: blue; &:hover { color: red } } // 編譯後 // 其實&至關因而父級 article a { color: blue } article a:hover { color: red }
在處理羣組的時候只須要用,
分割就行了,就能完美的解析不用內麼麻煩web
.container { h1, h2, h3 {margin-bottom: .8em} } <!--編譯後--> .container h1 {margin-bottom: .8em} .container h2 {margin-bottom: .8em} .container h3 {margin-bottom: .8em}
這種也是同樣的npm
nav, aside { a {color: blue} } //編譯後 nav a, aside a {color: blue}
上邊這三個組合選擇器必須和其餘選擇器配合使用,以指定瀏覽器僅選擇某種特定上下文中的元素。瀏覽器
article { // 同層全體組合選擇器 ~ article { border-top: 1px dashed #ccc } // 直接子元素 > section { background: #eee } dl > { dt { color: #333 } dd { color: #555 } } // 同層相鄰組合選擇器 nav + & { margin-top: 0 } }
在sass
中,除了CSS
選擇器,屬性也能夠進行嵌套。儘管編寫屬性涉及的重複不像編寫選擇器那麼糟糕,可是要反覆寫border-styleborder-widthborder-color
以及border-*
等也是很是煩人的。在sass
中,你只需敲寫一遍border
:sass
nav { border: { style: solid; width: 1px; color: #ccc; } } // 編譯後 nav { border-style: solid; border-width: 1px; border-color: #ccc; }
你甚至還能夠這樣寫app
nav { border: 1px solid #ccc { left: 0px; right: 0px; } } // 編譯後 nav { border: 1px solid #ccc; border-left: 0px; border-right: 0px; }
css
有一個特別不經常使用的特性,即@import
規則,它容許在一個css
文件中導入其餘css
文件。然而,後果是隻有執行到@import
時,瀏覽器纔會去下載其餘css
文件,這致使頁面加載起來特別慢。sass
也有一個@import
規則,但不一樣的是,sass
的@import
規則在生成css
文件時就把相關文件導入進來。這意味着全部相關的樣式被概括到了同一個css
文件中,而無需發起額外的下載請求。
通常狀況下,你反覆聲明一個變量,只有最後一處聲明有效且它會覆蓋前邊的值。舉例說明:
$link-color: blue; $link-color: red; a { color: $link-color; // red }
可是你不想這種狀況你可使用sass
的!default
標籤能夠實現這個目的。它很像css
屬性中!important
標籤的對立面,不一樣的是!default
用於變量,含義是:若是這個變量被聲明賦值了,那就用它聲明的值,不然就用這個默認值。
body { color: #333; // 這種註釋內容不會出如今生成的css文件中 padding: 0; /* 這種註釋內容會出如今生成的css文件中 */ }
若是你的整個網站中有幾處小小的樣式相似(例如一致的顏色和字體),那麼使用變量來統一處理這種狀況是很是不錯的選擇。可是當你的樣式變得愈來愈複雜,你須要大段大段的重用樣式的代碼,獨立的變量就沒辦法應付這種狀況了。你能夠經過sass
的混合器實現大段樣式的重用。
混合器使用@mixin
標識符定義。看上去很像其餘的CSS
@標識符,好比說@media
或者@font-face
。這個標識符給一大段樣式賦予一個名字,這樣你就能夠輕易地經過引用這個名字重用這段樣式。下邊的這段sass
代碼,定義了一個很是簡單的混合器,目的是添加跨瀏覽器的圓角邊框。
@mixin rounded-corners { -moz-border-radius: 5px; -webkit-border-radius: 5px; border-radius: 5px; }
而後就能夠在你的樣式表中經過@include
來使用這個混合器,放在你但願的任何地方。@include
調用會把混合器中的全部樣式提取出來放在@include
被調用的地方。若是像下邊這樣寫:
notice { background-color: green; border: 2px solid #00aa00; @include rounded-corners; } //sass最終生成: // 編譯後 .notice { background-color: green; border: 2px solid #00aa00; -moz-border-radius: 5px; -webkit-border-radius: 5px; border-radius: 5px; }
混合器太好用了,一不當心你可能會過分使用。大量的重用可能會致使生成的樣式表過大,致使加載緩慢。因此,首先咱們將討論混合器的使用場景,避免濫用。
混合器並不必定總得生成相同的樣式。能夠經過在@include
混合器時給混合器傳參,來定製混合器生成的精確樣式。當@include
混合器時,參數其實就是能夠賦值給css
屬性值的變量。若是你寫過JavaScript
,這種方式跟JavaScript
的function
很像:
@mixin link-colors($normal, $hover, $visited) { color: $normal; &:hover { color: $hover; } &:visited { color: $visited; } }
當混合器被@include
時,你能夠把它看成一個css
函數來傳參。若是你像下邊這樣寫:
a { @include link-colors(blue, red, green); } //Sass最終生成的是: a { color: blue; } a:hover { color: red; } a:visited { color: green; }
其實@mixin 的方法還有不少 能夠官網查看
使用sass
的時候,最後一個減小重複的主要特性就是選擇器繼承。基於Nicole Sullivan
面向對象的css
的理念,選擇器繼承是說一個選擇器能夠繼承爲另外一個選擇器定義的全部樣式。這個經過@extend
語法實現,以下代碼:
//經過選擇器繼承繼承樣式 .error { border: 1px solid red; background-color: #fdd; } .seriousError { @extend .error; border-width: 3px; }
.seriousError
不只會繼承.error
自身的全部樣式,任何跟.error
有關的組合選擇器樣式也會被.seriousError
以組合選擇器的形式繼承,以下代碼:
//.seriousError從.error繼承樣式 .error a{ //應用到.seriousError a color: red; font-weight: 100; } h1.error { //應用到hl.seriousError font-size: 1.2rem; }
關於@extend
有兩個要點你應該知道。
跟混合器相比,繼承生成的css代碼相對更少。由於繼承僅僅是重複選擇器,而不會重複屬性,因此使用繼承每每比混合器生成的css
體積更小。若是你很是關心你站點的速度,請牢記這一點。
繼承聽從css
層疊的規則。當兩個不一樣的css規則應用到同一個html
元素上時,而且這兩個不一樣的css
規則對同一屬性的修飾存在不一樣的值,css
層疊規則會決定應用哪一個樣式。至關直觀:一般權重更高的選擇器勝出,若是權重相同,定義在後邊的規則勝出。
混合器自己不會引發css層疊的問題,由於混合器把樣式直接放到了css規則中,而繼承存在樣式層疊的問題。被繼承的樣式會保持原有定義位置和選擇器權重不變。一般來講這並不會引發什麼問題,可是知道這點總沒有壞處。
以上就是我在官網所瞭解到的信息, 不算全面, 可是以爲在平常開發確定夠用了. 附上官網地址