Sass入門(1)

前言

什么是CSS預處理器

定義:

CSS預處理器定義了一種新的語言,其基本思想是,用一種專門的編程語言,為CSS增加了一些編程的特性,將CSS作為目標生成文件,然后開發(fā)者就只要使用這種語言進行編碼工作。

通俗的說,“CSS預處理器用一種專門的編程語言,進行Web頁面樣式設計,然后再編譯成正常的CSS文件,以供項目使用。CSS預處理器為CSS增加了一些編程的特性,無需考慮瀏覽器的兼容問題”,例如你可以在CSS中使用變量簡單的邏輯程序、函數(shù)等等在編程語言中的一些基本特性,可以讓你的CSS更加簡潔適應性更強、可讀性更佳、更易于代碼的維護等諸多好處。

其他CSS預處理器語言:

CSS預處理器技術(shù)已經(jīng)非常的成熟,而且也涌現(xiàn)出了很多種不同的CSS預處理器語言(前三者較為流行),比如說:

  • Sass(Scss)
  • Less
  • Stylus
  • Turbine
  • Swithch CSS
  • CSS Cacheer
  • DT CSS

如何描述Sass

Sass是一門高于CSS的元語言(可以看一下元編程),它能用來清晰的結(jié)構(gòu)化地描述文件樣式,有著比普通CSS更加強大的功能。Sass能夠提供更簡潔、更優(yōu)雅的語法,同時提供多種功能來創(chuàng)建可維護管理的樣式表。

下文中Sass表示sass和scss的統(tǒng)稱,演示方法采取scss新語法,sass則表示Sass舊語法。


sass和scss有什么區(qū)別?

sass和scss其實是同一種東西,我們平時都稱之為Sass,兩者之間的不同在于:

  • 文件擴展名不同,sass是“.sass”后綴為擴展名,而scss是以“.scss”后綴為擴展名;

  • 語法書寫方式不同,sass是以嚴格的縮進式語法規(guī)則來書寫,也就是說不帶大括號{}和分號,而scss的語法書寫和CSS語法書寫方式非常類似。
    例如:

    • sass語法

      $font-stack: Helvetica, sans-serif  // 定義變量
      $primary-color: #333  // 定義變量
      body 
          font: 100% 
          $font-stack color: $primary-color
      
    • scss語法

      $font-stack: Helvetica, sans-serif;  // 定義變量
      $primary-color: #333;  // 定義變量
      body { 
          font: 100% $font-stack;
          color: $primary-color;
      }
      
    • 編譯后的css

      body {
          font: 100% Helvetica, sans-serif;
          color: #333;
      }
      

sass/scss和純CSS寫法有區(qū)別嗎?

  • sass和CSS 寫法有差別:

    sass和CSS寫法的確存在一定的差異,由于sass是基于Ruby寫出來的,所以其延續(xù)了Ruby的書寫規(guī)范。在書寫sass時不帶有大括號和分號,其主要是依靠嚴格的縮進方式來控制的。

  • scss和CSS 寫法無差別:

    SCSS和CSS寫法無差別,簡單點說,就是把現(xiàn)有的“.css”文件直接修改成“.scss”即可使用。

sass語法格式

這里說的sass語法是Sass的最初語法格式,它是通過tab鍵控制縮進的一種語法規(guī)則,而且這種縮進要求非常嚴格,并且不能帶有任何大括號和分號。所以常常把這種格式稱之為Sass老版本,其文件名以“.sass”為擴展名。

例如:

body { 
    font: 100% Helvetica, sans-serif; 
    color: #333;
}

用sass的語法格式來寫就是:

$font-stack: Helvetica, sans-serif
$primary-color: #333
body
    font: 100%
    $font-stack color: $primary-color

在整個sass代碼中,是沒有類似CSS中的大括號和分號。

scss語法格式

scss是Sass的新語法格式,從外形上來判斷,它和CSS長得幾乎是一模一樣,代碼都包裹在一堆大括號里,并且末尾結(jié)束處都有一個分號,其文件格式名常常以“.scss”為擴展名。

