CSS預處理器——SASS學習筆記(一)

什麼是CSS預處理器?

CSS 預處理器定義了一種新的語言,其基本思想是,用一種專門的編程語言,爲 CSS 增加了一些編程的特性,將 CSS 作爲目標生成文件,然後開發者就只需要使用

這種語言進行編碼工作。通俗的說,“CSS 預處理器用一種專門的編程語言,進行 Web 頁面樣式設計,然後再編譯成正常的 CSS 文件,以供項目使用。CSS 預處理

器爲 CSS 增加一些編程的特性,無需考慮瀏覽器的兼容性問題”,例如你可以在 CSS 中使用變量、簡單的邏輯程序、函數等等在編程語言中的一些基本特性,可以讓

你的 CSS 更加簡潔、適應性更強、可讀性更佳,更易於代碼的維護等諸多好處。

CSS 預處理器技術已經非常的成熟,而且也湧現出了很多種不同的CSS 預處理器語言,比如說:

  • Sass(SCSS)
  • LESS
  • Stylus
  • Turbine
  • Swithch CSS
  • CSS Cacheer

DT CSS如此之多的 CSS 預處理器,那麼“我應該選擇哪種 CSS 預處理器?”也相應成了最近網上的一大熱門話題,在 Linkedin、Twitter、CSS-Trick、知乎以及各大

技術論壇上,很多人爲此爭論不休。相比過去我們對是否應該使用 CSS 預處理器的話題而言,這已經是很大的進步了。到目前爲止,在衆多優秀的 CSS 預處理器語

言中就屬 Sass、LESS 和 Stylus 最優秀,討論的也多,對比的也多。就拿我目前學習的Sass來做個記錄吧。

什麼是Sass?

Sass 官網上是這樣描述 Sass 的:

Sass 是一門高於 CSS 的元語言,它能用來清晰地、結構化地描述文件樣式,有着比普通 CSS 更加強大的功能。
Sass 能夠提供更簡潔、更優雅的語法,同時提供多種功能來創建可維護和管理的樣式表。

Sass 前世今生:

Sass 是最早的 CSS 預處理語言,有比 LESS 更爲強大的功能,不過其一開始的縮進式語法(Sass 老版本語法,後面課程會詳細介紹 )並不能被大衆接受,不過由於其強大的功能和 Ruby on Rails 的大力推動,還是有很多開發者選擇了 Sass。Sass 是採用 Ruby 語言編寫的一款 CSS 預處理語言,它誕生於2007年,是最大的成熟的 CSS 預處理語言。最初它是爲了配合 HAML(一種縮進式 HTML 預編譯器)而設計的,因此有着和 HTML 一樣的縮進式風格。

爲什麼早期不如 LESS 普及?

雖然縮進式風格可以有效縮減代碼量,強制規範編碼風格,但它一方面並不爲大多數程序員接受,另一方面無法兼容已有的 CSS 代碼。這也是 Sass 雖然出現得最早,但遠不如 LESS 普及的原因。

sass和scss有什麼區別?

Sass 和 SCSS 其實是同一種東西,我們平時都稱之爲 Sass,兩者之間不同之處有以下兩點:

  1. 文件擴展名不同,Sass 是以“.sass”後綴爲擴展名,而 SCSS 是以“.scss”後綴爲擴展名
  2. 語法書寫方式不同,Sass 是以嚴格的縮進式語法規則來書寫,不帶大括號({})和分號(;),而 SCSS 的語法書寫和我們的 CSS 語法書寫方式非常類似。

先來看一個示例:

1. Sass 語法


$font-stack: Helvetica, sans-serif  //定義變量
$primary-color: #333 //定義變量

body
  font: 100% $font-stack
  color: $primary-color

2. 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寫法差別

Sass 和 CSS 寫法的確存在一定的差異,由於 Sass 是基於 Ruby 寫出來,所以其延續了 Ruby 的書寫規範。在書寫 Sass 時不帶有大括號和分號,其主要是依靠嚴格的縮進方式來控制的。如:

Sass寫法:

body
  color: #fff
  background: #f36

而在 CSS 我們是這樣書寫:

body{
  color:#fff;
  background:#f36;
}

SCSS 和 CSS 寫法無差別,這也是 Sass 後來越來越受大衆喜歡原因之一。簡單點說,把你現有的“.css”文件直接修改成“.scss”即可使用。

