前回ご紹介したネストは、
ネスト時の変数のスコープ(参照範囲)を理解する
変数の内容は、
たとえば以下の例では、
// LESS
@var: red;
header {
@var: white;
nav {
background: @var; //headerで宣言された@var(white)を参照
}
}
footer {
background: @var; //一番最初に宣言したグローバル変数の@var(red)を参照;
}
/* Compiled CSS */
header nav {
background: #ffffff;
}
footer {
background: #ff0000;
}
とはいえ、
変数は以下の流れでスコープ
- 変数が実際に記述されたセレクタに@varがないかどうか探す
- なければ、
その親セレクタ (DOM上ではなくLESSの宣言上のもの) を探す - なければ、
そのさらに親セレクタを探す - 最後はグローバルな
(セレクタの中にない) 変数を参照する
同じ変数を定義しなおすメリットとは
もちろん、
- スコープ外には影響を及ぼさないため、
参照範囲内では他範囲への影響を考えず自由に宣言ができ、 例外指定や条件ごとの指定が容易 - 似た内容を宣言する場合、
同じ変数名で宣言しなおした方がわかりやすい - 余計な変数名を増やすことで他の変数と干渉してしまうトラブルが起こりにくい
このため、
たとえば、
//指定ページ意外の色
@pageColor: yellow;
background: @pageColor; //yellow
//トップページ
#top {
@pageColor: red;
background: @pageColor; //red
}
//会社概要ページ
#company {
@pageColor: blue;
background: @pageColor; //blue
}
//FAQページ
#faq {
@pageColor: green;
background: @pageColor; //green
}
このように、
今回のような単調な繰り返しであれば、
変数定義の注意点
上記の例では同じ変数名で異なる値を宣言してみましたが、
同じスコープで、
プログラミング言語では、
しかしLESSでは、
たとえば以下の例では、
@foo: red;
header {
background: @foo; //後で宣言された@fooを参照→blue;
}
@foo: blue;
footer {
background: @foo; //後で宣言された@fooを参照→blue;
}
変数
このような宣言の仕方は、
スコープを理解して同セレクタ内での干渉に注意しておけば、
ネストの応用 ~&で複数の要素を並列に指定する
ネストは基本的にHTMLの階層構造にならってCSSを記述していく方法です。
しかし、
/*CSS*/
.foo {
background: red;
}
.foo.var {
background: blue;
}
a {
color: red;
}
a:hover {
color: blue;
}
LESSでは、
//LESS
.foo {
background: red;
&.var {
background: blue;
}
}
a {
color: red;
&:hover {
color: blue;
}
}
/* Compiled CSS */
.foo {
background: red;
}
.foo.var {
background: blue;
}
a {
color: red;
}
a:hover {
color: blue;
}
「&」
"ios"というclassがbodyに付いているときのみ、背景を青にするには
この
たとえば
そのような指定は今までのネストの書き方では不可能なので、
しかし
//LESS
.foo {
.var {
background: red;
}
body.ios & .var {
background: blue;
}
}
/* Compiled CSS */
.foo .var {
background: red;
}
body.ios .foo .var {
background: blue;
}
ネストの階層構造にすると少し違和感を感じるかもしれませんが、
これにより、
iOSとAndroidの両方に対応させる場合など、
以上、
次回は変数で宣言された色や数値の計算方法などをご紹介します。ぜひお楽しみに!