Sassを使い始めたとき、ネストや変数などは比較的わかりやすいのですが、今回は"便利なんだけどイマイチどれを使っていいかわからない"、extend、mixin、functionについて比較したいと思います。
Sassにはもちろん色々な便利機能があるので、Sassで何が出来るのだろう?と探してこの記事に来たヒトは、弊社KentaroのSassを使いたくなる!便利機能をまとめてみました。をご覧ください。
ここでは、Sass(SCSS記法)のextend(継承)、mixin(ミックスイン)、function(自作関数)に絞って紹介してみます。
特にextend、mixinは、どちらを使っても変わらない場合もあり、好みがわかれるかもしれませんが、ここは自分ルールで分けているので、ご容赦を。
このextend、mixin、functionの中で、まず最初に紹介されているのがextendだと思います。
「継承」と言われると、プログラミングの話かー...と、しきいが高い気もしてきますが、実は使い方は難しくはないです。
.hoge1 {
margin:10px 0;
padding:5px;
}
.hoge2{
@extend .hoge1;
padding:0;
}
と書くと、
.hoge1, .hoge2 {
margin: 10px 0;
padding: 5px;
}
.hoge2 {
padding: 0;
}
となります。
@extendで呼ばれたhoge1の中身がごそっとhoge2にも反映されています。
これだけを見ると、1か所で書けるものを2か所にわけて書くのは非効率!と思うかもしれないですが、1つのクラス内で複数回@extendすることもできますし、@extendしているクラスを@extendすることもできますので、使い方次第で絶大な効果を発揮してくれます。
mixinは、extendとの大きな違いは2つあると思います。細かくはいっぱいあるのですが。
extendの例と同じ内容をmixinで書くと一目瞭然です。
@mixin hoge {
margin:10px 0;
padding:5px;
}
.hoge1{
@include hoge;
}
.hoge2{
@include hoge;
padding:0;
}
と書くと、
.hoge1 {
margin: 10px 0;
padding: 5px;
}
.hoge2 {
margin: 10px 0;
padding: 5px;
padding: 0;
}
となります。
extendで書き出されたCSSと内容は同じなのですが、「.hoge1, .hoge2 {}」のようにグルーピングされません。
この違いだけですと、extendのほうがソースも短くなるのでいいかと思いますが、制作会社がベースをSassで作って、日々の更新はクライアント企業の担当者がCSSファイルを触るサイトなどでは、分けて書き出したほうが良い場合もあるかもしれません。
こちらがミックスインを使う最大の理由になるかと思います。説明するよりも例を見たほうが早いと思いますので、早速書いてみます。
@mixin hoge($value : 5px) {
margin:10px 0;
padding:$value;
}
.hoge1{
@include hoge;
}
.hoge2{
@include hoge(0);
}
と書くと、
.hoge1 {
margin: 10px 0;
padding: 5px;
}
.hoge2 {
margin: 10px 0;
padding: 0;
}
となります。
出力されるCSSもhoge2に「padding: 5px;」が出力されなくなりすっきりとしたのではないでしょうか。
「$value : 5px」の「5px」は引数の初期値となり、これがセットされていると、上記のように「@include hoge;」と省略して書くことができます。もちろん複数の引数を渡したり、可変長(数が不明)な引数を渡すことも可能ですので、色々な使い方が可能です。
ちょっと癖のある使い方としては、@contentがあります。
contentは、上と違いブロックコンテントを渡します。何それ?となりそうなので、例から見ていきます。
@mixin hogeCont{
.hogeChild{
margin: 10px 0;
@content;
}
}
.hoge1{
@include hogeCont{
padding: 5px;
}
}
.hoge2{
@include hogeCont{
padding: 0px;
}
}
と書くと、
.hoge1 .hogeChild {
margin: 10px 0;
padding: 5px;
}
.hoge2 .hogeChild {
margin: 10px 0;
padding: 0;
}
となります。
@contentを使わず、
@mixin hoge($value : 5px) {
margin:10px 0;
padding:$value;
}
.hoge1 .hogeChild{
@include hoge;
}
.hoge2 .hogeChild{
@include hoge(0);
}
と書いても同じ内容になりますが、「.hogeChild」を何度も書かなくていいところが美しいかと思います。Sassの解説書などではIEハック用のクラスなどによく使われていますね。
最後にfunctionですが、引数などの扱いはmixinと一緒ですが、返すものが値となります。簡単な例ですがファイル名を引数で渡してurlをセットするfunctionは下記になります。
$hoge:'img/';
$png:'.png';
@function urlPng($fileName) {
@return url($hoge+$fileName+$png);
}
.hoge1 {
background:urlPng('test');
}
.hoge2 {
background:url($hoge+'test'+$png);
}
と書くと、
.hoge1 {
background: url("img/test.png");
}
.hoge2 {
background: url("img/test.png");
}
と「.hoge1」も「.hoge2」も同じになります。「.hoge2」のように直接四則演算を行ったりしてもいいのですが、functionを作ってあげたほうが美しいですね。
| 静的/動的 | 引数 | グルーピング | 返り値 | |
|---|---|---|---|---|
| extend | 静的 | × | ○ | ブロック |
| mixin | 動的 | ○ | × | ブロック |
| function | 動的 | ○ | - | 値 |
誤解を恐れずに書くと上記のようなイメージがわかり易いんじゃないかと思います。
どうでしょうか。Sassを触りだしてもう一歩踏み出したい!と思っているヒトの助けになれば幸いです。
よきSassタイムを。