1. 程式人生 > >Sass、LESS 和 Stylus區別總結

Sass、LESS 和 Stylus區別總結

CSS 前處理器技術已經非常的成熟了,而且也湧現出了越來越多的 CSS 的前處理器框架。本文便總結下 Sass、Less CSS、Stylus這三個前處理器的區別和各自的基本語法。

1.什麼是 CSS 前處理器 CSS 前處理器是一種語言用來為 CSS 增加一些程式設計的的特性,無需考慮瀏覽器的相容性問題,例如你可以在 CSS 中使用變數、簡單的程式邏輯、函式等等在程式語言中的一些基本技巧,可以讓CSS 更見簡潔,適應性更強,程式碼更直觀等諸多好處。

2.基本語法區別: 在使用 CSS 前處理器之前最重要的是理解語法,幸運的是基本上大多數前處理器的語法跟 CSS 都差不多。

首先 Sass 和 Less 都使用的是標準的 CSS 語法,因此如果可以很方便的將已有的 CSS 程式碼轉為前處理器程式碼,預設 Sass 使用 .sass 副檔名,而 Less 使用 .less 副檔名。

/* style.scss or style.less */ h1 {   color: #0982C1; } 這是一個再普通不過的,不過 Sass 同時也支援老的語法,就是不包含花括號和分號的方式:

/* style.sass */ h1   color: #0982c1 而 Stylus 支援的語法要更多樣性一點,它預設使用 .styl 的副檔名,下面是 Stylus 支援的語法:

/* style.styl */ h1 {   color: #0982C1; }

/* omit brackets */ h1   color: #0982C1;

/* omit colons and semi-colons */ h1   color #0982C1 可以在同一個樣式單中使用不同的變數,例如下面的寫法也不會報錯:

h1 {   color #0982c1 } h2   font-size: 1.2em 3.變數 1. sass:

Sass讓人們受益的一個重要特性就是它為css引入了變數。你可以把反覆使用的css屬性值 定義成變數,然後通過變數名來引用它們,而無需重複書寫這一屬性值。

     sass變數必須是以$開頭的,然後變數和值之間使用冒號(:)隔開,和css屬性是一樣的,例如: 1 $maincolor : #092873; $siteWidth : 1024px; $borderStyle : dotted; body {   color: $maincolor;   border: 1px $borderStyle $mainColor;   max-width: $siteWidth; } 2.less css :

在less檔案中,當一個值需要反覆使用時,可以通過@符號定義變數。已經被賦值的變數以及其他的常量(如畫素、顏色等)都可以參與運算。

 Less css中變數都是用@開頭的,其餘與sass都是一樣的,例如: 1 @maincolor : #092873; @siteWidth : 1024px; @borderStyle : dotted; body {   color: @maincolor;   border: 1px @borderStyle @mainColor;   max-width: @siteWidth; } 3.stylus:

 stylus對變數是沒有任何設定的,可以是以$開頭,或者任何的字元,而且與變數之間可以用冒號,空格隔開,  但是在stylus中不能用@開頭,例如:     maincolor = #092873 siteWidth = 1024px borderStyle = dotted body    color maincolor   border 1px borderStyle mainColor   max-width siteWidth 以上三種寫法都如同一下這種css:

body {   color: #092873;   border: 1px dotted #092873;   max-width: 1024px; } 這樣做的好處也是顯而易見的,在修改多處相同顏色的時候,這時就只需要修改變數值即可。

4.巢狀 如果我們需要在CSS中相同的 parent 引用多個元素,這將是非常乏味的,你需要一遍又一遍地寫 parent。例如:

div {   margin: 10px; } div nav {   height: 25px; } div nav a {   color: #0982C1; } div nav a:hover {   text-decoration: underline; } 如果用 CSS 前處理器,就可以少寫很多單詞,而且父子節點關係一目瞭然,並且sass,Less,stylus都支援下面這樣的寫法,且都是相同的:

//scss style //-----------------------------------  nav {      ul {         margin: 0;         padding: 0;      }      li {         display: inline-block;      }      a {         display: block;         padding: 6px 12px;         text-decoration: none;      }  } //css style //-----------------------------------  nav ul {      margin: 0;      padding: 0;      list-style: none;  }  nav li {      display: inline-block;  }  nav a {      display: block;      padding: 6px 12px;      text-decoration: none;  } 這樣做是非常方便的,也很直觀。

5.運算子 在 CSS 前處理器中還是可以進行樣式的計算如下:

body {   margin: (14px/2);   top: 50px + 100px;   right: 80 * 10%; } 在sass,Less與stylus中都是可以這樣做的。

6.顏色函式 CSS 前處理器一般都會內建一些顏色處理函式用來對顏色值進行處理,例如加亮、變暗、顏色梯度等。

1.sass的顏色處理函式:

lighten($color, 10%);  darken($color, 10%);   saturate($color, 10%);    desaturate($color, 10%); grayscale($color);   complement($color);  invert($color);  mix($color1, $color2, 50%);  例項如下:

$color: #0982C1; h1 {   background: $color;   border: 3px solid darken($color, 50%); } 2.Less css顏色處理函式:

lighten(@color, 10%);  darken(@color, 10%);   saturate(@color, 10%);   desaturate(@color, 10%);  spin(@color, 10);  spin(@color, -10);  mix(@color1, @color2); 示例如下:

@color: #0982C1; h1 {   background: @color;   border: 3px solid darken(@color, 50%); } 3.Stylus顏色處理函式:

lighten(color, 10%);  darken(color, 10%);   saturate(color, 10%);   desaturate(color, 10%);  示例如下;

color = #0982C1  h1   background color   border 3px solid darken(color, 50%) 7.匯入 (Import) 很多 CSS 開發者對匯入的做法都不太感冒,因為它需要多次的 HTTP 請求。但是在 CSS 前處理器中的匯入操作則不同,它只是在語義上包含了不同的檔案,但最終結果是一個單一的 CSS 檔案,如果你是通過 @ import “file.css”; 匯入 CSS 檔案,那效果跟普通的 CSS 匯入一樣。

注意:匯入檔案中定義的混入、變數等資訊也將會被引入到主樣式檔案中,因此需要避免它們互相沖突。  例如:  1.css:

//1.css /* file.{type} */ body {   background: #000; } 2.XXX:

@ import "1.css"; @ import "file.{type}";

p {   background: #092873; } 最終生成的 CSS:

@ import "1.css"; body {   background: #000; } p {   background: #092873; } 8.繼承 當我們需要為多個元素定義相同樣式的時候,我們可以考慮使用繼承的做法.

1.sass:  sass可通過@extend來實現程式碼組合宣告,使程式碼更加優越簡潔。

.message {   border: 1px solid #ccc;   padding: 10px;   color: #333; } .success {   @extend .message;   border-color: green; } .error {   @extend .message;   border-color: red; } .warning {   @extend .message;   border-color: yellow; } 2.Less css:

但是在這方面 Less 表現的稍微弱一些,更像是混入寫法:

.message {   border: 1px solid #ccc;   padding: 10px;   color: #333; } .success {   .message;   border-color: green; } .error {   .message;   border-color: red; } .warning {   .message;   border-color: yellow; } 上面兩種寫法其最終呈現的css樣式都如下:

.message, .success, .error, .warning {   border: 1px solid #cccccc;   padding: 10px;   color: #333; } .success {   border-color: green; } .error {   border-color: red; } .warning {   border-color: yellow; } .message的樣式將會被插入到相應的你想要繼承的選擇器中,但需要注意的是優先順序的問題。

9.Mixins(混入) Mixins 有點像是函式或者是巨集,當某段 CSS 經常需要在多個元素中使用時,可以為這些共用的 CSS 定義一個 Mixin,然後只需要在需要引用這些 CSS 地方呼叫該 Mixin 即可。

1.Sass 的混入語法:

sass中可用mixin定義一些程式碼片段,且可傳引數,方便日後根據需求呼叫。比如說處理css3瀏覽器字首:

@mixin error($borderWidth: 2px) {   border: $borderWidth solid #F00;   color: #F00; } .generic-error {   padding: 20px;   margin: 4px;   @ include error(); //這裡呼叫預設 border: 2px solid #F00; } .login-error {   left: 12px;   position: absolute;   top: 20px;   @ include error(5px); //這裡呼叫 border:5px solid #F00; } 2.Less CSS 的混入語法:  less也支援帶引數的混合以及有預設引數值的混合,如下面的例子所示:

.error(@borderWidth: 2px) {   border: @borderWidth solid #F00;   color: #F00; } .generic-error {   padding: 20px;   margin: 4px;   .error(); //這裡呼叫預設 border: 2px solid #F00; } .login-error {   left: 12px;   position: absolute;   top: 20px;   .error(5px); //這裡呼叫 border:5px solid #F00; } 3.Stylus 的混入語法:

error(borderWidth= 2px) {   border: borderWidth solid #F00;   color: #F00; } .generic-error {   padding: 20px;   margin: 4px;   error();  } .login-error {   left: 12px;   position: absolute;   top: 20px;   error(5px);  } 他們最終呈現的效果都如下:

.generic-error {   padding: 20px;   margin: 4px;   border: 2px solid #f00;   color: #f00; } .login-error {   left: 12px;   position: absolute;   top: 20px;   border: 5px solid #f00;   color: #f00; } 10.3D文字 要生成具有 3D 效果的文字可以使用 text-shadows ,唯一的問題就是當要修改顏色的時候就非常的麻煩,而通過 mixin 和顏色函式可以很輕鬆的實現:

1.sass:

@mixin text3d($color) {   color: $color;   text-shadow: 1px 1px 0px darken($color, 5%),                2px 2px 0px darken($color, 10%),                3px 3px 0px darken($color, 15%),                4px 4px 0px darken($color, 20%),                4px 4px 2px #000; }

h1 {   font-size: 32pt;   @ include text3d(#0982c1); } 2.Less CSS:

.text3d(@color) {   color: @color;   text-shadow: 1px 1px 0px darken(@color, 5%),                2px 2px 0px darken(@color, 10%),                3px 3px 0px darken(@color, 15%),                4px 4px 0px darken(@color, 20%),                4px 4px 2px #000; }

span {   font-size: 32pt;   .text3d(#0982c1); } 3.Stylus:

text3d(color)   color: color   text-shadow: 1px 1px 0px darken(color, 5%),                 2px 2px 0px darken(color, 10%),                 3px 3px 0px darken(color, 15%),                 4px 4px 0px darken(color, 20%),                 4px 4px 2px #000 span   font-size: 32pt   text3d(#0982c1) 其生成的css最終的效果如下:

span {   font-size: 32pt;   color: #0982c1;   text-shadow: 1px 1px 0px #097bb7,                2px 2px 0px #0875ae,                3px 3px 0px #086fa4,                4px 4px 0px #07689a,                4px 4px 2px #000; } 11.列 (Columns) 使用數值操作和變數可以很方便的實現適應螢幕大小的佈局處理。  1.Sass:

$siteWidth: 1024px; $gutterWidth: 20px; $sidebarWidth: 300px; body {   margin: 0 auto;   width: $siteWidth; } .content {   float: left;   width: $siteWidth - ($sidebarWidth+$gutterWidth); } .sidebar {   float: left;   margin-left: $gutterWidth;   width: $sidebarWidth; } 2.Less CSS:

@siteWidth: 1024px; @gutterWidth: 20px; @sidebarWidth: 300px;

body {   margin: 0 auto;   width: @siteWidth; } .content {   float: left;   width: @siteWidth - (@[email protected]); } .sidebar {   float: left;   margin-left: @gutterWidth;   width: @sidebarWidth; } 3.Stylus:

siteWidth = 1024px; gutterWidth = 20px; sidebarWidth = 300px;

body {   margin: 0 auto;   width: siteWidth; } .content {   float: left;   width: siteWidth - (sidebarWidth+gutterWidth); } .sidebar {   float: left;   margin-left: gutterWidth;   width: sidebarWidth; } 其最終生成的css效果如下:

body {   margin: 0 auto;   width: 1024px; } .content {   float: left;   width: 704px; } .sidebar {   float: left;   margin-left: 20px;   width: 300px; } 12.高階語法 1.在sass中,還支援條件語句:

    @if可一個條件單獨使用,也可以和@else結合多條件使用 1 程式碼如下:

$lte7: true; $type: monster; .ib{     display:inline-block;     @if $lte7 {         *display:inline;         *zoom:1;     } } p {   @if $type == ocean {     color: blue;   } @else if $type == matador {     color: red;   } @else if $type == monster {     color: green;   } @else {     color: black;   } } 其最終的css程式碼如下:

.ib{     display:inline-block;     *display:inline;     *zoom:1; } p {   color: green;  } 2.除卻條件語句,sass還支援for迴圈:

for迴圈有兩種形式,分別為:

[email protected] $var from <start> through <end> [email protected] $var from <start> to <end>。 其中$i表示變數,start表示起始值,end表示結束值,這兩個的區別是關鍵字through表示包括end這個數,而to則不包括end這個數。

@for $i from 1 to 10 {   .border-#{$i} {     border: #{$i}px solid blue;   } } 同時也支援while迴圈:

$i: 6; @while $i > 0 {   .item-#{$i} { width: 2em * $i; }   $i: $i - 2; } 最後,同時支援each命令,作用與for類似:

$animal-list: puma, sea-slug, egret, salamander; @each $animal in $animal-list {   .#{$animal}-icon {     background-image: url('/images/#{$animal}.png');   } } 其css最終效果如下:

.puma-icon {   background-image: url('/images/puma.png');  } .sea-slug-icon {   background-image: url('/images/sea-slug.png');  } .egret-icon {   background-image: url('/images/egret.png');  } .salamander-icon {   background-image: url('/images/salamander.png');  } 以上就是sass,Less css與stylus的最顯著的區別。 ---------------------  作者:黛梨  來源:CSDN  原文:https://blog.csdn.net/pedrojuliet/article/details/72887490  版權宣告:本文為博主原創文章,轉載請附上博文連結!