Web

sassでスタイルシートを書く

コード記述のイメージsassは従来のcssと互換性のあるスタイルシート言語です。実際、cssファイルの拡張子をscssに変えただけでも立派なsassソースファイルであり、コンパイルをすることができます。なのでcssについての知識があればsassは簡単に覚えることができます。ここではその概要を説明します。
Web

cssルールのネスト

// css
.node-page .content h2.title {
  font-size: 2em;
}
.node-page .content strong {
  color: red;
}

cssでスタイルのルールを記述するには、タグを指定するためのセレクタを記述します。

同じようなセレクタの記述が何回も繰り返されて、うんざりしてしまいます。

// sass
.node-page {
  .content {
    h2.title {
      font-size: 2em;
    }
    strong {
      color: red;
    }
  }
}

しかしsassではセレクタをネストすることでスッキリと書くことができます。

このネスト構造は実際のタグの構造に一致していて、とてもわかりやすくなっています。また途中のクラス名が変更されたときなどでも、簡単に対応できることが分かるでしょう。

// sass
.node-page {
  border {
    style: solid;
    width: 1px;
    color: blue;
  }
}

また「margin-top」や「border-style」のようなプロパティ名もネストして書くことができます。

// css
.node-page {
  border-style: solid;
  border-width: 1px;
  border-color: bule;
}

このように展開されます。

ネストは必ずしなければならない、というものではありません。便利なのでついつい多用しがちですが、複雑なネストは混乱の元になりますし、場合によっては出力cssコードの肥大化にもつながりますので、ネストの濫用には注意が必要です。

実はsassには、ここで説明しているcss3互換のSCSS構文の他に、独自の「インデント構文」があります。
インデント構文の方は「中括弧を使わずにインデントでブロックを定義する」「セミコロンがない」「@includeの代わりに+を使う」など、簡略化された書き方ができます。
現在ではcss3に近いSCSS構文が主流のようですが、コードサンプルなどではSCSS構文で書かれたものも見受けられますので、注意してください。
 

@import "compass/css3"; // SCSS構文
.node-page .content {
  h2.title {
    font-size: 2em;
    @include inline-block;
  }
  strong {
    color: red;
  }
}
@import compass/css3 // インデント構文
.node-page .content
  h2.title
    font-size: 2em
    +inline-block
  strong
    color: red

変数

$main-container-width: 960px; // 変数を設定
.node-page .container {
  width: $main-container-width; // 変数を参照
}

sassではプログラミング言語のように変数を使うことができます。変数の書き方はcssのプロパティと同じですが、頭に「$」をつけることで区別します。

.text-column {
  width: $main-container-width / 3 - 20px;
}

変数は計算することができます。基本的な四則演算(+,-,*,/,%)の他、便利な関数が用意されています。ユーザがカスタム関数を定義することも可能です。

$main-text-color: #ff3b05; // 色
$first-border: solid 1px #red; // 値のリスト
.main-text {
  color: $main-text-color;
  border-bottom: $first-border;
}

変数には数値だけではなく、cssプロパティに指定できる値ならなんでも設定することができます。

いろいろな値が設定できる分、変数の演算規則は複雑で注意が必要です。たとえば「5px + 10%」のように不可能な演算をしようとすると、エラーが出てしまいます。

ミックスイン

sassには外部のライブラリを取り込む機能があります。これをミックスインと言います。自分で整理したミックスインや既存のミックスインを利用することで制作効率を大幅に上げることができます。特にcompassには多数のミックスインが含まれているので利用しない手はありません。
ミックインは通常「パーシャル」という別ファイルで定義されます。(同じファイルの中で定義することもできます。)パーシャルはファイル名の先頭にアンダースコア「_」をつけて区別されます。別のファイルにインポートされない限りコンパイルされませんので、スタイルシートを複数のパーシャルに分割整理しても、無駄なcssが生成されることはありません。
@import "compass/typography/lists/horizontal-list"
ul.list {
  @include horizontal-list;
}

ミックスインを取り込むには、まず必要なパーシャルをインポートし、次にミックスインをインクルードします。
この例ではul.listを水平方向に並ぶリストにしています。

@include horizontal-list(10px);

またミックスインには引数を指定することができます。
この例ではリストアイテム間のマージンを10pxにしています。

compassで用意されているミックスインの詳細については、以下のリンク先をご覧ください。

継承

ul.information-list {
  border: solid 1px #aaa;
  padding-top: 0.5em;
  padding-bottom: 0.5em;
}

ul.important-list {
  border: solid 1px #aaa;
  padding-top: 0.5em;
  padding-bottom: 0.5em;
  color: red;
}

ミックスインは「cssコードの一部を部品化して繰り返し使う」ための仕組みですが、同様の仕組みに「継承」があります。
ここで二種類のリストを考えてみましょう。ひとつは周囲をボーダーで囲って目立つようにした「information-list」、もうひとつは重要な情報を伝えるためのimportant-listで、information-listの文字を赤くしたものだとします。
このスタイルシートはたとえば次のようになります。
ふたつのスタイルは最後の行を除いて同じものですが、ふつうはこのように重複して書く必要があります。

ul.important-list {
  // ul.information-listを継承
  @extend ul.information-list;
  // 異なる部分を追加
  color: red;
}

ここで継承の仕組みを使うとimportant-listの方は次のようになります。@extendを使ってimportant-listの設定を「受け継ぎ」次に相違点をつけくわえています。important-listがinformation-listの特殊化バージョンであると考えれば、この記述は論理的にも納得のいくものと言えるでしょう。
注意しなければならないのは、継承は子孫にも影響すると言うことです。たとえばimformation-list li を定義したとすると、それはimportant-list liにも受け継がれます。継承は単なるコードのコピーではありませんので、単純にコードの共有をしたいのであればミックスインを使うなど、上手に使い分ける必要があります。

コメント

sassでは通常の/* */形式のコメント以外に、// 形式のコメントを使うことができます。// コメントはサイレントコメントともよばれ、コンパイルされたcssには出力されません。最終的なファイルサイズを気にすることなく、自由にドキュメントすることができます。逆にコピーライト表記などcssに残したいコメントは/* */を使うようにしてください。

その他のエントリー