Sass-也許你想和CSS玩耍起來(上篇)

咱們努力,咱們堅持,共勉!

衆所周知,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比較相似都是更加靈活強大。這裏由於我比較喜好Sass而且相信它不會那麼快死去,因此對sass作一個簡單介紹。node

想好何時咱們可使用css預處理

誠然,css預處理讓咱們對樣式的處理更加編程化,可是咱們仍須要考慮好在怎樣的環境中使用它,由於咱們知道,不管你的sass代碼多麼炫酷,邏輯多麼縝密,到最後都是生成了一個css文件(老前輩對年輕的個人教誨)。css3

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

sass基礎

安裝~

咳咳,不得不說好多開發者原本是想使用sass的,可是由於sass是基於ruby的,高牆在上,ruby裝半天裝不上,因而放棄呼。這裏推薦你看下W3Cplus的教程使用淘寶的鏡像來進行安裝,包括node的一些包的安裝我都是使用的淘寶鏡像來進行安裝的,很快很強大。編程

編譯~

咳咳,不少朋友安裝完了,可是發現編譯起來很麻煩。這裏繼續上連接sass編譯教程,我在這裏推薦你們使用考拉來進行編譯,雖然考拉已經中止更新可是它確實是十分實用的,less,sass均可以編譯,並且能夠在編譯時進行壓縮。sass

sass和scss

先來看看區別吧ruby

$color : red;

//sass語法
.box
    color:$color;

//scss語法
.box{
  color:$color;
}

其實sass語法是sass最開始的語法結構,是經過tab縮進來進行的一個規則,有點相似jade模板的那種縮進,並且這種語法規則十分嚴格,有啥不對勁,編譯的時候就報錯。css3動畫

而scss呢,是sass的新語法格式,不要認爲他是另一種預處理語言,其實它是sass在發現以前的語法結構太過於嚴格,而且和css有點不像後從新定製的語法結構,它在外觀上是與css基本一致的,而且它十分寬鬆,你能夠直接將以前的css代碼複製過來。less

我在這裏寫在了一個代碼塊中只是示例,其實他們文件名是分別以.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的靈活還不只僅如此,它能夠傳入多個參數,這樣咱們想到了函數能夠根據參數數量的不一樣來執行不一樣的代碼。yes !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的上篇。都是一些基礎的東西,下篇的話會整理一下說到函數和方法規則相關的東西。

相關文章
相關標籤/搜索