sass的安裝(windows版)

  • 在 Windows 平臺下安裝 Ruby 需要先有 Ruby 安裝包,可以到 Ruby 的官網(http://rubyinstaller.org/downloads)下載對應需要的 Ruby 版本。
  • Ruby 安裝文件下載好後,按步驟進行安裝 Ruby。在安裝過程中,個人建議將其安裝在 C 盤下,在安裝過程中選擇第二個選項:Add Ruby excutables to your PATH(不選中,就會出現編譯時找不到Ruby環境的情況)。
  • Ruby 安裝完成後,在開始菜單中找到新安裝的 Ruby,並啓動 Ruby 的 Command 控制面板。此時Ruby已安裝好了。
  • 安裝好 Ruby 之後,接下來就可以安裝 Sass 了。同樣的在windows下安裝 Sass 有多種方法。但這幾種方法都是非常的簡單,只需要在你的命令終端輸入一行命令即可。

在打開的Ruby 的 Command 控制面板命令終端,輸入下面的命令:

gem install sass

我們要如何確認自己是否安裝 Sass 成功了呢?其實很簡單,只需要通過下面的命令即可:

sass -v

如果在你的命令終端能看到類似這樣的信息就表示你的電腦安裝 Sass 已成功。也就是說可以正常的使用 Sass 了。

更新 Sass

維護 Sass 的團隊會不斷的爲 Sass 添加新的功能,那麼如何確保自己已安裝的 Sass 也具有這些新的功能特性呢?不會是卸載了重新安裝吧(雖然安裝也就是一個命令的事情)? 其實不需要這麼麻煩,只需要在命令終端執行:

gem update sass

這個時候你看到類似下面這樣的信息,表示你的 Sass 已更新到最新版本。

卸載刪除Sass

在常期使用的時候難免會碰到無法解決的問題,有時候可能需要卸載 Sass,然後再重新安裝 Sass。那麼怎麼卸載 Sass 呢?

其實他也就是一句命令的事情:

gem uninstall sass

這樣就卸載了 Sass ,但這行命令基本上是使用不上。

Sass 語法格式

這裏說的 Sass 語法是 Sass 的最初語法格式,他是通過 tab 鍵控制縮進的一種語法規則,而且這種縮進要求非常嚴格。另外其不帶有任何的分號和大括號。常常把這種格式稱爲 Sass 老版本,其文件名以“.sass”爲擴展名。來看一個 Sass 語法格式的簡單示例。假設我們有一段這樣的 CSS 代碼:

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 長得幾乎是一模一樣,代碼都包裹在一對大括號裏,並且末尾結束處都有一個分號。其文件名格式常常以“.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;
}


這樣的語法格式對於從事前端工作的同學來說更易於接受,這也是 SCSS 爲什麼更被前端人員青眯的原因。

不管是 Sass 的語法格式還是 SCSS 的語法格式,他們的功能都是一樣的,不同的是其書寫格式和文件擴展名不同,來看一個簡單的對比圖:


正因爲如此,有不少同學使用 Sass 新的語法規則,而文件擴展名依舊使用的是“.sass”,這也就造成血案了,編譯時說編譯不出來。在此特別提醒新同學:“.sass”只能使用 Sass 老語法規則(縮進規則),“.scss”使用的是 Sass 的新語法規則,也就是 SCSS 語法規則(類似 CSS 語法格式)。

sass編譯

常常有人會問,使用 Sass 進行開發,那麼是不是直接通過“<link>”引用“.scss”或“.sass”文件呢?

那麼這裏告訴大家,在項目中還是引用“.css”文件,Sass 只不過是做爲一個預處理工具,提前幫你做事情,只有你需要時候,他纔有攻效。

這樣一來,也就有了這章需要介紹的內容—— Sass 的編譯。因爲 Sass 開發之後,要讓 Web 頁面能調用 Sass 寫好的東西,就得有這麼一個過程,這個過程就稱之爲 Sass 編譯過程。Sass 的編譯有多種方法:

  • 命令編譯
  • GUI工具編譯
  • 自動化編譯

【sass】命令編譯

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

單文件編譯

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

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

多文件編譯

sass sass/:css/

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

缺點及解決方法

在實際編譯過程中,你會發現上面的命令,只能一次性編譯。每次個性保存“.scss”文件之後,都得重新執行一次這樣的命令。如此操作太麻煩,其實還有一種方法,就是在編譯 Sass 時,開啓“watch”功能,這樣只要你的代碼進行任保修改,都能自動監測到代碼的變化,並且給你直接編譯出來:

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

當然,使用 sass 命令編譯時,可以帶很多的參數:

watch 舉例:

來看一個簡單的示例,假設我本地有一個項目,我要把項目中“bootstrap.scss”編譯出“bootstrap.css”文件,並且將編譯出來的文件放在“css”文件夾中,我就可以在我的命令終端中執行:

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

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

【sass】GUI界面工具編譯

