セレクタのネスト(入れ子)
セレクタを入れ子にすることができます。
例えばboxというクラスの子要素としてspan1、span2を定義した場合、普通のCSSだと下記のようになります。
.box { background-color: gray; } .box .span1 { color: red; } .box .span2 { color: blue; }
これをSCSSだと下記のように書くことができるので、可読性とメンテナンス性を向上させることができます。
.box{ background-color: gray; .span1{ color: red; } .span2{ color: blue; } }
& セレクタ
& を使ってブロックの親セレクタを参照することができます。
例えば下記のa.btnクラスのHOVERを設定したい場合、セレクタを a.btn:hover とする代わりに &:hover と省略できます。
a.btn{ border-radius: 5px; background-color: gray; &:hover{ color: red; } }
出力結果は下記のようになります。
a.btn { border-radius: 5px; background-color: gray; } a.btn:hover { color: red; }
次のように親セレクタ名をプレフィックスに使うこともできます。
#main { background-color: gray; &-sidebar { color: red; } }
出力結果は下記のようになります。
#main { background-color: gray; } #main-sidebar { color: red; }
@extend - セレクタを継承する
@extend は指定したセレクタのスタイルを継承することができます。
たとえばp1というクラスのスタイルを継承したい場合、下記のように記載できます。
.p1{ background-color: gray; } .p2{ @extend .p1; // .p1のスタイルを継承 border: 1px solid black; // 追加のスタイルを記載できます }
出力結果は下記のようになります。
.p1, .p2 { background-color: gray; } .p2 { border: 1px solid black; }
継承元がネストしている場合、そのネストしている内容も継承されます。
.box1{ color: black; .p1{ background-color: gray; } } .box2{ @extend .box1; // .p1のスタイルを継承 border: 1px solid black; // 追加のスタイルを記載できます }
出力結果は下記のようになります。
.box1, .box2 { color: black; } .box1 .p1, .box2 .p1, .box1 .p2, .box2 .p2 { background-color: gray; } .box2 { border: 1px solid black; }
% プレースホルダーセレクタ
% プレースホルダ―セレクタを使って@extendすると、そのセレクタ自体は出力せず、スタイルのみ継承することができます。
%box { margin: 10px; padding: 10px; } .box1 { @extend %box; color: red; } .box2 { @extend %box; color: blue; }
出力結果は下記のようになります。
.box1, .box2 { margin: 10px; padding: 10px; } .box1 { color: red; } .box2 { color: blue; }
コメント
Sassには、通常のコメント /**/ 以外に、1行コメント用の // が用意されています。
//の1行コメントで記述すると、コンパイルされたCSSファイルにコメントが出力されません。
.box { // CSSにコメントは出力されません /* CSSにコメントが出力されます */ background: gray; }
出力結果は下記のようになります。
.box { /* CSSにコメントが出力されます */ background: gray; }
変数
Sassでは変数が使えます。
変数は下記のようにドル記号の後に変数名、値を指定します。
$変数名: 値;
例えば横幅の変数を作成し、利用する場合は下記のようになります。
$width: 5em; #main { width: $width; }
出力結果は下記のようになります。
#main { width: 5em; }
値にはCSSで使える単位すべてを指定できます。
$width : 10px; $width : 10%; $width : 10; $color : red; $margin: 10px auto;
次のように四則計算も可能です。
$width:400px; a{ width: $width + 10px; }
用意されている演算子には以下のようなものがあります。
+ | 加算 |
---|---|
- | 減算 |
* | 乗算 |
/ | 除算 |
% | 余り |
除算(/)はCSSでも使われているため、そのままだと四則計算として扱われないケースがあります。
変数や関数と一緒に使われていたり、括弧で囲まれていると演算子として使われるようになります。
p { $width: 1000px; font: 10px/8px; // 変数無しでこの書き方だと計算されない font: (italic bold 10px/8px); // 括弧で囲うと計算される width: $width/2; // 変数と数値は計算される height: (500px/2); // 括弧で囲うと計算される margin: round(1.5)/2; // 関数が使われている場合は計算される }
出力結果は下記のようになります。
p { font: 10px/8px; font: italic bold 1.25; width: 500px; height: 250px; margin: 1; }
インターポレーション
変数は演算できない箇所では使えないため、例えば下記の場合、エラーになります。
$img_path:'/img'; .bg{ background-image: url($img_path/bg.png); }
そのような場合は変数を#{}で囲むことでエラーを回避することができます。
$img_path:'/img'; .bg{ background-image: url(#{$img_path}/bg.png); }
出力結果は下記のようになります。
.bg { background-image: url("/img/bg.png"); }
変数をクラス名として使いたい場合も有用です。
$v: class_name; .#{$v} { color : blue; }
CSSファイルのインポート
SCSSファイルはCSSと同様に外部ファイルをインポートすることができます。
CSSのインポートと違い、コンパイル時にインポート先の中身をインポート元に挿入して出力します。
@import "base.scss"; @import "foo.css";
CSSの@importはパラレルにファイルを読み込むことができないのでパフォーマンス的に問題がありますが、SCSSの@importは1つのファイルにまとめるので、パフォーマンス上の問題はありません。
パーシャル
Sassファイルをコンパイルしたくない場合、Sassファイルの頭に、_(アンダースコア)をつけると出力されなくなります。
下記ファイル名のSASSファイルはCSSにコンパイルされません。
_base.scss
コンパイルするSassファイルに、パーシャルなファイルをインポートする際は_(アンダースコア)を省略し下記のように記載できます。
@import "base.scss";
このように部分的に利用されることをパーシャルと言います。
配列
変数機能を使って配列を扱うこともできます。
配列を作成するには下記のように値をカンマ区切りで指定します。
$変数名: 値, 値, 値;
配列と後ほど説明する each を使って複数の背景画像URLを指定する方法を紹介します。
$array_img: img1, img2, img3; //配列 @each $f_name in $array_img { div.#{$f_name} { background-image: url(#{$f_name}.png); } }
出力結果は下記のようになります。
div.img1 { background-image: url(img1.png); } div.img2 { background-image: url(img2.png); } div.img3 { background-image: url(img3.png); }
Mixin
Mixinはスタイルのテンプレートを実現する機能です。
例えば下記のように@mixinを使ってスタイルを定義し、@includeでそのスタイルを呼び出すことができます。
@mixin round-btn{ border-radius: 5px; background-color: gray; } .btn-blue{ @include round-btn; // round-btnのスタイルをインクルードします color: blue; }
出力結果は下記のようになります。
.btn-blue { border-radius: 5px; background-color: gray; color: blue; }
引数を使う
@include で呼び出すときに括弧内()に引数を指定することができます。
引数を複数指定する際はカンマ( , )で区切ります。 @include で呼び出す際に括弧内に値を指定すると、その値が引数として引き渡されます。
@mixin auto-color($color, $bg_color){ color: $color; background-color: $bg_color; } .btn-red{ @include auto-color(red,gray); }
出力結果は下記のようになります。
.btn-red { color: red; background-color: gray; }
デフォルトの値を設定する
引数のデフォルトの値を設定することもできます。
デフォルト値を指定しておくと、@include に引数を指定しなかった際にデフォルトの値が使われます。
@mixin auto-color($color:black, $bg_color:gray){ color: $color; background-color: $bg_color; } .btn-red{ @include auto-color(); // 引数無しで呼び出す }
出力結果は下記のようになります。
.btn-red { color: black; background-color: gray; }
@if - 条件分岐
@if を使って条件分岐を行うことができます。
@if文は、カッコの中の条件式を評価し、式が真のときだけ @if ブロックの命令文を実行します。
@if 条件1{ 処理 } @else if 条件2 { 処理 } @else { 処理 }
変数 $type の値によって処理を実行するには次のようにします。
$type : true; a{ @if $type == true { color: red; } }
$typeの値が TRUE の時だけ color 属性に値が指定されます。
FALSE の際は何も出力されません。
複数の条件を並べたいときは、論理演算子の and もしくは or を使います。
$type1 : true; $type2 : true a{ @if $type1 == true and $type2 == true { color: red; } }
@if 文で複数の条件分岐を処理する
@if 文は複数の条件分岐にも使えます。@if の条件式が FALSEであった場合、さらにほかの条件式をためしたいときは、@else if 文を使います。どの条件式も FALSE だった場合は、@else 文を使って例外処理を行うことができます。@else はどの条件式も FALSE だったときのみ実行されます。
$type : a; a{ @if $type == a { color: red; } @else if $type == b { color: blue; } @else { color: white; } }
ここまでにでてきた == や != は比較演算子、and や or は論理演算子と呼びます。
比較演算子
比較演算子は左引数と右引数を比較し、その結果を論理値で返します。
演算子 | 比較 | 結果 |
---|---|---|
== | 等しい | 左引数と右引数が等しければ真を返す。 |
!= | 等しくない | 左引数と右引数が等しくなければ真を返す。 |
> | 大きい | 左引数が右引数より大きければ真を返す。 |
< | 小さい | 左引数が右引数より小さければ真を返す。 |
>= | 以上 | 左引数が右引数と同じか大きければ真を返す。 |
<= | 以下 | 左引数が右引数と同じか小さければ真を返す。 |
論理演算子
論理演算しは「AとBが真ならば・・・」、「A、もしくはBのどちらかが真ならば・・・」など、式の真偽値を左から順に解釈していきます。
演算子 | 論理 | 例 | 結果 |
---|---|---|---|
and | 論理積 | $a and $b | $a と $b が真ならTRUEを返す |
or | 論理和 | $a or $b | $a もしくは $b が真ならTRUEを返す |
not | 否定 | not $a | $aが真でなければTRUEを返す |
@for - 繰り返し構文
@for文は条件式の中で何回ループするかを明示的に指定してブロックを実行します。
@forの構文には種類が2つあり、指定した値まで繰り返す through と、指定した値未満まで繰り返す to が用意されています。
through:指定の値を繰り返す
@for 値を受け取る変数 from 開始値 through 終了値{ 処理 }
to:指定した値未満なら繰り返す
@for 値を受け取る変数 from 開始値 to 終了値{ 処理 }
throughを使った場合は下記のように記述します。
// 指定の値を繰り返す @for $i from 1 through 3 { .item-#{$i} { width: 2em * $i; } }
@for は開始値を繰り返すたびに +1 し、その値を「値を受け取る変数」に代入します。
そのため、$iには開始値の 1 から始まり、処理が繰り返されるたびに +1 された値が代入されます。through を使った @for の場合は、1から3までの値が代入されることになります。
出力結果は下記のようになります。
.item-1 { width: 2em; } .item-2 { width: 4em; } .item-3 { width: 6em; }
toにした場合、条件などすべてthroughと同じでも、出力される回数が違います。
// 指定した値未満を繰り返す @for $i from 1 to 3 { .item-#{$i} { width: 2em * $i; } }
出力結果は下記のようになります。
.item-1 { width: 2em; } .item-2 { width: 4em; }
@while - 繰り返し構文
@while 文は、条件式が真を返す限りブロック内を実行します。
@while 条件式{ 処理 }
@whileを使った例は下記のとおりです。
$i: 6; @while $i > 0 { .item-#{$i} { width: 2em * $i; } $i: $i - 2; }
$iには6が代入されていますが、@whileブロック内で-2しています。そのため処理が繰り返されるたびに $i の値は 6、4、2、0、-2・・・と減っていきますが、条件式で $i は0以上としていますので、$i の値が2の時まで繰り返されることになります。
よって、出力結果は下記のようになります。
.item-6 { width: 12em; } .item-4 { width: 8em; } .item-2 { width: 4em; }
@each - 繰り返し構文
@each は配列の要素に対して繰り返しの処理を行います。
@each 値を受け取る変数 in リスト{ 処理 }
次の例では、@eachに渡す配列 $colors を作成し、その要素毎にクラスを作成しています。
// 配列を作成 $colors : red, green, blue; @each $v in $colors { .#{$v}{ color : $v; } }
変数$vには red、 green、 blue が順番に代入され、その値をクラス名とCOLOR属性の値として使っています。
出力結果は下記のようになります。
.red { color: red; } .green { color: green; } .blue { color: black; }