同樣的CSS代碼:

body {
    font: 100% Helvetica, sans-serif; 
    color: #333;
}

使用scss語法格式將會是下面這樣:

$font-stack: Helvetica, sans-serif;
$primary-color: #333;
body {
    font: 100% $font-stack;
    color: $primary-color;
}

這樣的語法格式便于經(jīng)常使用CSS的程序員。

但是不管是sass的語法格式還是scss的語法格式,它們的功能都是一樣的,不同的只是書寫格式文件擴展名。

下面是對比圖:


“.sass”只能使用Sass老語法規(guī)則,也就是sass語法的縮進規(guī)則,“.scss”使用的是Sass的新語法規(guī)則,也就是scss語法規(guī)則(類似CSS語法格式)。

Sass命令編譯

命令編譯指的是使用電腦中的命令終端,通過輸入Sass指令來編譯Sass,這種編譯方式是最直接也是最簡單的一種方式,因為只需要在你的命令終端輸入:

單文件編譯:

sass <要編譯的Sass文件路徑>/style.scss:<要輸出的CSS文件路徑>/style.css

這是對一個單文件進行編譯,如果想對整個項目所有Sass文件編譯成CSS文件,可以這樣操作:

多文件編譯:

sass sass/:css/

上面的命令表示將項目中“sass”文件夾中所有“.scss”(“.sass”)文件編譯成“.css”文件,并且將這些CSS文件都放在項目中“CSS”文件夾中。

缺點以及解決方法:

在實際編譯過程中,你會發(fā)現(xiàn)上面的命令,只能一次性編譯。每次個性保存“.scss”文件之后,都得重新執(zhí)行一次這樣的命令,這樣操作太麻煩,所以在編譯Sass的時候,可以開啟“watch”功能,這樣只要你的代碼進行過任何保存修改,都能自動監(jiān)測到代碼的變化,并且直接編譯出來。

sass --watch <要編譯的Sass文件路徑>/style.scss:<要輸出的CSS文件路徑>/style.css

當然,使用Sass命令編譯時,可以帶很多的參數(shù):

watch 舉例:
假設本地有一個項目,要將項目中的“bootstrap.scss”編譯出“bootstrap.css”文件,并且將編譯出來的文件放在“css”文件夾中,那么可以在命令終端執(zhí)行:

sass --watch sass/bootstrap.scss:css/bootstrap.css

一旦我的bootstrap.scss文件有任何修改,只要重新保存了修改文件,命令終端就能監(jiān)測,并且重新編譯出文件:


Sass不同樣式風格的輸出方法

sass --watch test.scss:test.css --style nested/expanded/compact/compressed
style后面就是輸出方法
  • 嵌套輸出方式 nested


  • 展開輸出方式 expanded


    這個輸出的CSS樣式風格和nested類似,只是大括號需要再另起一行。

  • 緊湊輸出方式 compact


    這個方式適合喜歡單行CSS樣式的人。

  • 壓縮輸出方式 compressed


    壓縮輸出方式會去掉標準的Sass和CSS注釋以及空格。

Sass基礎(chǔ)語法

變量

Sass的變量包括三個部分:

  • 聲明變量的符號“$”
  • 變量名稱
  • 賦予變量的值

普通變量和默認變量

普通變量

定義之后可以在全局范圍內(nèi)使用。

$fontSize: 12px;
body {
    font-size:$fontSize;
}

編譯后的CSS代碼:

body {
    font-size:12px;
}
默認變量

Sass的默認變量僅需要在值后面加上!default即可。

$baseLineHeight:1.5 !default;
body { 
    line-height: $baseLineHeight;
}

編譯后的css代碼:

body {
    line-height:1.5;
}

SASS的默認變量一般是用來設置默認值,然后根據(jù)需求來覆蓋的。覆蓋的方式也很簡單,只需要在默認變量之前重新聲明下變量即可。

$baseLineHeight: 2;
$baseLineHeight: 1.5 !default;
body{ 
    line-height: $baseLineHeight; 
}

編譯后的CSS代碼:

body { 
    line-height:2;
}