或許你會說,我一直討厭使用命令來做事情,我喜歡那種能看得到的界面操作。那麼你可以考慮使用 GUI 界面工具來對 Sass 進行編譯。當然不同的 GUI 工具操作方法略有不同。如果在此也一一對編譯的界面工具做詳細的介紹。我們可能需要寫一本書來介紹這些編譯工具的操作了。所以我們這裏做一下簡單介紹,對於 GUI 界面編譯工具,目前較爲流行的主要有:

  1. Koala (http://koala-app.com/)
  2. Compass.app(http://compass.kkbox.com/
  3. Scout(http://mhs.github.io/scout-app/
  4. CodeKit(https://incident57.com/codekit/index.html
  5. Prepros(https://prepros.io/

相比之下,我比較推薦使用以下兩個:

【sass】自動化編譯

喜歡自動化研究的同學,應該都知道 Grunt 和 Gulp 這兩個東東。如果您正在使用其中的任何一種,那麼你也可以通過他們來配置 Sass 的編譯。這裏僅列出兩個示例代碼(具體情況要根據您的項目環境來做一定的修改,不建議生搬硬套,容易發生命案,呵呵。

1、Grunt 配置 Sass 編譯的示例代碼

module.exports = function(grunt) {
    grunt.initConfig({
        pkg: grunt.file.readJSON('package.json'),
        sass: {
            dist: {
                files: {
                    'style/style.css' : 'sass/style.scss'
                }
            }
        },
        watch: {
            css: {
                files: '**/*.scss',
                tasks: ['sass']
            }
        }
    });
    grunt.loadNpmTasks('grunt-contrib-sass');
    grunt.loadNpmTasks('grunt-contrib-watch');
    grunt.registerTask('default',['watch']);
}

2、Gulp 配置 Sass 編譯的示例代碼

var gulp = require('gulp');
var sass = require('gulp-sass');

gulp.task('sass', function () {
    gulp.src('./scss/*.scss')
        .pipe(sass())
        .pipe(gulp.dest('./css'));
});

gulp.task('watch', function() {
    gulp.watch('scss/*.scss', ['sass']);
});

gulp.task('default', ['sass','watch']);

常見的編譯錯誤

在編譯 Sass 代碼時常常會碰到一些錯誤,讓編譯失敗。這樣的錯誤有系統造成的也有人爲造成的,但大部分都是人爲過失引起編譯失敗。

而最爲常見的一個錯誤就是字符編譯引起的。在Sass的編譯的過程中,是不支持“GBK”編碼的。所以在創建 Sass 文件時,就需要將文件編碼設置爲“utf-8”。

另外一個錯誤就是路徑中的中文字符引起的。建議在項目中文件命名或者文件目錄命名不要使用中文字符。而至於人爲失誤造成的編譯失敗,在編譯過程中都會有具體的說明,大家可以根據編譯器提供的錯誤信息進行對應的修改。

【sass】不同樣式風格的輸出方法

衆所周知,每個人編寫的 CSS 樣式風格都不一樣,有的喜歡將所有樣式代碼都寫在同一行,而有的喜歡將樣式分行書寫。在 Sass 中編譯出來的樣式風格也可以按不同的樣式風格顯示。其主要包括以下幾種樣式風格:

  1. 嵌套輸出方式 nested
  2. 展開輸出方式 expanded  
  3. 緊湊輸出方式 compact 
  4. 壓縮輸出方式 compressed

嵌套輸出方式 nested

nav {
  ul {
    margin: 0;
    padding: 0;
    list-style: none;
  }

  li { display: inline-block; }

  a {
    display: block;
    padding: 6px 12px;
    text-decoration: none;
  }
}

在編譯的時候帶上參數“ --style nested”:

sass --watch test.scss:test.css --style nested

編譯出來的 CSS 樣式風格:

nav ul {
  margin: 0;
  padding: 0;
  list-style: none; }
nav li {
  display: inline-block; }
nav a {
  display: block;
  padding: 6px 12px;
  text-decoration: none; }

如下圖所示:

展開輸出方式 expanded  

nav {
  ul {
    margin: 0;
    padding: 0;
    list-style: none;
  }

  li { display: inline-block; }

  a {
    display: block;
    padding: 6px 12px;
    text-decoration: none;
  }
}

在編譯的時候帶上參數“ --style expanded”:

sass --watch test.scss:test.css --style expanded

這個輸出的 CSS 樣式風格和 nested 類似,只是大括號在另起一行,同樣上面的代碼,編譯出來:

nav ul {
  margin: 0;
  padding: 0;
  list-style: none;
}
nav li {
  display: inline-block;
}
nav a {
  display: block;
  padding: 6px 12px;
  text-decoration: none;
}


緊湊輸出方式compact

nav {
  ul {
    margin: 0;
    padding: 0;
    list-style: none;
  }

  li { display: inline-block; }

  a {
    display: block;
    padding: 6px 12px;
    text-decoration: none;
  }
}

在編譯的時候帶上參數“ --style compact”:

sass --watch test.scss:test.css --style compact

該方式適合那些喜歡單行 CSS 樣式格式的朋友,編譯後的代碼如下:

nav ul { margin: 0; padding: 0; list-style: none; }
nav li { display: inline-block; }
nav a { display: block; padding: 6px 12px; text-decoration: none; }

壓縮輸出方式compressed

nav {
  ul {
    margin: 0;
    padding: 0;
    list-style: none;
  }

  li { display: inline-block; }

  a {
    display: block;
    padding: 6px 12px;
    text-decoration: none;
  }
}

在編譯的時候帶上參數“ --style compressed”:

sass --watch test.scss:test.css --style compressed

壓縮輸出方式會去掉標準的 Sass 和 CSS 註釋及空格。也就是壓縮好的 CSS 代碼樣式風格:

nav ul{margin:0;padding:0;list-style:none}nav li{display:inline-block}nav a{display:block;padding:6px 12px;text-decoration:none}

編譯出來的CSS樣式風格的選擇完全是個人喜好問題,可以根據自己喜歡的風格選擇參數。

一段時間之後,你實際上就不再需要寫 CSS 代碼了,只用寫 Sass 代碼。在這種情況下,你只需要設定輸出格式爲壓縮格式,知道輸出的 CSS 代碼可以直接使用即可。

【sass】的調試

Sass 調試一直以來都是一件頭痛的事情,使用 Sass 的同學都希望能在瀏覽器中直接調試 Sass 文件,能找到對應的行數。值得慶幸的是,現在實現並不是一件難事,只要你的瀏覽器支持“sourcemap”功能即可。早一點的版本,需要在編譯的時候添加“--sourcemap”  參數:

sass --watch --scss --sourcemap style.scss:style.css

在 Sass3.3 版本之上(我測試使用的版本是 3.4.7),不需要添加這個參數也可以:

sass --watch style.scss:style.css

在命令終端,你將看到一個信息:

>>> Change detected to: style.scss
  write style.css
  write style.css.map

這時你就可以像前面展示的 gif 圖一樣,調試你的 Sass 代碼。

sass基礎

[Sass]聲明變量

定義變量的語法:

在有些編程語言中(如JavaScript)聲明變量都是使用關鍵詞“var”開頭,但是在 Sass 不使用這個關鍵詞,而是使用大家都喜歡的美元符號“$”開頭。我想用一張圖來解釋,我一直堅信,一圖勝千言萬語:

上圖非常清楚告訴了大家,Sass 的變量包括三個部分:

  1. 聲明變量的符號“$”
  2. 變量名稱
  3. 賦予變量的值

來看一個簡單的示例,假設你的按鈕顏色可以給其聲明幾個變量:

$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;

如果值後面加上!default則表示默認值。

瞭解 Bootstrap 的 Sass 版本的同學,就一眼能看出,上面的示例代碼是 Bootstrap 定義 primarybutton 的顏色。

普通變量與默認變量

普通變量

定義之後可以在全局範圍內使用。

$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 的默認變量一般是用來設置默認值,然後根據需求來覆蓋的,覆蓋的方式也很簡單,只需要在默認變量之前重新聲明下變量即可。
 

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

編譯後的css代碼:

body{
    line-height:2;
}


可以看出現在編譯後的 line-height 爲 2,而不是我們默認的 1.5。默認變量的價值在進行組件化開發的時候會非常有用。

【sass】變量的調用

在 Sass 中聲明瞭變量之後,就可以在需要的地方調用變量。調用變量的方法也非常的簡單。

比如在定義了變量

$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 中調用,可以按下面的方式調用

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

【sass】局部變量和全局變量

Sass 中變量的作用域在過去幾年已經發生了一些改變。直到最近,規則集和其他範圍內聲明變量的作用域才默認爲本地。如果已經存在同名的全局變量,從 3.4 版本開始,Sass 已經可以正確處理作用域的概念,並通過創建一個新的局部變量來代替。

全局變量與局部變量

先來看一下代碼例子:

//SCSS
$color: orange !default;//定義全局變量(在選擇器、函數、混合宏...的外面定義的變量爲全局變量)
.block {
  color: $color;//調用全局變量
}
em {
  $color: red;//定義局部變量
  a {
    color: $color;//調用局部變量
  }
}
span {
  color: $color;//調用全局變量
}

css 的結果:

//CSS
.block {
  color: orange;
}
em a {
  color: red;
}
span {
  color: orange;
}

上面的示例演示可以得知,在元素內部定義的變量不會影響其他元素。如此可以簡單的理解成,全局變量就是定義在元素外面的變量,如下代碼:

$color:orange !default;

$color 就是一個全局變量,而定義在元素內部的變量,比如 $color:red; 是一個局部變量。

除此之外,Sass 現在還提供一個 !global 參數。!global 和 !default 對於定義變量都是很有幫助的。我們之後將會詳細介紹這兩個參數的使用以及其功能。

全局變量的影子

當在局部範圍(選擇器內、函數內、混合宏內...)聲明一個已經存在於全局範圍內的變量時,局部變量就成爲了全局變量的影子。基本上,局部變量只會在局部範圍內覆蓋全局變量。

上面例子中的 em 選擇器內的變量 $color 就是一個全局變量的影子。

//SCSS
$color: orange !default;//定義全局變量
.block {
  color: $color;//調用全局變量
}
em {
  $color: red;//定義局部變量(全局變量 $color 的影子)
  a {
    color: $color;//調用局部變量
  }
}

什麼時候聲明變量?

我的建議,創建變量只適用於感覺確有必要的情況下。不要爲了某些駭客行爲而聲明新變量,這絲毫沒有作用。只有滿足所有下述標準時方可創建新變量:

  1. 該值至少重複出現了兩次;
  2. 該值至少可能會被更新一次;
  3. 該值所有的表現都與變量有關(非巧合)。

基本上,沒有理由聲明一個永遠不需要更新或者只在單一地方使用變量。

【sass】嵌套

Sass 中還提供了選擇器嵌套功能,但這也並不意味着你在 Sass 中的嵌套是無節制的,因爲你嵌套的層級越深,編譯出來的 CSS 代碼的選擇器層級將越深,這往往是大家不願意看到的一點。這個特性現在正被衆多開發者濫用。

選擇器嵌套爲樣式表的作者提供了一個通過局部選擇器相互嵌套實現全局選擇的方法,Sass 的嵌套分爲三種:

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

選擇器嵌套

假設我們有一段這樣的結構:

<header>
<nav>
    <a href=“##”>Home</a>
    <a href=“##”>About</a>
    <a href=“##”>Blog</a>
</nav>
<header>

想選中 header 中的 a 標籤,在寫 CSS 會這樣寫:

nav a {
  color:red;
}

header nav a {
  color:green;
}

那麼在 Sass 中,就可以使用選擇器的嵌套來實現:

nav {
  a {
    color: red;

    header & {
      color:green;
    }
  }  
}

屬性嵌套

Sass 中還提供屬性嵌套,CSS 有一些屬性前綴相同,只是後綴不一樣,比如:border-top/border-right,與這個類似的還有 margin、padding、font 等屬性。假設你的樣式中用到了:

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

在 Sass 中我們可以這樣寫:

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

僞類嵌套

其實僞類嵌套和屬性嵌套非常類似,只不過他需要藉助`&`符號一起配合使用。我們就拿經典的“clearfix”爲例吧:

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

避免選擇器嵌套:

  • 選擇器嵌套最大的問題是將使最終的代碼難以閱讀。開發者需要花費巨大精力計算不同縮進級別下的選擇器具體的表現效果。
  • 選擇器越具體則聲明語句越冗長,而且對最近選擇器的引用(&)也越頻繁。在某些時候,出現混淆選擇器路徑和探索下一級選擇器的錯誤率很高,這非常不值得。

爲了防止此類情況,我們應該儘可能避免選擇器嵌套。然而,顯然只有少數情況適應這一措施。

【sass】混合宏

如果你的整個網站中有幾處小樣式類似,比如顏色,字體等,在 Sass 可以使用變量來統一處理,那麼這種選擇還是不錯的。但當你的樣式變得越來越複雜,需要重複使用大段的樣式時,使用變量就無法達到我們目了。這個時候 Sass 中的混合宏就會變得非常有意義。

聲明混合宏

不帶參數的混合宏:

在 Sass 中,使用“@mixin”來聲明一個混合宏。如:

@mixin border-radius{
    -webkit-border-radius: 5px;
    border-radius: 5px;
}

其中 @mixin 是用來聲明混合宏的關鍵詞,有點類似 CSS 中的 @media、@font-face 一樣。border-radius 是混合宏的名稱。大括號裏面是複用的樣式代碼。

帶參數的混合宏:

除了聲明一個不帶參數的混合宏之外,還可以在定義混合宏時帶有參數,如:

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

複雜的混合宏:

上面是一個簡單的定義混合宏的方法,當然, Sass 中的混合宏還提供更爲複雜的,你可以在大括號裏面寫上帶有邏輯關係,幫助更好的做你想做的事情,如:

@mixin box-shadow($shadow...) {
  @if length($shadow) >= 1 {
    @include prefixer(box-shadow, $shadow);
  } @else{
    $shadow:0 0 4px rgba(0,0,0,.3);
    @include prefixer(box-shadow, $shadow);
  }
}

這個 box-shadow 的混合宏,帶有多個參數,這個時候可以使用“ …”來替代。簡單的解釋一下,當 $shadow 的參數數量值大於或等於“ 1 ”時,表示有多個陰影值,反之調用默認的參數值“ 0 0 4px rgba(0,0,0,.3) ”。

調用混合宏

在 Sass 中通過 @mixin 關鍵詞聲明瞭一個混合宏,那麼在實際調用中,其匹配了一個關鍵詞“@include”來調用聲明好的混合宏。例如在你的樣式中定義了一個圓角的混合宏“border-radius”:

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

在一個按鈕中要調用定義好的混合宏“border-radius”,可以這樣使用:

button {
    @include border-radius;
}

這個時候編譯出來的 CSS:

button {
  -webkit-border-radius: 3px;
  border-radius: 3px;
}

【sass】混合宏的參數

Sass 的混合宏有一個強大的功能,可以傳參,那麼在 Sass 中傳參主要有以下幾種情形:

A) 傳一個不帶值的參數

在混合宏中,可以傳一個不帶任何值的參數,比如:

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

在混合宏“border-radius”中定義了一個不帶任何值的參數“$radius”。

在調用的時候可以給這個混合宏傳一個參數值:

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

這裏表示給混合宏傳遞了一個“border-radius”的值爲“3px”。

編譯出來的 CSS:

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

B)傳一個帶值的參數

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

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

在混合宏“border-radius”傳了一個參數“$radius”,而且給這個參數賦予了一個默認值“3px”。

在調用類似這樣的混合宏時,會多有一個機會,假設你的頁面中的圓角很多地方都是“3px”的圓角,那麼這個時候只需要調用默認的混合宏“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%;
}

C)傳多個參數

Sass 混合宏除了能傳一個參數之外,還可以傳多個參數,如:

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

在混合宏“center”就傳了多個參數。在實際調用和其調用其他混合宏是一樣的:

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

  有一個特別的參數“…”。當混合宏傳的參數過多之時,可以使用參數來替代,如:

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

編譯出來的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】混合宏的不足

混合宏在實際編碼中給我們帶來很多方便之處,特別是對於複用重複代碼塊。但其最大的不足之處是會生成冗餘的代碼塊。比如在不同的地方調用一個相同的混合宏時。如:

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

.box {
  @include border-radius;
  margin-bottom: 5px;
}

.btn {
  @include border-radius;
}

示例在“.box”和“.btn”中都調用了定義好的“border-radius”混合宏。先來看編譯出來的 CSS:

.box {
  -webkit-border-radius: 3px;
  border-radius: 3px;
  margin-bottom: 5px;
}

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

上例明顯可以看出,Sass 在調用相同的混合宏時,並不能智能的將相同的樣式代碼塊合併在一起。這也是 Sass 的混合宏最不足之處。

【sass】擴展/繼承

繼承對於瞭解 CSS 的同學來說一點都不陌生,先來看一張圖:

圖中代碼顯示“.col-sub .block li,.col-extra .block li” 繼承了 “.item-list ul li”選擇器的 “padding : 0;” 和 “ul li” 選擇器中的 “list-style : none outside none;”以及 * 選擇器中的 “box-sizing:inherit;”。

在 Sass 中也具有繼承一說,也是繼承類中的樣式代碼塊。在 Sass 中是通過關鍵詞 “@extend”來繼承已存在的類樣式塊,從而實現代碼的繼承。如下所示:

//SCSS
.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;
}

編譯出來之後:

//CSS
.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;
}

