Twitter Bootstrapからmixinの使い方を読み解く
前回まででLESSの主だった記法はすべて紹介しました。
今回からはLESSの真骨頂であるmixinの作成に入ります。
まずはおさらいとして、
// LESS
.border-radius (@radius) {
border-radius: @radius;
-moz-border-radius: @radius;
-webkit-border-radius: @radius;
}
#header {
.border-radius(4px);
}
/* Compiled CSS */
#header {
border-radius: 4px;
-moz-border-radius: 4px;
-webkit-border-radius: 4px;
}
このように、
Twitter社が提供しているTwitter Bootstrapは、
今回はそのTwitter Bootstrapで提供しているmixin.
通常のダウンロードページではLESSから生成されたCSSファイルしか提供していないのですが、
ベンダープリフィックスをまとめる
mixin.
border-radius
これは先にご紹介したものと同様です。
// Border Radius
.border-radius(@radius) {
-webkit-border-radius: @radius;
-moz-border-radius: @radius;
border-radius: @radius;
}
border-radiusの一箇所のみを指定
border-radiusの一箇所のみを指定する場合、
ブラウザ独自実装の非常に困った点なのですが、
// Single Corner Border Radius
.border-top-left-radius(@radius) {
-webkit-border-top-left-radius: @radius;
-moz-border-radius-topleft: @radius;
border-top-left-radius: @radius;
}
.border-top-right-radius(@radius) {
-webkit-border-top-right-radius: @radius;
-moz-border-radius-topright: @radius;
border-top-right-radius: @radius;
}
.border-bottom-right-radius(@radius) {
-webkit-border-bottom-right-radius: @radius;
-moz-border-radius-bottomright: @radius;
border-bottom-right-radius: @radius;
}
.border-bottom-left-radius(@radius) {
-webkit-border-bottom-left-radius: @radius;
-moz-border-radius-bottomleft: @radius;
border-bottom-left-radius: @radius;
}
border-radiusの一辺を指定
これは前述のSingle Corner Border Radiusをさらに応用したものです。
CSSでは1箇所ずつしか角丸を記述できません。しかし、
// Single Side Border Radius
.border-top-radius(@radius) {
.border-top-right-radius(@radius);
.border-top-left-radius(@radius);
}
.border-right-radius(@radius) {
.border-top-right-radius(@radius);
.border-bottom-right-radius(@radius);
}
.border-bottom-radius(@radius) {
.border-bottom-right-radius(@radius);
.border-bottom-left-radius(@radius);
}
.border-left-radius(@radius) {
.border-top-left-radius(@radius);
.border-bottom-left-radius(@radius);
}
もちろんmixinの入れ子を用いずに書くこともできます。しかし、
- mixin自体のコードのシンプル化
- 生成されるCSSのシンプル化
- LESSファイル全体の保守性
その他
その他、
- box-shadow
- transition
- rotate
- scale
- translate
- skew
- translate3d
- backface-visibility
- background-clip
- background-size
- box-sizing
- user-select
記述を短縮する
単純なCSS3だけではなく、
要素を中央寄せ
指定した要素を中央にレイアウトする際は、
以下の例では、
// Center-align a block level element
// ----------------------------------
.center-block() {
display: block;
margin-left: auto;
margin-right: auto;
}
widthとheightをまとめて記述
.size()では、
.square()では、
// Sizing shortcuts
// -------------------------
.size(@height, @width) {
width: @width;
height: @height;
}
.square(@size) {
.size(@size, @size);
}
text-overflowを記述する
text-overflowは、
// Text overflow
// -------------------------
// Requires inline-block or block for proper styling
.text-overflow() {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
clearfixを記述する
CSSハックとしてはおそらく一番メジャーで、
特に対応ブラウザによって省略できる記述も多いので、
.clearfix {
*zoom: 1;
&:before,
&:after {
display: table;
content: "";
// Fixes Opera/contenteditable bug:
// http://nicolasgallagher.com/micro-clearfix-hack/#comment-36952
line-height: 0;
}
&:after {
clear: both;
}
}
短縮した記述量はわずかではありますが、
mixinのセレクタを用いてグルーピングをする
Twitter Bootstrapのmixin.
#gradient {
.horizontal(@startColor: #555, @endColor: #333) {
~中略~ }
.vertical(@startColor: #555, @endColor: #333) {
~中略~
}
.directional(@startColor: #555, @endColor: #333, @deg: 45deg) {
~中略~
} .vertical-three-colors(@startColor: #00b3ee, @midColor: #7a43b6, @colorStop: 50%, @endColor: #c3325f) {
~中略~
} .radial(@innerColor: #555, @outerColor: #333) {
~中略~
} .striped(@color, @angle: 45deg) {
~中略~
}
}
中身の詳細は解説は省略しますが、
しかし今回注目したいのは、
今まではなんとなくclassで指定をしてきましたが、
たとえば
//LESS
#gradient {
.horizontal(@startColor: #555, @endColor: #333) {
~中略~
}
}
を利用する際は、
//LESS
div {
#gradient > .horizontal(#FFFFFF,#000000);
}
これが何階層入れ子になっていても指定の仕方は変わりません。
では、
それは普段CSSを記述するのと同じように
- 同じクラス名があった場合に競合を避ける
ため、
- 同じジャンルのmixinをグルーピングさせる
ためです。
今回のTwitter Bootstrapの例ではグラデーションに関するmixinをまとめるために、
うまくグルーピングして可読性を高める
入れ子を使い過ぎると、
このように、
すべてをグルーピングしてしまうと結局冗長な記述になってしまいますが、
また、
今回はTwitter Bootstrapを題材に取り上げましたが、
- Preboot.
less - http://
www. markdotto. com/ bootstrap/ - LESS Elements
- http://
lesselements. com
次回はこれらをさらに改良し