第4章 高度な機能を覚えてSassを使いこなそう

4-2 柔軟なスタイルの定義が可能なミックスイン(@mixin)

ミックスインの基本

// ミックスインを定義
@mixin boxSet {
	padding: 15px;
	background: #999;
	color: white;
}
// 定義したミックスインを呼び出し
.relatedArea {
	@include boxSet;
}
.relatedArea {
  padding: 15px;
  background: #999;
  color: white;
}
// 定義したミックスインを呼び出し
.relatedArea {
	@include boxSet;
}
// 別のルールセットでも呼び出し
.pickupArea {
	@include boxSet;
}
.relatedArea {
  padding: 15px;
  background: #999;
  color: white;
}
.pickupArea {
  padding: 15px;
  background: #999;
  color: white;
}

引数を使ったミックスイン

// 引数を使ったミックスインを定義
@mixin kadomaru($value) {
	-moz-border-radius: $value;
	-webkit-border-radius: $value;
	border-radius: $value;
}
.box {
	@include kadomaru(3px);
	background: #eee;
}
.item {
	border: 1px solid #999;
	@include kadomaru(5px 10px);
}
.box {
  -moz-border-radius: 3px;
  -webkit-border-radius: 3px;
  border-radius: 3px;
  background: #eee;
}
.item {
  border: 1px solid #999;
  -moz-border-radius: 5px 10px;
  -webkit-border-radius: 5px 10px;
  border-radius: 5px 10px;
}

引数に初期値を定義する

@mixin kadomaru($value: 3px) {
	-moz-border-radius: $value;
	-webkit-border-radius: $value;
	border-radius: $value;
}
.boxA {
	@include kadomaru;
	background: #eee;
}
.boxB {
	@include kadomaru();
	background: #f1f1f1;
}
.boxA {
  -moz-border-radius: 3px;
  -webkit-border-radius: 3px;
  border-radius: 3px;
  background: #eee;
}
.boxB {
  -moz-border-radius: 3px;
  -webkit-border-radius: 3px;
  border-radius: 3px;
  background: #f1f1f1;
}

引数を複数指定する

@mixin boxBase($margin: 30px 0, $padding: 10px) {
	margin: $margin;
	padding: $padding;
}

.boxA {
	@include boxBase;
	background: #eee;
}
.boxB {
	@include boxBase(0 0 50px, 20px);
	background: #f1f1f1;
}
.boxA {
  margin: 30px 0;
  padding: 10px;
  background: #eee;
}

.boxB {
  margin: 0 0 50px;
  padding: 20px;
  background: #f1f1f1;
}
.boxB {
	@include boxBase(0 0 50px);
	background: #f1f1f1;
}
.boxB {
	@include boxBase(,20px);
	background: #f1f1f1;
}

カンマ(,)を使うプロパティには可変長引数を利用する

@mixin shadow($value) {
	text-shadow: $value;
}

h2 {
	@include shadow(8px 8px 0 #999, 15px -10px 0 #eee);
}
// 複数の値を () で囲ってリストにする
h2 {
	@include shadow((8px 8px 0 #999, 15px -10px 0 #eee));
}

// 複数の値を "" や '' で囲って文字列にする
h2 {
	@include shadow(unquote("8px 8px 0 #999, 15px -10px 0 #eee"));
}
@mixin shadow($value...) {
	text-shadow: $value;
}

h2 {
	@include shadow(8px 8px 0 #999, 15px -10px 0 #eee);
}
h2 {
  text-shadow: 18px 8px 0 #999999, 15px -10px 0 #eeeeee;
}

複数の引数が有るミックスインを読み込む際に可変長引数を使う

@mixin boxBase($w: 250px, $pd: 15px, $bg_c: #fff, $bd_c: #ccc) {
	width: $w;
	padding: $pd;
	background-color: $bg_c;
	border: 1px solid $bd_c;
}

$values: 300px, 20px;

.item {
	float: left;
	@include boxBase($values...);
}
.item {
  float: left;
  width: 300px;
  padding: 20px;
  background-color: white;
  border: 1px solid #cccccc;
}
.item {
  float: left;
  width: 300px, 20px;
  padding: 15px;
  background-color: white;
  border: 1px solid #cccccc;
}

ミックスインのスコープ(利用できる範囲)を制限する

.main {
	@mixin margin {
		margin: 50px 0;
	}
	.item {
		@include margin;
	}
}
.main {
	@mixin margin {
		margin: 50px 0;
	}
}
.item {
	@include margin;
}

ミックスインにコンテントブロックを渡す @content

.item {
	.image {
		float: left;
		*:first-child + html & {
			zoom: 1;
		}
	}
	.text {
		overflow: hidden;
		background: rgba(0,0,0,.2);
		*:first-child + html & {
			background: #eee;
		}
	}
}
@mixin hackIE7 {
	*:first-child + html & {
		@content;
	}
}

.item {
	.image {
		float: left;
		@include hackIE7 {
			zoom: 1;
		}
	}
	.text {
		overflow: hidden;
		background: rgba(0,0,0,.2);
		@include hackIE7 {
			background: #eee;
		}
	}
}
.item .image {
  float: left;
}
*:first-child + html .item .image {
  zoom: 1;
}
.item .text {
  overflow: hidden;
  background: rgba(0, 0, 0, 0.2);
}
*:first-child + html .item .text {
  background: #eee;
}

ミックスイン名で使える文字と使えない文字

@mixin shadow1 { ~ }
@mixin shadow-1 { ~ }
@mixin shadow_1 { ~ }
@mixin 影 { ~ }
@mixin shadow { ~ }
@mixin _shadow { ~ }
@mixin -shadow { ~ }
@mixin 01shadow { ~ }	// 数字から始まっている
@mixin shadow@2 { ~ }	// @など使えない記号
@mixin --shadow { ~ }	// 連続したハイフンから始まっている