從示例代碼可以看出,在 Sass 中的繼承,可以繼承類樣式塊中所有樣式代碼,而且編譯出來的 CSS 會將選擇器合併在一起,形成組合選擇器:

.btn, .btn-primary, .btn-second {
  border: 1px solid #ccc;
  padding: 6px 10px;
  font-size: 14px;
}

【sass】佔位符——%placeholder

Sass 中的佔位符 %placeholder 功能是一個很強大,很實用的一個功能,這也是我非常喜歡的功能。他可以取代以前 CSS 中的基類造成的代碼冗餘的情形。因爲 %placeholder 聲明的代碼,如果不被 @extend 調用的話,不會產生任何代碼。來看一個演示:

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

這段代碼沒有被 @extend 調用,他並沒有產生任何代碼塊,只是靜靜的躺在你的某個 SCSS 文件中。只有通過 @extend 調用纔會產生代碼:

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

.btn {
  @extend %mt5;
  @extend %pt5;
}

.block {
  @extend %mt5;

  span {
    @extend %pt5;
  }
}

編譯出來的CSS

//CSS
.btn, .block {
  margin-top: 5px;
}

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

從編譯出來的 CSS 代碼可以看出,通過 @extend 調用的佔位符,編譯出來的代碼會將相同的代碼合併在一起。這也是我們希望看到的效果,也讓你的代碼變得更爲乾淨。

