Chapter04 Sassの制御構文

概要と目標 Sassでも条件分岐や、
ループを使おう。

Sassでもif文for文など
便利な制御構文が使える。
これからを覚えて、柔軟に修正できるSassを書けるようになろう。

条件分岐 Sassでも、if文が使える。

条件分岐を使って、特定の条件の時のみスタイルを追加するなどという事ができる。

if文は、条件がtrueがまたは、falseによって処理を分ける制御構文
@if
@if 条件式 {
  // 条件式が true の時のスタイル

} @else {
  // 条件式が false の時のスタイル

}

@else { } は省略可能。

条件分岐を使ってみよう

  1. 「chapter04」 › 「if」 › 「_sass」フォルダ内にある「common.scss」ファイルを開く
  2. 下記のsassのコードを追記する
chapter04/if/_sass/common.scss
// 設定
$position: 'left'; // 右にする場合は 'right' にする

// Mixin
@mixin fadeLink ($speed: .3s, $opacity: .7) {
 transition: all $speed ease-in-out;

  &:hover {
    opacity: $opacity;
  }
}

.button-hamburger {
  position: absolute;
  top: 0;
  bottom: 0;

  @if $position == 'left' {
    // 条件に一致した時に追加するスタイル
    left: 2.5%;
  }

  @if $position == 'right' {
    // 条件に一致した時に追加するスタイル
    right: 2.5%;
  }

  width: 1.5em;
  height: 1.5em;
  margin: auto 0;
}

.banner {
  @include fadeLink();
}
  1. 上書き保存
  2. 「chapter04」 › 「if」 › 「css」フォルダ内に下記の「common.css」ファイルが出来上がっていることを確認
    確認後変数の値を「right」にして再度コンパイルしてみる
コンパイル結果(chapter04/if/css/common.css)
.button-hamburger {
  position: absolute;
  top: 0;
  bottom: 0;
  left: 2.5%;
  width: 1.5em;
  height: 1.5em;
  margin: auto 0;
}

.banner {
  -webkit-transition: all 0.3s ease-in-out;
  transition: all 0.3s ease-in-out;
}

.banner:hover {
  opacity: 0.7;
}

Mixinと組み合わせてみよう

  1. 「chapter04」 › 「if」 › 「_sass」フォルダ内にある「common.scss」ファイルを開く
  2. 下記のsassのコードを追記する
chapter04/if/_sass/common.scss
// 設定
$position: 'left'; // 右にする場合は 'right' にする
$is-support-ie8: true; // IE8に対応しない場合は false にする

// Mixin
@mixin fadeLink ($speed: .3s, $opacity: .7) {
 transition: all $speed ease-in-out;

  &:hover {
    opacity: $opacity;
    @if $is-support-ie8 {
      filter: alpha(opacity=$opacity * 100);
    }
  }
}

.button-hamburger {
  position: absolute;
  top: 0;
  bottom: 0;

  @if $position == 'left' {
    // 条件に一致した時に追加するスタイル
    left: 2.5%;
  }

  @if $position == 'right' {
    // 条件に一致した時に追加するスタイル
    right: 2.5%;
  }

  width: 1.5em;
  height: 1.5em;
  margin: auto 0;
}

.banner {
  @include fadeLink();
}
  1. 上書き保存
  2. 「chapter04」 › 「if」 › 「css」フォルダ内に下記の「common.css」ファイルが出来上がっていることを確認
    確認後変数の値を「false」にして再度コンパイルしてみる
コンパイル結果(chapter04/if/css/common.css)
.banner {
  -webkit-transition: all 0.3s ease-in-out;
  transition: all 0.3s ease-in-out;
}

.banner:hover {
  opacity: 0.7;
  filter: alpha(opacity=70);
}

比較演算子 2つの値を比較する。

2つの値を比較する時は、比較演算子を用いる。

主な比較演算子
演算子 説明
A > B A が B より大きい時 true
A < B A が B より小さい時 true
A >= B A が B 以上の時 true
A <= B A が B 以下の時 true
A == B A が B と等しい時 true
A != B A が B と異なる時 true
A === B A が B とデータ型も含めて等しい時 true
A !== B A が B とデータ型も含めて異なる時 true

反復 Sassでも、ループが使える。

何度も同じような処理を繰り返す場合は、反復を活用する。
Sassでもfor文や、while文が使える。

反復は条件式がtrueの間処理を繰り返す。
@for ~ through
@for ループ用の変数名 from ループ開始値 though ループ終了値 {
  // ループ開始値 から ループ終了値以下まで繰り返す処理

}
@for ~ to
@for ループ用の変数名 from ループ開始値 to ループ終了値 {
  // ループ開始値 から ループ終了値未満まで繰り返す処理

}

@forを使ってみよう

  1. 「chapter04」 › 「for」 › 「_sass」フォルダ内にある「common.scss」ファイルを開く
  2. 下記のsassのコードを変更する
chapter04/for/_sass/common.scss
// グリッド数の設定
$column: 12;

