Compass用法指南

阮一峰發表於2012-11-29

幾個月前,我介紹了Sass的用法。

Sass是一種"CSS前處理器",可以讓CSS的開發變得簡單和可維護。但是,只有搭配Compass,它才能顯出真正的威力。

本文介紹Compass的用法。毫不誇張地說,學會了Compass,你的CSS開發效率會上一個臺階。

Compass用法指南

本文假設你已經掌握了CSS的主要用法,如果你還懂Sass,那就更好了。但是不懂Sass,一樣可以閱讀本文。

一、Compass是什麼?

簡單說,Compass是Sass的工具庫(toolkit)。

Sass本身只是一個編譯器,Compass在它的基礎上,封裝了一系列有用的模組和模板,補充Sass的功能。它們之間的關係,有點像Javascript和jQuery、Ruby和Rails、python和Django的關係。

二、安裝

Compass是用Ruby語言開發的,所以安裝它之前,必須安裝Ruby。

假定你的機器(Linux或OS X)已經安裝好Ruby,那麼在命令列模式下鍵入:

  sudo gem install compass

如果你用的是Windows系統,那麼要省略前面的sudo。

正常情況下,Compass(連同Sass)就安裝好了。

三、專案初始化

接下來,要建立一個你的Compass專案,假定它的名字叫做myproject,那麼在命令列鍵入:

  compass create myproject

當前目錄中就會生成一個myproject子目錄。

進入該目錄:

  cd myproject

你會看到,裡面有一個config.rb檔案,這是你的專案的配置檔案。還有兩個子目錄sass和stylesheets,前者存放Sass原始檔,後者存放編譯後的css檔案。

Compass用法指南

接下來,就可以動手寫程式碼了。

四、編譯

在寫程式碼之前,我們還要知道如何編譯。因為我們寫出來的是字尾名為scss的檔案,只有編譯成css檔案,才能用在網站上。

Compass的編譯命令是

  compass compile

該命令在專案根目錄下執行,會將sass子目錄中的scss檔案,編譯成css檔案,儲存在stylesheets子目錄中。

預設狀態下,編譯出來的css檔案帶有大量的註釋。但是,生產環境需要壓縮後的css檔案,這時要使用--output-style引數。

  compass compile --output-style compressed

Compass只編譯發生變動的檔案,如果你要重新編譯未變動的檔案,需要使用--force引數。

  compass compile --force

除了使用命令列引數,還可以在配置檔案config.rb中指定編譯模式。

  output_style = :expanded

:expanded模式表示編譯後保留原格式,其他值還包括:nested、:compact和:compressed。進入生產階段後,就要改為:compressed模式。

  output_style = :compressed

也可以透過指定environment的值(:production或者:development),智慧判斷編譯模式。

  environment = :development

  output_style = (environment == :production) ? :compressed : :expanded

在命令列模式下,除了一次性編譯命令,compass還有自動編譯命令

  compass watch

執行該命令後,只要scss檔案發生變化,就會被自動編譯成css檔案。

更多的compass命令列用法,請參考官方文件

五、Compass的模組

Compass採用模組結構,不同模組提供不同的功能。目前,它內建五個模組:

  * reset
  * css3
  * layout
  * typography
  * utilities

下面,我依次介紹這五個內建模組。它們提供Compass的主要功能,但是除了它們,你還可以自行載入網上的第三方模組,或者自己動手編寫模組。

六、reset模組

通常,編寫自己的樣式之前,有必要重置瀏覽器的預設樣式。

寫法是

  @import "compass/reset";

上面的@import命令,用來指定載入模組,這裡就是載入reset模組。編譯後,會生成相應的css reset程式碼

七、CSS3模組

目前,該模組提供19種CSS3命令。在這裡,我介紹其中的三種:圓角、透明和行內區塊。

7.1 圓角

圓角(border-radius)的寫法是

  @import "compass/css3";

  .rounded {
    @include border-radius(5px);
  }

上面的@include命令,表示呼叫某個mixin(類似於C語言的宏),5px是引數,這裡用來指定圓角的半徑。

編譯後的程式碼為

  .rounded {
    -moz-border-radius: 5px;
    -webkit-border-radius: 5px;
    -o-border-radius: 5px;
    -ms-border-radius: 5px;
    -khtml-border-radius: 5px;
    border-radius: 5px;
  }

如果只需要左上角為圓角,寫法為

  @include border-corner-radius(top, left, 5px);

7.2 透明

透明(opacity)的寫法為

  @import "compass/css3";

  #opacity {
    @include opacity(0.5);
  }

編譯後生成

  #opacity {
    filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0.5);
    opacity: 0.5;
  }

opacity的引數0.5,表示透明度為50%。

完全透明的寫法是

  @include opacity(0);

完全不透明則是

  @include opacity(1);

7.3 行內區塊

行內區塊(inline-block)的寫法為

  @import "compass/css3";

  #inline-block {
    @include inline-block;
  }

編譯後生成

  #inline-block {
    display: -moz-inline-stack;
    display: inline-block;
    vertical-align: middle;
    *vertical-align: auto;
    zoom: 1;
    *display: inline;
  }

八、layout模組

該模組提供佈局功能。

比如,指定頁面的footer部分總是出現在瀏覽器最底端:

  @import "compass/layout";

  #footer {
    @include sticky-footer(54px);
  }

又比如,指定子元素佔滿父元素的空間:

  @import "compass/layout";

  #stretch-full {
    @include stretch;
  }

九、typography模組

該模組提供版式功能。

比如,指定連結顏色的mixin為:

  link-colors($normal, $hover, $active, $visited, $focus);

使用時寫成:

  @import "compass/typography";

  a {
    @include link-colors(#00c, #0cc, #c0c, #ccc, #cc0);
  }

十、utilities模組

該模組提供某些不屬於其他模組的功能。

比如,清除浮動

  import "compass/utilities/";

  .clearfix {
    @include clearfix;
  }

再比如,表格

  @import "compass/utilities";

  table {
    @include table-scaffolding;
  }

編譯後生成

  table th {
    text-align: center;
    font-weight: bold;
  }

  table td,
  table th {
    padding: 2px;
  }

  table td.numeric,
  table th.numeric {
    text-align: right;
  }

十一、Helper函式

除了模組,Compass還提供一系列函式

有些函式非常有用,比如image-width()image-height()返回圖片的寬和高。

再比如,inline-image()可以將圖片轉為data協議的資料。

  @import "compass";

  .icon { background-image: inline-image("icon.png");}


編譯後得到

  .icon { background-image: url('data:image/png;base64,iBROR...QmCC');}

函式與mixin的主要區別是,不需要使用@include命令,可以直接呼叫。

(完)