【sass】混合宏 vs 繼承 vs 佔位符

初學者都常常糾結於這個問題“什麼時候用混合宏,什麼時候用繼承,什麼時候使用佔位符?”其實他們各有各的優點與缺點,先來看看他們使用效果:

a) Sass 中的混合宏使用

@mixin mt($var){
    margin-top: $var;
}
.block{
    @include mt(5px);
    span{
        display: block;
        @include mt(5px);
    }
}
.header{
    color: orange;
    @include mt(5px);
    span{
        display: block;
        @include mt(5px);
    }
}

編譯出來的 CSS 見右側結果窗口。

總結:編譯出來的 CSS 清晰告訴了大家,他不會自動合併相同的樣式代碼,如果在樣式文件中調用同一個混合宏,會產生多個對應的樣式代碼,造成代碼的冗餘,這也是 CSSer 無法忍受的一件事情。不過他並不是一無事處,他可以傳參數。

個人建議:如果你的代碼塊中涉及到變量,建議使用混合宏來創建相同的代碼塊。

b) Sass 中繼承

同樣的,將上面代碼中的混合宏,使用類名來表示,然後通過繼承來調用:

.mt{
    margin-top: 5px;
}
.block{
    @extend .mt;
    span{
        display: block;
        @extend .mt;
    }
}
.header{
    color: #orange;
    @extend .mt;
    span{
        display: block;
        @extend .mt;
    }
}

