關于sass(scss)、less、postcss、stylus等的用法與區別
一. Sass/Scss、Less、stylus是什么?
它們都是css預處理器。css預處理器的概念:CSS預處理器用一種專門的編程語言,進行Web頁面樣式設計,然后再編譯成正常的CSS文件,以供項目使用。CSS預處理器為CSS增加一些編程的特性,無需考慮瀏覽器的兼容性問題。 比如說:Sass(SCSS)、LESS、Stylus、Turbine、Swithch CSS、CSS Cacheer、DT CSS等。都屬于css預處理器。
其中比較優秀的: Sass、LESS,Stylus
Sass(Syntactically Awesome Stylesheets):
注:Sass官網地址
Sass是一種動態樣式語言,Sass語法屬于縮排語法,比css比多出好些功能(如變量、嵌套、運算,混入(Mixin)、繼承、顏色處理,函數等),更容易閱讀。
Sass與Scss是什么關系?
Sass的縮排語法,對于寫慣css前端的web開發者來說很不直觀,也不能將css代碼加入到Sass里面,因此sass語法進行了改良,Sass 3就變成了Scss(sassy css)。與原來的語法兼容,只是用{}取代了原來的縮進。
Less:
注: Less官方地址
Less也是一種動態樣式語言. 受Sass影響較大,對CSS賦予了動態語言的特性,如變量,繼承,運算, 函數. Less 既可以在客戶端上運行 (支持IE 6+, Webkit, Firefox),也可在服務端運行 (借助 Node.js)。
Stylus:
注: Stylus官方地址
2010年產生于node社區, 主要用來給Node項目進行CSS預處理支持,人氣不如前兩者
Stylus被稱為是一種革命性的新語言,提供一個高效、動態、和使用表達方式來生成CSS,以供瀏覽器使用。Stylus同時支持縮進和CSS常規樣式書寫規則。
需要安裝node
Stylus的語法花樣多一些,它的文件擴展名是“.styl”,Stylus也接受標準的CSS語法,但是他也像Sass老的語法規則,使用縮進控制,同時Stylus也接受不帶大括號({})和分號的語法
Stylus優點:
更加健壯
寫法更接近于js
功能強大
Stylus缺點:
寫法需要一定時間適應
學習曲線比較陡峭
二. Sass/Scss與Less、stylus區別
2.1 編譯環境不一樣
Sass的安裝需要Ruby環境,是在服務端處理的,而Less是需要引入less.js來處理Less代碼輸出css到瀏覽器,也可以在開發環節使用Less,然后編譯成css文件,直接放到項目中,也有 Less.app、SimpleLess、CodeKit.app這樣的工具,也有在線編譯地址。Stylus需要安裝node,然后安裝最新的stylus包即可使用
2.2 變量符不一樣
Less是@,而Scss是”符號開始。結尾的分號(;)可有可無,但變量名和變量值之間的等號(=)是需要的。有一點需要注意的是,如果我們使用“@”符號開頭來聲明變量,Stylus會進行編譯,但其對應的值并不會賦值給變量。換句話說,在Stylus中不要使用“@”符號開頭聲明變量。Stylus中調用變量的方法和LESS、Sass是完全相同的。
而且變量的作用域也是不一樣的
Less-作用域
@color: #00c; /* 藍色 */
#header {
@color: #c00; /* red */
border: 1px solid @color; /* 紅色邊框 */
}
#footer {
border: 1px solid @color; /* 藍色邊框 */
}
Less-作用域編譯后
#header{
border:1px solid #cc0000;
}
#footer{
border:1px solid #0000cc;
}
scss-作用域
$color: #00c; /* 藍色 */
#header {
$color: #c00; /* red */
border: 1px solid $color; /* 紅色邊框 */
}
#footer {
border: 1px solid $color; /* 藍色邊框 */
}
Sass-作用域編譯后
#header{
border:1px solid #c00
}
#footer{
border:1px solid #c00
}
/ *stylus聲明變量*/
mainColor = #963;
siteWidth = 1024px;
$borderStyle = dotted;
/*stylus調用變量*/ |
/*轉譯出來的CSS*/
body {
color mainColor | color: #963;
border 1px $borderStyle mainColor | border:1px dotted #963
max-width siteWidth | max-width:1024px;|
}復制代碼
我們可以看出來,less和scss、stylus中的變量會隨著作用域的變化而不一樣。Sass的作用域最差,less和stylus一樣,都是向上查找,直到找到根部位置
2.3 輸出設置
Less沒有輸出設置,Sass提供4中輸出選項:nested, compact, compressed 和 expanded,stylus不知。
輸出樣式的風格可以有四種選擇,默認為nested
nested:嵌套縮進的css代碼
expanded:展開的多行css代碼
compact:簡潔格式的css代碼
compressed:壓縮后的css代碼
2.4. 處理條件語句
Sass支持條件語句,可以使用if{}else{},for{}循環等等。 LESS的條件語句使用有些另類,他不是我們常見的關鍵詞if和else if之類,而其實現方式是利用關鍵詞“when”。stylus的條件語句的使用和其他編程的條件語句使用基本類似,不同的是他可以在樣式去省略大括號({}):
/* Sample Sass “if” statement */
@if lightness($color) > 30% {}
@else {}
/* Sample Sass “for” loop */
@for $i from 1 to 10 {
.border-#{$i} {
border: #{$i}px solid blue;
}
}
stylus中:
box(x, y, margin = false)padding y xif marginmargin y xbodybox(5px, 10px, true)
Stylus同樣可以和else if、else配套使用:
box(x, y, margin-only = false)if margin-onlymargin y xelsepadding y x復制代碼
sass中使用條件:
.mixin (@a) when (@a >= 10) {
background-color: black;
}
.mixin (@a) when (@a < 10) {
background-color: white;
}
.class1 {
.mixin(12)
}
.class2 {
.mixin(6)
}
復制代碼
轉譯后:
.class1 {
background-color: black;
}
.class2 {
background-color: white;
}復制代碼
2.5 引用外部CSS文件
scss引用的外部文件命名必須以_開頭, 如下例所示:其中_test1.scss、_test2.scss、test3.scss文件分別設置的h1 h2 h3。文件名如果以下劃線開頭的話,Sass會認為該文件是一個引用文件,不會將其編譯為css文件.
// 源代碼:
@import "_test1.scss";
@import "_test2.scss";
@import "_test3.scss";
// 編譯后:
h1 {
font-size: 17px;
}
h2 {
font-size: 17px;
}
h3 {
font-size: 17px;
}復制代碼
Less引用外部文件和css中的@import沒什么差異。
Stylus同樣可以用@import,也支持其他文件通過@import進行引入
2.6 Sass和Less的工具庫不同
Sass有工具庫Compass, 簡單說,Sass和Compass的關系有點像Javascript和jQuery的關系,Compass是Sass的工具庫。在它的基礎上,封裝了一系列有用的模塊和模板,補充強化了Sass的功能。
Less有UI組件庫Bootstrap,Bootstrap是web前端開發中一個比較有名的前端UI組件庫,Bootstrap的樣式文件部分源碼就是采用Less語法編寫。
Archer一個的英文面向移動端的的,基于stylus的樣式工具庫。
Archer于起源est項目,于專注純移動端的瀏覽器的樣式展示。如有本地桌面端的需求,請使用est。
三. 總結
不管是Sass,還是Less或者stylus,都可以視為一種基于CSS之上的高級語言,其目的是使得CSS開發更靈活和更強大,Sass、stylus的功能比Less強大,基本可以說是一種真正的編程語言了,Less則相對清晰明了,易于上手,對編譯環境要求比較寬松??紤]到編譯Sass要安裝Ruby,而Ruby官網在國內訪問不了,個人在實際開發中更傾向于選擇Less。
四、PostCSS
- PostCSS介紹:
A tool for transforming CSS with JavaScript
PostCSS 是目前流行的一個對 CSS 進行處理的工具(平臺)。PostCSS 依托其強大的插件體系為 CSS 處理增加了無窮的可能性。
PostCSS 本身是一個功能比較單一的工具。它提供了一種方式用 JavaScript 代碼來處理 CSS。它負責把 CSS 代碼解析成抽象語法樹結構(Abstract Syntax Tree,AST),再交由插件來進行處理。插件基于 CSS 代碼的 AST 所能進行的操作是多種多樣的,比如可以支持變量和混入(mixin),增加瀏覽器相關的聲明前綴,或是把使用將來的 CSS 規范的樣式規則轉譯(transpile)成當前的 CSS 規范支持的格式。從這個角度來說,PostCSS 的強大之處在于其不斷發展的插件體系。目前 PostCSS 已經有 200 多個功能各異的插件。開發人員也可以根據項目的需要,開發出自己的 PostCSS 插件。
PostCSS 從其誕生之時就帶來了社區對其類別劃分的爭議。這主要是由于其名稱中的 post,很容易讓人聯想到 PostCSS 是用來做 CSS 后處理(post-processor)的,從而與已有的 CSS 預處理(pre-processor)語言,如 SASS 和 LESS 等進行類比。實際上,PostCSS 的主要功能只有兩個:第一個就是前面提到的把 CSS 解析成 JavaScript 可以操作的 AST,第二個就是調用插件來處理 AST 并得到結果。因此,不能簡單的把 PostCSS 歸類成 CSS 預處理或后處理工具。PostCSS 所能執行的任務非常多,同時涵蓋了傳統意義上的預處理和后處理。PostCSS 是一個全新的工具,給前端開發人員帶來了不一樣的處理 CSS 的方式。
- PostCSS使用
PostCSS 一般不單獨使用,而是與已有的構建工具進行集成。PostCSS 與主流的構建工具,如 Webpack、Grunt 和 Gulp 都可以進行集成。完成集成之后,選擇滿足功能需求的 PostCSS 插件并進行配置。現在經常用到的是基于PostCSS的Autoprefixer插件,使用方式可以在官網的插件庫進行查詢。下面是官方插件庫地址:
-
PostCSS的優點
1.擴展性強 2.兼容性強 3.功能全面 4.有很多插件庫供選擇
- PostCSS的缺點
1.配置繁瑣 2.學習相對陡峭