MACH3

MACH3.laBlog

WEB屋の音速実験室

LessにおけるMixin活用法

Less & Sass Advent calendar 2011 の15日目です!
今日はLessにおけるMixInの活用法について書いてみようと思います。

LessにおけるMixin活用法

LessのMixinについて

LessにおけるMixinというのは、簡単に言うと関数のようなもので、
どこかで宣言しておけば、セレクタの中で呼び出すことが出来、
結果としてその中身がセレクタ内に展開されます。

ごちゃごちゃとわかりづらいので、公式の例を拝借します。

1
2
3
4
5
.rounded-corners (@radius: 5px) {
  border-radius: @radius;
  -webkit-border-radius: @radius;
  -moz-border-radius: @radius;
}

こんな感じに宣言しておきます。()の中身は引数と初期値です。
セレクタ内で呼び出すときは…

1
2
3
4
5
6
#header {
  .rounded-corners;
}
#footer {
  .rounded-corners( 10px );
}

こんな感じで呼び出すと、それぞれ展開されて下のコードのようになります。
#headerの方は引数を渡していないので、初期値の5pxが適用されています。

1
2
3
4
5
6
7
8
9
10
11
/* 出力結果 */
#header {
  border-radius: 5px;
  -webkit-border-radius: 5px;
  -moz-border-radius: 5px;
}
#footer {
  border-radius: 10px;
  -webkit-border-radius: 10px;
  -moz-border-radius: 10px;
}

SassのMixinとの違い

SassとLessの記法は非常に良く似ていますが、
大きく異なる点として、変数の記号(@ではなく$)と、
Mixinの書き方があげられます。

前述の例をSCSSで書くと、こんな感じになると思います。

1
2
3
4
5
6
7
8
9
10
11
12
13
@mixin rounded-corners( $radius:5px ){
  border-radius: $radius;
  -webkit-border-radius: $radius;
  -moz-border-radius: $radius;
  border-radius:$radius;
}
 
#header {
  @include rounded-corners;
}
#footer {
  @include rounded-corners( 10px );
}

Lessが通常のCSSクラスの記法と酷似しているのに対し、
Sassの記法は、一発でMixinとわかるような書き方になっていますね。
可読性の点ではSassの方に軍配があがりそうですが、
この記法はLessの長所の一つでもあります。

CSSクラスもMixinとして使える

LessのMixinはCSSクラスと似ているだけではなく、
普通のCSSクラスもMixinとして使用する事ができます。

1
2
3
4
5
6
7
8
9
// 普通のCSSクラス
.hoge {
  background-color:#333;
  color:#fff;
}
.fuga {
  .hoge;
  font-weight:bold;
}
1
2
3
4
5
6
7
8
9
10
11
/* 出力結果 */
.hoge {
  background-color:#333;
  color:#fff;
}
 
.fuga {
  background-color:#333;
  color:#fff;
  font-weight:bold;
}

特別な記述をしなくても、簡単にプロパティを継承出来てしまうわけですね。
これは楽です。

Mixinで多重継承する

この仕組みは、OOCSSの様な作り方をCSSだけで行いたい場合に役立ちます。

従来の書き方

1
2
3
4
5
6
7
8
9
10
11
12
13
.box {
  padding:10px;
  margin:10px;
}
.dark {
  background-color:#111;
  color:#fff;
}
.rounded-corners {
  -moz-border-radius:5px;
  -webkit-border-radius:5px;
  border-radius:5px;
}

例えばこのコードで黒くて角丸なボックスを要素に適用したい場合、
次のようなHTMLになると思います。

<div class="box dark rounded-corners">...</div>

Mixinによる継承

ここでLessのMixinを使用して、一つ記述を書き足してみます。

.mybox {
  .box;
  .dark;
  .roudned-corners;
}

こうすることにより、divにあてがうクラスはよりシンプルになります。

<div class="mybox">...</div>

オブジェクト指向的なCSSを書きたいけど、HTMLはスッキリさせたい。
そんなケースによさそうです。

デメリット

HTMLはスッキリしますが、出力されるCSSはそうはいきません。
(誰が見るわけでもないかもしれませんが)

呼び出される都度、何度でも展開されるわけなので、
同じ事を繰り返して記述する、いささかしつこいCSSになるでしょう。
些細な差かもしれませんが、ファイルサイズもかさみますね。

extendをLESSに実装した例

昨日、AdventCalender14日目の@hokacchaさんが、
よりスマートなソリューションについて記事にされていたので、是非。

LESSにextendを実装してみた – hokaccha.hamalog v2

出力されるCSSが、大変いい感じになりますね。
extend、よさげです。

オマケ:無限ループの罠

ちなみに、互いにそれぞれを呼び出すMixinを作ると、
当たり前ですが無限ループに陥ってコンパイラが落ちる事もあると思いますので、
ご注意ください。

良い子は真似しちゃだめ!

1
2
3
4
5
6
7
8
.hoge {
  color:#fff;
  .fuga;
}
.fuga {
  color:#ccc;
  .hoge;
}

おわり

それでは引き続きLess & Sass Advent calendar 2011をお楽しみくださいませ。

Share |

コメント (0件)

コメントはないみたいです。

コメントを投稿する

入力されたメールアドレスは公開されません。


*

「東北地方太平洋沖地震」義援金支援(Yahoo!基金)