總結:使用繼承後,編譯出來的 CSS 會將使用繼承的代碼塊合併到一起,通過組合選擇器的方式向大家展現,比如 .mt, .block, .block span, .header, .header span。這樣編譯出來的代碼相對於混合宏來說要乾淨的多,也是 CSSer 期望看到。但是他不能傳變量參數。

個人建議:如果你的代碼塊不需要專任何變量參數,而且有一個基類已在文件中存在,那麼建議使用 Sass 的繼承。

c) 佔位符

最後來看佔位符,將上面代碼中的基類 .mt 換成 Sass 的佔位符格式:

%mt{
    margin-top: 5px;
}
%block{
    display: block;
}
.block{
    @extend %mt;
    span{
        @extend %block;
        @extend %mt;
    }
}
.header{
    color: orange;
    @extend %mt;
    span{
        @extend %block;
        @extend %mt;
    }
}

總結:編譯出來的 CSS 代碼和使用繼承基本上是相同,只是不會在代碼中生成佔位符 mt 的選擇器。那麼佔位符和繼承的主要區別的,“佔位符是獨立定義,不調用的時候是不會在 CSS 中產生任何代碼;繼承是首先有一個基類存在,不管調用與不調用,基類的樣式都將會出現在編譯出來的 CSS 代碼中。”