變量的調(diào)用

在Sass中聲明了變量之后,就可以在需要的地方調(diào)用變量。調(diào)用變量的方法也很簡單。

例如定義了變量:

$brand-primary : darken(#428bca, 6.5%) !default;   // #337ab7 
$btn-primary-color: #fff !default;
$btn-primary-bg : $brand-primary !default;
$btn-primary-border : darken($btn-primary-bg, 5%) !default;

在按鈕button中調(diào)用,可以按下面的方式調(diào)用:

.btn-primary {
    background-color: $btn-primary-bg; 
    color: $btn-primary-color; 
    border: 1px solid $btn-primary-border;
}

編譯出來的CSS:

.btn-primary { 
    background-color: #337ab7; 
    color: #fff; 
    border: 1px solid #2e6da4;
}

全局變量和局部變量

  • 什么是全局變量?
    在選擇器、函數(shù)、混合宏...的外面定義的變量為全局變量。
    全局變量就是定義在元素外面的變量。

    例如:

    $color: orange !default  // 定義全局變量
    .block { 
        color: $color;  // 調(diào)用全局變量
    }
    em { 
        $color: red;  // 定義局部變量
        a
          {
              color: $color;  // 調(diào)用局部變量
          }
    }
    span {
        color: $color;  // 調(diào)用全局變量
    }
    
  • 什么是局部變量

    當在局部范圍(選擇器內(nèi)、函數(shù)內(nèi)、混合宏內(nèi)...)聲明一個已經(jīng)存在于全局范圍內(nèi)的變量時,局部變量就成為了全部變量的影子?;旧?,局部變量只會在局部范圍內(nèi)覆蓋全局變量。

Sass中變量的概念與其他CSS預處理器不一致,例如:

  • 在Sass 3.4.0之前,Sass可以說是沒有局部變量和全局變量之分的,即后聲明的同名變量總是會覆蓋之前的同名變量,不管后聲明的變量是位于何處。

    Sass官網(wǎng)上 3.4.0版本的 Backwards Incompatibilities – Must Read! 中有這樣一條:

    All variable assignments not at the top level of the document are now local by default. If there’s a global variable with the same name, it won’t be overwritten unless the !global flag is used. For example, $var: value !global will assign to $var globally. This behavior can be detected using feature-exists(global-variable-shadowing).

    沒有位于第一層(全局)的變量聲明現(xiàn)在都被默認為是局部的。如果存在一個同名的全局變量,這個全局變量也不會被重寫,除非同名的局部變量被聲明時使用關(guān)鍵字!default。

  • Less 中的變量和其他編程語言一樣,可以實現(xiàn)值的復用,同樣它也有作用域(scope)。簡單的講,變量作用域就是局部變量和全局變量的概念。

嵌套

Sass有三種嵌套方式:

  • 選擇器嵌套
  • 屬性嵌套
  • 偽類嵌套

選擇器嵌套

/* Sass */
nav {
  a {
    color: red;
    header & {
      color:green;
    }
  }  
}

/* css */
nav a {
    color:red;
}
header nav a {
    color:green;
}

屬性嵌套

/* Sass */
.box {
    border: {
    top: 1px solid red;
    bottom: 1px solid green;
  }
}

/* css */
.box {
    border-top: 1px solid red;
    border-bottom: 1px solid green;
}

偽類嵌套

/* Sass */
.clearfix{
    &:before,
    &:after { 
        content:""; 
        display: table;
    }
    &:after { 
        clear:both; 
        overflow: hidden; 
    }
}

/* css */
clearfix:before, .clearfix:after {
    content: "";
    display: table;
}
.clearfix:after {
    clear: both;
    overflow: hidden;
}

混合宏

@mixin是用來聲明混合宏的關(guān)鍵詞,@include調(diào)用聲明好的混合宏。

/* 不帶參數(shù)的混合宏 */
@mixin border-radius{  
    -webkit-border-radius: 5px; 
    border-radius: 5px;
}  
/* 帶參數(shù)的混合宏 */
@mixin border-radius($radius:5px){ 
    -webkit-border-radius: $radius; 
    border-radius: $radius;
}

還有復雜的混合宏:

@mixin box-shadow($shadow...) {   // 帶有多個參數(shù),這個時候可以用"..."來替代
    @if length($shadow) >= 1 { 
        @include prefixer(box-shadow, $shadow); 
     } @else{ 
        $shadow:0 0 4px rgba(0,0,0,.3); 
        @include prefixer(box-shadow, $shadow); 
    }
}

混合宏的參數(shù)

  1. 傳一個不帶值的參數(shù)

    在混合宏中,可以傳一個不帶任何值的參數(shù),例如:

    @mixin border-radius($radius) { 
        -webkit-border-radius: $radius;
        border-radius: $radius;
    }
    

    在混合宏“border-radius”中定義了一個不帶任何值的參數(shù)“$radius”,在調(diào)用的時候可以給這個混合宏傳一個參數(shù)值:

    .box { 
        @include border-radius(3px);
    }
    

    這里表示給混合宏傳遞了一個“border-radius”的值為“3px”。
    編譯出來的CSS:

    .box { 
          -webkit-border-radius: 3px; 
          border-radius: 3px;
    }
    
  2. 傳一個帶值的參數(shù)

    在Sass的混合宏中,還可以給混合宏的參數(shù)傳一個默認值,例如:

    @mixin border-radius($radius:3px) { 
          -webkit-border-radius: $radius; 
          border-radius: $radius;
    }
    

    在混合宏“border-radius”傳了一個參數(shù)“$radius”,而且給這個參數(shù)賦予了一個默認值“3px”。
    在調(diào)用類似這樣的混合宏時,會多有一個機會,假設你的頁面中的圓角很多地方都是“3px”的圓角,那么這個時候只需要調(diào)用默認的混合宏“border-radius”:

    .btn { 
          @include border-radius;
    }
    

    編譯出來的CSS:

    .btn { 
          -webkit-border-radius: 3px;
          border-radius: 3px;
    }
    

    但有的時候,頁面中有些元素的圓角值不一樣,那么可以隨機給混合宏傳值,例如:

    .box { 
          @include border-radius(50%);
    }
    

    編譯出來的CSS:

    .box { 
          -webkit-border-radius: 50%; 
          border-radius: 50%;
    }
    
  3. 傳多個參數(shù)
    Sass混合宏除了能傳一個參數(shù)之外,還可以傳多個參數(shù),例如:

    @mixin center($width,$height) {
          width: $width; 
          height: $height; 
          position: absolute; 
          top: 50%; 
          left: 50%; 
          margin-top: -($height) / 2; 
          margin-left: -($width) / 2;
    }
    

    在混合宏“center”就傳了多個參數(shù)。
    并且在實際調(diào)用和調(diào)用其他混合宏是一樣的:

    .box-center { 
          @include center(500px,300px);
    }
    

    編譯出來的CSS:

    .box-center { 
          width: 500px; 
          height: 300px; 
          position: absolute; 
          top: 50%; 
          left: 50%; 
          margin-top: -150px; 
          margin-left: -250px;
    }
    

    有一個特別的參數(shù)“…”,當混合宏傳的參數(shù)過多的時候,可以使用該參數(shù)來替代,例如:

    @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; 
          }
    }
    

    在實際調(diào)用中:

    .box { 
          @include box-shadow(0 0 1px rgba(#000,.5),0 0 2px rgba(#000,.2));
    }
    

    編譯出來的CSS:

    .box { 
          -webkit-box-shadow: 0 0 1px rgba(0, 0, 0, 0.5), 0 0 2px rgba(0, 0, 0, 0.2); 
          box-shadow: 0 0 1px rgba(0, 0, 0, 0.5), 0 0 2px rgba(0, 0, 0, 0.2);
    }
    

    混合宏會生成冗余的代碼塊,Sass在調(diào)用相同的混合宏時,并不能智能地將相同的樣式代碼塊合并在一起。

Sass擴展和繼承

Sass中是通過關(guān)鍵詞“@extend”來繼承已存在的類樣式塊,在Sass中的繼承,可以繼承類樣式塊中所有樣式代碼,而且編譯出來的CSS將會把選擇器合并在一起,形成組合選擇器。

例如:

.btn { 
      border: 1px solid #ccc; 
      padding: 6px 10px; 
      font-size: 14px;
}
.btn-primary { 
      background-color: #f36; 
      color: #fff; 
      @extend .btn;
}

.btn-second { 
      background-color: orange; 
      color: #fff; 
      @extend .btn;
}

生成:.btn、.btn-primary、 .btn-second三個相同樣式合并在一起。

.btn, .btn-primary, .btn-second { 
      border: 1px solid #ccc; 
      padding: 6px 10px; 
      font-size: 14px;
}
.btn-primary { 
      background-color: #f36; 
      color: #fff;
}
.btn-second { 
      background-clor: orange; 
      color: #fff;
}

占位符%placeholder

Sass中的占位符%placeholder功能是一個很強大,很實用的一個功能,它可以取代以前CSS中的基類造成的代碼冗余的情況。因為%placeholder聲明的代碼,如果不被@extend調(diào)用的話,不會產(chǎn)生任何代碼。
例如:

%mt5 { 
      margin-top: 5px;
} 
%pt5{ 
      padding-top: 5px;
}

這段代碼沒有被@extend調(diào)用,它沒有產(chǎn)生任何代碼塊,只是靜靜地躺在某個Sass文件中,只有通過@extend調(diào)用才會產(chǎn)生代碼:

%mt5 { 
      margin-top: 5px;
}
%pt5{ 
      padding-top: 5px;
}
.btn { 
      @extend %mt5; 
      @extend %pt5;
}
.block { 
      @extend %mt5; 
      span { 
          @extend %pt5; 
      }
}

編譯出來的CSS:

.btn, .block { 
      margin-top: 5px;
}
.btn, .block span { 
      padding-top: 5px;
}

從編譯出來的CSS代碼可以看出,通過@extend調(diào)用的占位符,編譯出來的代碼會將相同代碼合并在一起。

混合宏、繼承、占位符的區(qū)別

Sass插值#{}

使用CSS預處理器語言的一個主要原因是想使用Sass獲得一個更好的結(jié)構(gòu)體系。例如說想要寫更干凈的、高效面向?qū)ο?/strong>的CSS。Sass中的插值(Interpolation)就是重要的一部分。

例如:

$properties: (margin, padding);
@mixin set-value($side, $value) { 
      @each $prop in $properties {
        #{$prop}-#{$side}: $value; 
      }
}
.login-box { 
      @include set-value(top, 14px);
}

它可以讓變量和屬性工作得很完美,上面的代碼編譯成CSS:

.login-box { 
      margin-top: 14px; 
      padding-top: 14px;
}

這是Sass插值中簡單的例子,當你想設置屬性值的時候可以使用字符串插入進來。另一個有用的辦法是構(gòu)建一個選擇器,例如:

@mixin generate-sizes($class, $small, $medium, $big) { 
      .#{$class}-small { font-size: $small; } 
      .#{$class}-medium { font-size: $medium; } 
      .#{$class}-big { font-size: $big; }
}
@include generate-sizes("header-text", 12px, 20px, 40px);

編譯出來的CSS:

.header-text-small { 
    font-size: 12px; 
}
.header-text-medium { 
    font-size: 20px; 
}
.header-text-big { 
    font-size: 40px; 
}
一旦發(fā)現(xiàn)這一點,就會想到用`mixins`來生成代碼或是另一個`mixins`,但是會有限制,可能會刪除用於Sass變量的插值。
例如:

一旦發(fā)現(xiàn)這一點,就會想到用mixins(混合指令)來生成代碼或是另一個mixins,但是會有限制,可能會刪除用于Sass變量的插值。

例如:

$margin-big: 40px;
$margin-medium: 20px;
$margin-small: 12px;
@mixin set-value($size) { 
      margin-top: $margin-#{$size};
}
.login-box { 
      @include set-value(big);
}

上面的Sass代碼編譯出來會得到:

error style.scss (Line 5: Undefined variable: “$margin-".)

所以,#{}語法并不是隨處可用的,也不能在mixin中調(diào)用:

@mixin updated-status { 
      margin-top: 20px; 
      background: #F00;
}
$flag: "status";
.navigation { 
      @include updated-#{$flag};
}

上面代碼在編譯成CSS時同樣會報錯:

error style.scss (Line 7: Invalid CSS after "...nclude updated-": expected "}", was "#{$flag};")

但是可以在@extend中使用插值,例如:

%updated-status { 
      margin-top: 20px; 
      background: #F00;
}
.selected-status {
      font-weight: bold;
}
$flag: "status";.navigation { 
      @extend %updated-#{$flag}; 
      @extend .selected-#{$flag};
}

上面的Sass代碼是可以運行的,可以動態(tài)地插入.class%placeholder,但是不接受mixin這樣的參數(shù),例如上面的代碼編譯出來的CSS:

.navigation { 
      margin-top: 20px; 
      background: #F00;
}
.selected-status, .navigation { 
      font-weight: bold;
}

Sass注釋

  • 類似css注釋方法,使用“/”開頭,結(jié)尾使用“/”。

  • 類似Javascript的注釋方法,使用“//”。

    兩者的區(qū)別在于,前者會在編譯出來的CSS中顯示,而后者不會顯示。

Sass字符串

SassScript 支持 CSS 的兩種字符串類型:

  • 有引號的字符串 (quoted strings),如 "Lucida Grande" 、'http://sass-lang.com';
  • 無引號的字符串 (unquoted strings),如 sans-serifbold。

在編譯CSS文件時不會改變其類型,但如果是使用#{}插值語句 (interpolation) 時,有引號的字符串將會被編譯成無引號的字符串,這樣方便了在混合指令mixin中引用選擇起名。

@mixin firefox-message($selector) { 
      body.firefox #{$selector}:before { 
         content: "Hi, Firefox users!"; 
      }
}
@include firefox-message(".header");

編譯為:

body.firefox .header:before { 
      content: "Hi, Firefox users!"; 
}

需要注意的是:當deprecated = property syntax 時(暫時不理解是為什么),所有字符串都將被編譯為無引號字符串,無論是否使用了引號。

Sass值列表

所謂值列表(lists)是指Sass如何處理CSS中:

margin: 10px 15px 0 0;

或者:

font-face: Helvetica, Arial, sans-serif;

像上面這樣通過空格或者逗號分隔的一系列的值。
事實上,獨立的值也被視為值列表——只包含一個值的值列表。

Sass列表函數(shù)()賦予了值列表更多的功能:

  • nth函數(shù)(nth function)可以直接訪問值列表中的某一項;
  • join函數(shù)(join function)可以將多個值列表連結(jié)在一起;
  • append函數(shù)(append function)可以在值列表中添加值;
  • @each規(guī)則(@each rule)則能夠給值列表中的每個項目添加樣式。

Sass運算

加法

加法運算是Sass運算中的一種,在變量或?qū)傩灾卸伎梢宰黾臃ㄟ\算。
例如:

