第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;
}
.boxB {
@include boxBase($padding: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;
@media only screen and (max-width: 768px) {
float: none;
}
}
.text {
overflow: hidden;
margin-left: 15px;
@media only screen and (max-width: 768px) {
margin-left: 0;
}
}
}
@mixin media($width-media: 768px) {
@media only screen and (max-width: $width-media) {
@content;
}
}
.item {
.image {
float: left;
@include media {
float: none;
}
}
.text {
overflow: hidden;
margin-left: 15px;
@include media {
margin-left: 0;
}
}
}
.item .image {
float: left;
}
@media only screen and (max-width: 768px) {
.item .image {
float: none;
}
}
.item .text {
overflow: hidden;
margin-left: 15px;
}
@media only screen and (max-width: 768px) {
.item .text {
margin-left: 0;
}
}
ミックスイン名で使える文字と使えない文字
@mixin shadow1 { ~ }
@mixin shadow-1 { ~ }
@mixin shadow_1 { ~ }
@mixin 影 { ~ }
@mixin shadow { ~ }
@mixin _shadow { ~ }
@mixin -shadow { ~ }
@mixin 01shadow { ~ } // 数字から始まっている
@mixin shadow@2 { ~ } // @など使えない記号
@mixin --shadow { ~ } // 連続したハイフンから始まっている

