css
其實不是一門編程語言, css
全稱 Cascading Style Sheets
(層疊樣式表)是一種用來表現HTML
(標準通用標記語言的一個應用)或 XML
(標準通用標記語言的一個子集)等文件樣式的計算機語言。咱們用它來實現表現層和結構層的分離,也就是 html
和樣式的分離。你能夠用它爲網頁制定樣式,可是他沒法像 JavaScript
同樣聲明變量,調用函數,使用條件語句,能夠說 JavaScript
是靈活的,動態的,而 css
是死板的,一成不變的。css
因此,有人想要爲其加入編程的思想,讓他擁有遍歷,擁有方法,甚至擁有繼承,可以告訴你語法上的錯誤,因此有了css
預處理,它的思想是先用一門新的專門編程的語言來設計網頁樣式,再編譯成css
,其實最後引用的仍舊是編譯出來的css
。html
說到css
預處理,可能大部分人首先想到的是Less
。如今作css
預處理的語言比較優秀的Less
是其一:它快速方便入門簡單,sass
是其二:相對來講說它更加靈活,語法更多(尤爲是if else for
),固然好多人不使用的緣由是嫌棄它安裝不方便(還好有淘寶鏡像),其三是Stylus
:他與sass
比較相似都是更加靈活強大。前端
想好何時咱們可使用css預處理css
預處理讓咱們對樣式的處理更加編程化,可是咱們仍須要考慮好在怎樣的環境中使用它,由於咱們知道,不管你的sass
代碼多麼炫酷,邏輯多麼縝密,到最後都是生成了一個css
文件。linux
因此咱們須要根據項目的大小以及開發時間團隊成原本肯定,若是項目比較小須要的css
並非太多而且開發時間緊迫團隊裏不少人還不會使用,那麼可能使用原生的css
可能會更好一些。webpack
不少開發者本來是想使用sass
的,可是由於sass
是基於ruby
的,牆在上,ruby
裝半天裝不上,因而放棄,這裏推薦使用淘寶的鏡像來進行安裝。css3
推薦使用koala, koala
是一個前端預處理器語言圖形編譯工具,支持Less、Sass、Compass、CoffeeScript,幫助web開發者更高效地使用它們進行開發。跨平臺運行,完美兼容windows、linux、mac。git
若是是學習的話能夠先使用koala
來進行調試,若是使用到現代工程化項目中,推薦使用webpack
安裝配置sass-loader
github
先來看看區別吧web
$color : red; //sass語法 .box color:$color; //scss語法 .box{ color:$color; }
其實 sass
語法是 sass
最開始的語法結構,是經過 tab
縮進來進行的一個規則,有點相似 jade
模板的那種縮進,並且這種語法規則十分嚴格,有啥不對勁,編譯的時候就報錯。編程
而 scss
呢,是 sass
的新語法格式,不要認爲他是另一種預處理語言,其實它是 sass
在發現以前的語法結構太過於嚴格,而且和 css
有點不像後從新定製的語法結構,它在外觀上是與css
基本一致的,而且它十分寬鬆,你能夠直接將以前的 css
代碼複製過來。
我在這裏寫在了一個代碼塊中只是示例,其實他們文件名是分別以 .sass
和 .scss
來結尾的。
這是 sass
的編程元素基礎之一。在 JS
中咱們使用 var
來聲明變量,固然 ES6
中新加了 let const
。而在sass
聲明和調用變量的規則以下
$height: 15px !default; //聲明默認變量 $height: 50px; //聲明普通變量 body{ height: $height; }
變量有默認變量和普通變量之分,默認變量只需像 !important
同樣在值後面加上 !default
便可。其實通常狀況下咱們只須要聲明普通變量,默認變量在開發組件時使用比較方便。
和JS
相似,sass
語法中也有局部變量和全局變量。以下在最外層聲明的是全局變量,全局範圍內能夠調用,在em{}
中聲明的是em
的局部變量,只在em{}
內部內進行調用。
$color:#000; //全局變量 .block { color: $color; } em { $color: #fff; //局部變量 a { //選擇器嵌套 color: $color; font: { //屬性嵌套 size: 12px; weight: bold; } &:hover { //僞類嵌套 color: $color; } } }
和JS
相似,sass
也擁有本身的數據類型分別是
數字: 如,一、 二、 1三、 10px; 字符串:有引號字符串或無引號字符串,如,"foo"、 'bar'、 baz; 顏色:如,blue、 #04a3f九、 rgba(255,0,0,0.5); 布爾型:如,true、 false; 空值:如,null; 值列表:用空格或者逗號分開,如,1.5em 1em 0 2em 、 Helvetica, Arial, sans-serif。
編程的思想,混合宏是一個相似於函數的存在,固然,他並非函數,簡單來講就是增長參數功能的使得靈活度提高的可重用的代碼塊。
@mixin border-radius{ -webkit-border-radius: 5px; border-radius: 5px; } button { @include border-radius; }
這裏是一個簡單的混合宏的使用,先是用 @mixin
定義了一個名叫 border-radius
的混合宏,而後在代碼中利用 @include
進行調用,其實這樣的話並不能太大致現出混合宏的特點。看下面的
@mixin border-radius1($radius){ -webkit-border-radius: $radius; border-radius: $radius; } @mixin border-radius2($radius:5px){ -webkit-border-radius: $radius; border-radius: $radius; } .box1 { @include border-radius(5px); } .box2 { @include border-radius; } .box2 { @include border-radius(5px); }
從代碼裏能夠看出,混合宏能夠像函數同樣傳入參數,而且能夠像 ES6
的函數擴展同樣添加參數默認值,若是在調用的時候不傳參數,那麼就會使用默認的值,這樣極大的增長了代碼的靈活性,省卻不少開發時間。
其實,mixin
的靈活還不只僅如此,它能夠傳入多個參數,這樣咱們想到了函數能夠根據參數數量的不一樣來執行不一樣的代碼,是的,sass也能夠作到。
@mixin size($width,$height){ //兩個參數或者多個參數能夠這樣這樣定義 width: $width; height: $height; } .box-center { @include size(100px,200px); } @mixin box-shadow($shadows...){ //參數過多可使用...來代替 @if length($shadows) >= 1 { -webkit-box-shadow: $shadows; box-shadow: $shadows; } @else { $shadows: 0 0 2px rgba(#000,.25); -webkit-box-shadow: $shadow; box-shadow: $shadow; } } .box { @include box-shadow(0 0 1px rgba(#000,.5),0 0 2px rgba(#000,.2)); }
上面兩個代碼塊第一個比較簡單,就是增長參數數目。下面的代碼塊咱們利用sass
的if else
方法來實現了判斷,若是參數數目大於等於1
,也就是傳了參數,那麼咱們執行上面的代碼,若是沒有傳參咱們執行下面的代碼,設置默認的$shadows
值生成代碼塊。
可是混合宏也有不足之處:那就是調用一個混合宏生成的css
代碼並不會進行合併,這也是由於他可以傳參所設置的,因此對於複用性很強的代碼塊不推薦使用混合宏。
sass
容許你使用@extend
繼承別的代碼塊,而且經過@extend
所繼承的代碼塊會在生成css
的時候進行合併~完美解決了上面的問題。
.btn1 { border: 1px solid #ccc; padding: 6px 10px; font-size: 14px; } %btn2 { border: 1px solid #ccc; padding: 6px 10px; font-size: 14px; } %btn3 { border: 1px solid #ccc; padding: 6px 10px; font-size: 14px; } .btn-primary1 { background-color: #f36; color: #fff; @extend .btn1; } .btn-primary2 { background-color: #f36; color: #fff; @extend %btn2; }
上面的代碼中.btn1
是預先定義好的類,而後咱們在.btn-primary1
中繼承他的全部代碼塊,而%btn2
就是在標題裏所提到的佔位符,佔位符的代碼塊若是不被繼承在生成的css
中是不會顯示出來的,因此若是你是用sass
編譯css
的話,公共類使用佔位符來定義是一個很不錯的選擇。爲了加深理解咱們看下上面的代碼所生成的css
代碼。
.btn1, .btn-primary1 { border: 1px solid #ccc; padding: 6px 10px; font-size: 14px; } .btn-primary2 { border: 1px solid #ccc; padding: 6px 10px; font-size: 14px; } .btn-primary1 { background-color: #f36; color: #fff; } .btn-primary2 { background-color: #f36; color: #fff; }
繼承btn1
的btn-primary1
他和btn1
進行了合併,而咱們使用佔位符定義的%btn2 %btn3
在生成代碼裏沒有顯示,由於btn-primary2
繼承了%btn2
,因此他繼承的公共部分被單獨拿出來,若是有多個代碼塊繼承%btn2
,他們會進行合併。
佔位符仍是混合宏,主要仍是看你的代碼怎麼使用,若是隻是靜態的代碼公共塊,那麼佔位符會比較適合,而若是是可變的代碼例如寫一個複雜的css3動畫之類的,可能混合宏比較適合了。
若是接觸過jade
模板的朋友會比較熟悉,這裏的插值和它用法是基本一致的。讓咱們來看一個複雜的代碼塊。
$properties: (margin, padding); @mixin set-value($side, $value) { @each $prop in $properties { #{$prop}-#{$side}: $value; } } .login-box { @include set-value(top, 14px); }
首先咱們聲明瞭一個$properties
的變量,裏面是一個值列表裏面兩個字符串,@mixin
方法裏咱們經過@each
方法循環出值列表裏面的字符串而後利用插值的方法將字符串插入進去,咱們看下生成的css
代碼
.login-box { margin-top: 14px; padding-top: 14px; }
這裏只是作一個示例,正常狀況下咱們不會用這麼複雜的方法來生成這麼短的css
代碼。
sass
容許咱們作一些基本的運算:加減乘除,可是我要說的是:注意單位!注意單位!注意單位!固然若是你異想天開em+px,px*px,px/rem.................
須要知道的是sass
裏容許進行顏色運算,也就是說 #222222 * 2
你將會獲得 #444444
,其實顏色的運算機制是分段運算也就是說若是22*2 22*2 22*2
而後在進行合併的。
字符串能夠經過+
來進行連接,須要注意的是由於sass
的字符串有兩種類型,帶引號和不帶引號,相同相加固然出來的是一致的。若是有引號的字符串被添加了一個沒有引號的字符串 (也就是,帶引號的字符串在 + 符號左側), 結果會是一個有引號的字符串。 一樣的,若是一個沒有引號的字符串被添加了一個有引號的字符串 (沒有引號的字符串在 + 符號左側), 結果將是一個沒有引號的字符串,其實就是誰在左邊就跟着誰。
p:before { content: "Foo " + Bar; font-family: sans- + "serif"; } //生成的css以下 p:before { content: "Foo Bar"; font-family: sans-serif; }
上面的內容就是sass的基礎篇,進階篇的話會整理一下函數和方法規則相關的東西。