.box { 
    width: 20px + 8in;
}

編譯出來的CSS:

.box { 
    width: 788px;
}

但對于攜帶不同類型的單位時,在Sass中計算會報錯,如下所示:

.box {
  width: 20px + 1em;
}

編譯的時候,編譯器會報錯:“Incompatible units: 'em' and ‘px'”。

減法

Sass的減法運算和加法運算類似。
例如:

$full-width: 960px;
$sidebar-width: 200px;
.content { 
    width: $full-width **-** $sidebar-width;
}

編譯出來的CSS:

.content { 
    width: 760px;
}

在減法中,單位不同也會報錯。

乘法

Sass中的乘法運算和前面介紹的加法與減法運算略有不同,雖然乘法可以支持多種單位(例如em、px、%...),但當一個單位同時聲明兩個值時會有問題。
例如:

.box { 
    width:10px * 2px; 
}

編譯的時候報“20px*px isn't a valid CSS value.”錯誤信息。

如果進行乘法運算時,兩個值單位相同時,只需要為一個數(shù)值提供單位即可,上面的例子可以修改成:

.box { 
    width: 10px * 2;
}

編譯出來的CSS:

.box { 
    width: 20px;
}

Sass的乘法運算和加法、減法運算一樣,在運算中有不同類型的單位時,也會報錯。

