sassでスタイルシートを書く
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%」のように不可能な演算をしようとすると、エラーが出てしまいます。
ミックスイン
ミックインは通常「パーシャル」という別ファイルで定義されます。(同じファイルの中で定義することもできます。)パーシャルはファイル名の先頭にアンダースコア「_」をつけて区別されます。別のファイルにインポートされない限りコンパイルされませんので、スタイルシートを複数のパーシャルに分割整理しても、無駄な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に残したいコメントは/* */を使うようにしてください。