@for $i from 1 through $column {
  .grid--#{$i} {
    width: percentage($i / $column);
  }
}
  1. 上書き保存
  2. 「chapter04」 › 「for」 › 「css」フォルダ内に下記の「common.css」ファイルが出来上がっていることを確認
コンパイル結果(chapter04/for/css/common.css)
.grid--1 {
  width: 8.33333%;
}

.grid--2 {
  width: 16.66667%;
}

.grid--3 {
  width: 25%;
}

.grid--4 {
  width: 33.33333%;
}

.grid--5 {
  width: 41.66667%;
}

.grid--6 {
  width: 50%;
}

.grid--7 {
  width: 58.33333%;
}

.grid--8 {
  width: 66.66667%;
}

.grid--9 {
  width: 75%;
}

.grid--10 {
  width: 83.33333%;
}

.grid--11 {
  width: 91.66667%;
}

.grid--12 {
  width: 100%;
}
@whileもある
@for以外にも、@whileも使える。
@while
@while ループ継続条件 {
  // 条件に一致する間、繰り返す処理

}
サンプル
// ループ用変数の初期化
$i: 1;

@while $i <= 12 {
  .grid--#{$i} {
    width: percentage($i / 12);
    $i: $i + 1; // ループ用変数の増減
  }
}

配列のループ 配列だって作れるし、
それをループすることもできる。

Sassは、「,(半角カンマ)」、「 (半角スペース)」、「( )(丸括弧)」で区切ったものを配列して扱う。
また、配列をループするのに便利な @eachという構文がある。

配列の作り方
配列名: 値1, 値2, 値3;

配列は「 (半角スペース)」、「( )(丸括弧)」で区切っても作成できる。
@each
@each 値を取り出す変数名 in 配列名 {
  // 配列の要素の数だけ繰り返す

}

配列を使ってみよう

  1. 「chapter04」 › 「list」 › 「_sass」フォルダ内にある「common.scss」ファイルを開く
  2. 下記のsassのコードを記述する
chapter04/list/_sass/common.scss
// 配列の作成
$page-names: 'home' 'about' 'service';

// 配列のループ
@each $page-name in $page-names {
  .hero-#{$page-name} {
    background-image: url(../images/bg-#{$page-name}.png);
  }
}
  1. 上書き保存
  2. 「chapter04」 › 「list」 › 「css」フォルダ内に下記の「common.css」ファイルが出来上がっていることを確認
コンパイル結果(chapter04/list/css/common.css)
.hero-home {
  background-image: url(../images/bg-home.png);
}

.hero-about {
  background-image: url(../images/bg-about.png);
}

.hero-service {
  background-image: url(../images/bg-service.png);
}
連想配列 (マップ)も作れる
Sass3.3から、連想配列(マップ)も作れるようになった。
マップの作り方
マップ名: (
  キー1: 値1,
  キー2: 値2,
  キー3: 値3
);
@each
@each キーを取り出す変数名, 値を取り出す変数名 in 配列名 {
  // 配列の要素の数だけ繰り返す

}
サンプル
// マップの作成
$gutters: (
  'small': .5em,
  'medium': 1em,
  'large': 1.5em,
  'xlarge': 2em
);

// マップの取り出し
@each $key, $val in $gutters {
  .u-mt--#{$key} {
    margin-top: $val;
  }
}
コンパイル結果
.u-mt--small {
  margin-top: 0.5em;
}

.u-mt--medium {
  margin-top: 1em;
}

.u-mt--large {
  margin-top: 1.5em;
}

.u-mt--xlarge {
  margin-top: 2em;
}

独自関数 もちろん、独自関数も使える。

独自関数は、よく使う値の処理を登録しておく機能。
作成方法も使い方も@mixinと非常によく似ているが、
独自関数は主に値に使うことが多い。

独自関数の登録方法
@function 関数名(引数) {
  // 関数として登録する処理
  @return 戻り値;
       省略可
}

引数は「,(半角カンマ)」区切りで複数指定可能(必要ない場合は省略も可能)
独自関数の呼び出し方法
呼び出す関数名(引数);

独自関数を使ってみよう。

値を「px」から「em」に変換してくれる関数を作ってみよう。

  1. 「chapter04」 › 「function」 › 「_sass」フォルダ内にある「common.scss」ファイルを開く
  2. 下記のsassのコードを追加する
chapter04/function/_sass/common.scss
// 関数の登録
@function set-size($size, $base-font-size: 16px) {
  @return ($size / $base-font-size) * 1em;
}

.box {
  font-size: set-size(24px);
  padding: set-size(24px, 24px);
  margin: set-size(16px, 24px);
}
  1. 上書き保存
  2. 「chapter04」 › 「function」 › 「css」フォルダ内に下記の「common.css」ファイルが出来上がっていることを確認
コンパイル結果(chapter04/function/css/common.css)
.box {
  font-size: 1.5em;
  padding: 1em;
  margin: 0.66667em;
}

まとめSassでも、
制御構文が使える。

Sassでも、@if や @for などの、
便利な制御構文などが使える。

  • 条件分岐は@ifを使う
  • 反復は、@for@while@eachなどがある
  • オリジナルの関数を作ることができる