例如:

.box { 
    width: 20px * 2em;
}

編譯時報“40em*px isn't a valid CSS value.”錯誤信息。

除法

Sass的乘法運算規(guī)則也適用于除法運算。不過除法運算還有一個特殊之處,眾所周知“/”符號在CSS中已經(jīng)作為一種符號使用。因此在Sass中做除法運算時,直接使用“/”符號作為除號時,將不會生效,編譯時既得不到所想要的效果,也不會報錯。

“/”符號被當作除法運算符時有以下幾種情況:

  • 如果數(shù)值或它的任意部分是儲存在一個變量中或是函數(shù)的返回值。
  • 如果數(shù)值被圓括號包圍。
  • 如果數(shù)值是另一個數(shù)學表達式的一部分。

如下所示:

p { 
      font: 10px/8px;  // 純CSS,不是除法運算 
      $width: 1000px; 
      width: $width/2;  // 使用了變量,是除法運算 
      width: round(1.5)/2;  // 使用了函數(shù),是除法運算 
      height: (500px/2);  // 使用了圓括號,是除法運算 
      margin-left: 5px + 8px/2px;  // 使用了加號(+),是除法運算
}

編譯出來的CSS:

p {
      font: 10px/8px; 
      width: 500px; 
      height: 250px; 
      margin-left: 9px; 
}