來看一個表格:

【sass】插值#{}

使用 CSS 預處理器語言的一個主要原因是想使用 Sass 獲得一個更好的結構體系。比如說你想寫更乾淨的、高效的和麪向對象的 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 插值中一個簡單的實例。當你想設置屬性值的時候你可以使用字符串插入進來。另一個有用的用法是構建一個選擇器。可以這樣使用:

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

一旦你發現這一點,你就會想到超級酷的 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 中調用:

@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 代碼是可以運行的,因爲他給了我們力量,可以動態的插入 .class 和 %placeholder。當然他們不能接受像 mixin 這樣的參數,上面的代碼編譯出來的 CSS:

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

在 Sass 的社區正在積極討論插值的侷限性,誰又知道呢,也許我們很快將能夠使用這些技術也說不定呢。

【sass】註釋

註釋對於一名程序員來說,是極其重要,良好的註釋能幫助自己或者別人閱讀源碼。在 Sass 中註釋有兩種方式,我暫且將其命名爲:

1、類似 CSS 的註釋方式,使用 ”/* ”開頭,結屬使用 ”*/ ”
2、類似 JavaScript 的註釋方式,使用“//”

兩者區別,前者會在編譯出來的 CSS 顯示,後者在編譯出來的 CSS 中不會顯示,來看一個示例:

//定義一個佔位符

%mt5 {
  margin-top: 5px;
}

/*調用一個佔位符*/

.box {
  @extend %mt5;
}

編譯出來的CSS

.box {
  margin-top: 5px;
}

/*調用一個佔位符*/

【sass】數據類型

Sass 和 JavaScript 語言類似,也具有自己的數據類型,在 Sass 中包含以下幾種數據類型:

  •  數字: 如,1、 2、 13、 10px;
  •  字符串:有引號字符串或無引號字符串,如,"foo"、 'bar'、 baz;
  •  顏色:如,blue、 #04a3f9、 rgba(255,0,0,0.5);
  •  布爾型:如,true、 false;
  •  空值:如,null;
  •  值列表:用空格或者逗號分開,如,1.5em 1em 0 2em 、 Helvetica, Arial, sans-serif。

SassScript 也支持其他 CSS 屬性值(property value),比如 Unicode 範圍,或 !important 聲明。然而,Sass 不會特殊對待這些屬性值,一律視爲無引號字符串 (unquotedstrings)。

【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列表函數(Sass list functions)賦予了值列表更多功能:

  1. nth函數(nth function) 可以直接訪問值列表中的某一項;
  2. join函數(join function) 可以將多個值列表連結在一起;
  3. append函數(append function) 可以在值列表中添加值; 
  4. @each規則(@each rule) 則能夠給值列表中的每個項目添加樣式。

值列表中可以再包含值列表,比如 1px 2px, 5px 6px 是包含 1px 2px 與 5px 6px 兩個值列表的值列表。如果內外兩層值列表使用相同的分隔方式,要用圓括號包裹內層,所以也可以寫成 (1px 2px) (5px 6px)。當值列表被編譯爲 CSS 時,Sass 不會添加任何圓括號,因爲 CSS 不允許這樣做。(1px 2px) (5px 6px)與 1px 2px 5px 6px 在編譯後的 CSS 文件中是一樣的,但是它們在 Sass 文件中卻有不同的意義,前者是包含兩個值列表的值列表,而後者是包含四個值的值列表。

