css預編譯--sass基礎篇

sass起源和簡介

css 其實不是一門編程語言, css 全稱 Cascading Style Sheets (層疊樣式表)是一種用來表現HTML(標準通用標記語言的一個應用)或 XML(標準通用標記語言的一個子集)等文件樣式的計算機語言。咱們用它來實現表現層和結構層的分離,也就是 html 和樣式的分離。你能夠用它爲網頁制定樣式,可是他沒法像 JavaScript 同樣聲明變量,調用函數,使用條件語句,能夠說 JavaScript 是靈活的,動態的,而 css 是死板的,一成不變的。css

因此,有人想要爲其加入編程的思想,讓他擁有遍歷,擁有方法,甚至擁有繼承,可以告訴你語法上的錯誤,因此有了css預處理,它的思想是先用一門新的專門編程的語言來設計網頁樣式,再編譯成css,其實最後引用的仍舊是編譯出來的csshtml

說到css預處理,可能大部分人首先想到的是Less。如今作css預處理的語言比較優秀的Less是其一:它快速方便入門簡單,sass是其二:相對來講說它更加靈活,語法更多(尤爲是if else for),固然好多人不使用的緣由是嫌棄它安裝不方便(還好有淘寶鏡像),其三是Stylus:他與sass比較相似都是更加靈活強大。前端

想好何時咱們可使用css預處理
css預處理讓咱們對樣式的處理更加編程化,可是咱們仍須要考慮好在怎樣的環境中使用它,由於咱們知道,不管你的sass代碼多麼炫酷,邏輯多麼縝密,到最後都是生成了一個css文件。linux

因此咱們須要根據項目的大小以及開發時間團隊成原本肯定,若是項目比較小須要的css並非太多而且開發時間緊迫團隊裏不少人還不會使用,那麼可能使用原生的css可能會更好一些。webpack

sass基礎

安裝

不少開發者本來是想使用sass的,可是由於sass是基於ruby的,牆在上,ruby裝半天裝不上,因而放棄,這裏推薦使用淘寶的鏡像來進行安裝。css3

編譯

學習使用

推薦使用koala, koala是一個前端預處理器語言圖形編譯工具,支持Less、Sass、Compass、CoffeeScript,幫助web開發者更高效地使用它們進行開發。跨平臺運行,完美兼容windows、linux、mac。git

若是是學習的話能夠先使用koala來進行調試,若是使用到現代工程化項目中,推薦使用webpack安裝配置sass-loadergithub

sass和scss

先來看看區別吧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));
}

上面兩個代碼塊第一個比較簡單,就是增長參數數目。下面的代碼塊咱們利用sassif 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; }

繼承btn1btn-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的基礎篇,進階篇的話會整理一下函數和方法規則相關的東西。

相關文章
相關標籤/搜索