在除法運算時,如果兩個值帶有相同的單位值時,除法運算之后會得到一個不帶單位的數(shù)值。

變量計算

在Sass中除了可以使用數(shù)值進行運算之外,還可以使用變量進行計算。
例如:

$content-width: 720px;
$sidebar-width: 220px;
$gutter: 20px;
.container { 
      width: $content-width + $sidebar-width + $gutter; 
      margin: 0 auto;
}

編譯出來的CSS:

.container {
    width: 960px;
    margin: 0 auto;
}

數(shù)字運算

在Sass運算中數(shù)字運算是較為常見的,數(shù)字運算包括前面的:加法、減法、乘法和除法等運算,而且還可以通過括號來修改它們的運算先后順序。

.box {
      width: ((220px + 720px) - 11 * 20 ) / 12 ;  
}

編譯出來的CSS:

.box {
      width: 60px;
}

顏色運算

所有算術(shù)運算都支持顏色值,并且是分段運算的。也就是說,紅、綠和藍各顏色分段單獨進行運算。
例如:

p { 
      color: #010203 + #040506;
}

計算公式為01 + 04 = 05、02 + 05 = 07 和 03 + 06 = 09,并且被合成為:

p { 
      color: #050709;
}

算數(shù)運算也能將數(shù)字顏色值一起運算,同樣也是分段運算的。
例如:

p { 
      color: #010203 * 2;
}

計算公式為01 * 2 = 02、02 * 2 = 04 和 03 * 2 = 06,并且被合成為:

p { 
      color: #020406;
}

RGBA模式也可以運算,但R、G、B的最高值超過255將會顯示255,最低值小于0將會顯示0。
例如:

p {
      color: rgba(178, 34, 34, 0.54) + rgba(178, 34, 34, 0.54);
}

會等于:

p {
      color: rgba(255, 68, 68, 0.54);   // R超過255所以顯示255,G和B的值都相加,A=0.54不變
}

但是需要注意的是:

p {
      color: rgba(178, 34, 34, 0.34) + rgba(131, 23, 24, 0.54);
}

會報錯:Error: Alpha channels must be equal: rgba(178, 34, 34, 0.34) + rgba(131, 23, 24, 0.54)

**因為A值如果相同,是不參與運算之中,值保持不變。但如果A值不同則會報錯。 減法同理。 **

而在RGB模式中,運算后將會轉(zhuǎn)換成十六進制(Hex)顏色值。

字符運算

在Sass中可以通過加法符號“+”來對字符串進行連接。
例如:

$content: "Hello" + "" + "Sass!";
.box:before { 
    content: " #{$content} ";
}

編譯出來的CSS:

.box:before { 
    content: " Hello Sass! ";
}

除了在變量中做字符連接運算之外,還可以直接通過“+”,把字符連接在一起:

div { 
    cursor: e + -resize;
}

編譯出來的CSS:

div { 
    cursor: e-resize;
}

注意,如果有引號的字符串被添加了一個沒有引號的字符串(也就是說,帶引號的字符串在“+”加號的左側(cè)),結(jié)果將會是一個有引號的字符串。同樣的,如果一個沒有引號的字符串被添加了一個有引號的字符串(沒有引號的字符串在“+”加號的左側(cè)),結(jié)果將會是一個沒有引號的字符串
例如:

p:before { 
    content: "Foo " + Bar; font-family: sans- + "serif";
}

編譯出來的CSS:

p:before {  
    content: "Foo Bar"; 
    font-family: sans-serif;
}

Sass控制命令

@if

@if指令是一個SassScript,它可以根據(jù)條件來處理樣式塊,如果條件為true的話返回一個樣式塊,反之false則返回另一個樣式塊。在Sass中除了@if之外,還可以配合@else if@else一起使用。

假設要控制一個元素隱藏或顯示,我們就可以定義一個混合宏,通過@if...@else...來判斷傳進參數(shù)的值來控制display的值。

例如:

@mixin blockOrHidden($boolean:true) {
    @if $boolean {
        @debug "$boolean is #{$boolean}"; 
        display: block; 
    } @else { 
    @debug "$boolean is #{$boolean}"; 
        display: none; 
    }
}
.block { 
    @include blockOrHidden;
}
.hidden{ 
    @include blockOrHidden(false);
}

編譯出來的CSS:

.block { 
    display: block;
}
.hidden { 
    display: none;
}

@for

在制作網(wǎng)格系統(tǒng)的時候,大家應該對.col1~.col12這樣的印象比較深。在CSS中需要一個個去書寫,而在Sass中,可以使用@for循環(huán)來完成。而在Sass的@for有兩種方式:

  • @for $i from <start> through <end>

  • @for $i from <start> to <end>

編譯出來的CSS:

.item-1 { width: 2em;}
.item-2 { width: 4em;}
.item-3 { width: 6em;}

再來個 to 關(guān)鍵字的例子:

@for $i from 1to

.item-#{$i} { width: 2em * $i; }

編譯出來的CSS:

.item-1 { width: 2em;}
.item-2 { width: 4em;}

  • 2016/12/23 第一次編輯,基本采用《慕課網(wǎng)》中《Sass入門篇》資料,補充了”顏色值運算“的一點小實驗和自身遇到不懂知識的補充。
  • 2018/05/24 第二次編輯,補充Sass與Less變量差別的相關(guān)部分。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容

  • 為何叫做 shell ? shell prompt(PS1) 與 Carriage Return(CR) 的關(guān)系?...
    Zero___閱讀 3,185評論 3 49
  • 提問的智慧 How To Ask Questions The Smart Way Copyright ? 2001...
    Albert陳凱閱讀 2,415評論 0 8
  • 每個人都活在圈子里,朋友圈、親人圈、職場圈。這些圈子是你最熟悉的領(lǐng)域,而圈子里那些與你交集最多的人,對你的影響...
    輝常心閱讀 779評論 1 6
  • 參加工作坊學習,開啟了早睡早起模式。昨天11點睡早上6點也醒了。今天準備10點入睡,明天早起。瑜伽喚醒我們的身體讓...
    Redchen閱讀 260評論 0 0
  • 今天聽人說,那種喜歡到不行的感覺,突然感到,好心酸 。喜歡到不行的那種感覺是什么?或許就是,可以為了他,不給自己留...
    帥氣如吾閱讀 319評論 1 0