可以用 () 表示空的列表,這樣不可以直接編譯成 CSS,比如編譯 font-family: ()時,Sass 將會報錯。如果值列表中包含空的值列表或空值,編譯時將清除空值,比如 1px 2px () 3px 或 1px 2px null 3px。

sass運算

【sass運算】加法

程序中的運算是常見的一件事情,但在 CSS 中能做運算的,到目前爲止僅有 calc() 函數可行。但在 Sass 中,運算只是其基本特性之一。在 Sass 中可以做各種數學計算,在接下來的章節中,主要和大家一起探討有關於 Sass 中的數學運算。

加法運算是 Sass 中運算中的一種,在變量或屬性中都可以做加法運算。如:

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

編譯出來的 CSS:

.box {
  width: 788px;
}

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

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

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

【sass運算】減法

Sass 的減法運算和加法運算類似,我們通過一個簡單的示例來做闡述:

$full-width: 960px;
$sidebar-width: 200px;

.content {
  width: $full-width -  $sidebar-width;
}

編譯出來的 CSS 如下:

.content {
  width: 760px;
}

同樣的,運算時碰到不同類型的單位時,編譯也會報錯,如:

$full-width: 960px;

.content {
  width: $full-width -  1em;
}

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

【sass運算】乘法

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

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

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

如果進行乘法運算時,兩個值單位相同時,只需要爲一個數值提供單位即可。上面的示例可以修改成:

.box {
  width: 10px * 2;
}

編譯出來的 CSS:

.box {
  width: 20px;
}

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

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

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

【sass運算】除法

Sass 的乘法運算規則也適用於除法運算。不過除法運算還有一個特殊之處。衆所周知“/”符號在 CSS 中已做爲一種符號使用。因此在 Sass 中做除法運算時,直接使用“/”符號做爲除號時,將不會生效,編譯時既得不到我們需要的效果,也不會報錯。一起先來看一個簡單的示例:

.box {
  width: 100px / 2;  
}

編譯出來的 CSS 如下:

.box {
  width: 100px / 2;
}

這樣的結果對於大家來說沒有任何意義。要修正這個問題,只需要給運算的外面添加一個小括號( )即可:

.box {
  width: (100px / 2);  
}

編譯出來的 CSS 如下:

.box {
  width: 50px;
}

除了上面情況帶有小括號,“/”符號會當作除法運算符之外,如果“/”符號在已有的數學表達式中時,也會被認作除法符號。如下面示例:

.box {
  width: 100px / 2 + 2in;  
}

編譯出來的CSS:

.box {
  width: 242px;
}

另外,在 Sass 除法運算中,當用變量進行除法運算時,“/”符號也會自動被識別成除法,如下例所示:

$width: 1000px;
$nums: 10;

.item {
  width: $width / 10;  
}

.list {
  width: $width / $nums;
}

編譯出來的CSS:

.item {
  width: 100px;
}

.list {
  width: 100px;
}

綜合上述,”/  ”符號被當作除法運算符時有以下幾種情況:

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

如下所示:

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

編譯出來的CSS

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

Sass 的除法運算還有一個情況。我們先回憶一下,在乘法運算時,如果兩個值帶有相同單位時,做乘法運算時,出來的結果並不是我們需要的結果。但在除法運算時,如果兩個值帶有相同的單位值時,除法運算之後會得到一個不帶單位的數值。如下所示:

.box {
  width: (1000px / 100px);
}

編譯出來的CSS如下:

.box {
  width: 10;
}

【sass運算】變量計算

在 Sass 中除了可以使用數值進行運算之外,還可以使用變量進行計算,其實在前面章節的示例中也或多或少的向大家展示了。在 Sass 中使用變量進行計算,這使得 Sass 的數學運算功能變得更加實用。一起來看一個簡單的示例:

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

【sass運算】數字運算

在 Sass 運算中數字運算是較爲常見的,數字運算包括前面介紹的:加法、減法、乘法和除法等運算。而且還可以通過括號來修改他們的運算先後順序。和我們數學運算是一樣的,一起來看個示例。

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

編譯出來的 CSS:

.box {
  width: 60px;
}

上面這個簡單示例是一個典型的計算 Grid 單列列寬的運算。

【sass運算】顏色運算

所有算數運算都支持顏色值,並且是分段運算的。也就是說,紅、綠和藍各顏色分段單獨進行運算。如:

p {
  color: #010203 + #040506;
}

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

如此編譯出來的 CSS 爲:

p {
  color: #050709;
}

算數運算也能將數字和顏色值 一起運算,同樣也是分段運算的。如:

p {
  color: #010203 * 2;
}

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

p {
  color: #020406;
}

【sass運算】字符運算

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

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

編譯出來的CSS:

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

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

div {
  cursor: e + -resize;
}

編譯出來的CSS:

div {
  cursor: e-resize;
}

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

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

編譯出來的 CSS:

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






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章