セレクター
インデント
Stylusは"Pythonic"です(つまり、インデントベースです)。空白は重要な意味を持つため、以下に示すように、`{`と`}`を*インデント*と*アウトデント*に置き換えます。
body
color white
body
color white
これは以下にコンパイルされます。
body {
color: #fff;
}
body {
color: #fff;
}
必要であれば、コロンを使用してプロパティと値を区切ることができます。
body
color: white
body
color: white
ルールセット
Stylusでは、CSSと同様に、カンマ区切りを使用して複数のセレクターのプロパティを一度に定義できます。
textarea, input
border 1px solid #eee
textarea, input
border 1px solid #eee
改行を使用しても同じことができます。
textarea
input
border 1px solid #eee
textarea
input
border 1px solid #eee
どちらも以下にコンパイルされます。
textarea,
input {
border: 1px solid #eee;
}
textarea,
input {
border: 1px solid #eee;
}
**このルールの唯一の例外**は、プロパティのように見えるセレクターです。たとえば、次の`foo bar baz`はプロパティ**または**セレクターの可能性があります。
foo bar baz
> input
border 1px solid
foo bar baz
> input
border 1px solid
そのため、この理由(または単に好みの場合)、カンマを末尾に付けることができます。
foo bar baz,
form input,
> a
border 1px solid
foo bar baz,
form input,
> a
border 1px solid
親参照
`&`文字は親セレクターを参照します。以下の例では、2つのセレクター(`textarea`と`input`)はどちらも`:hover`擬似セレクターの色を変更します。
textarea
input
color #A7A7A7
&:hover
color #000
textarea
input
color #A7A7A7
&:hover
color #000
以下にコンパイルされます。
textarea,
input {
color: #a7a7a7;
}
textarea:hover,
input:hover {
color: #000;
}
textarea,
input {
color: #a7a7a7;
}
textarea:hover,
input:hover {
color: #000;
}
以下は、Mixin内で親参照を利用してInternet Explorer用の単純な`2px`の枠線を提供する例です。
box-shadow()
-webkit-box-shadow arguments
-moz-box-shadow arguments
box-shadow arguments
html.ie8 &,
html.ie7 &,
html.ie6 &
border 2px solid arguments[length(arguments) - 1]
body
#login
box-shadow 1px 1px 3px #eee
box-shadow()
-webkit-box-shadow arguments
-moz-box-shadow arguments
box-shadow arguments
html.ie8 &,
html.ie7 &,
html.ie6 &
border 2px solid arguments[length(arguments) - 1]
body
#login
box-shadow 1px 1px 3px #eee
以下の結果が得られます。
body #login {
-webkit-box-shadow: 1px 1px 3px #eee;
-moz-box-shadow: 1px 1px 3px #eee;
box-shadow: 1px 1px 3px #eee;
}
html.ie8 body #login,
html.ie7 body #login,
html.ie6 body #login {
border: 2px solid #eee;
}
body #login {
-webkit-box-shadow: 1px 1px 3px #eee;
-moz-box-shadow: 1px 1px 3px #eee;
box-shadow: 1px 1px 3px #eee;
}
html.ie8 body #login,
html.ie7 body #login,
html.ie6 body #login {
border: 2px solid #eee;
}
アンパサンド記号を親参照としてではなくセレクターで使用したい場合は、エスケープするだけです。
.foo[title*='\&']
// => .foo[title*='&']
.foo[title*='\&']
// => .foo[title*='&']
部分参照
セレクター内の任意の場所にある`^[N]`(`N`は数字)は、部分参照を表します。
部分参照は親参照と同様に機能しますが、親参照はセレクター全体を含むのに対し、部分セレクターはネストされたセレクターの最初のマージされた`N`レベルのみを含むため、ネストレベルに個別にアクセスできます。
`^[0]`は最初のレベルのセレクターを提供し、`^[1]`は2番目のレベルのレンダリングされたセレクターを提供します。
.foo
&__bar
width: 10px
^[0]:hover &
width: 20px
.foo
&__bar
width: 10px
^[0]:hover &
width: 20px
は以下のようにレンダリングされます。
.foo__bar {
width: 10px;
}
.foo:hover .foo__bar {
width: 20px;
}
.foo__bar {
width: 10px;
}
.foo:hover .foo__bar {
width: 20px;
}
負の値は末尾からカウントされるため、^[-1]は`&`の前のチェーンの最後のセレクターを提供します。
.foo
&__bar
&_baz
width: 10px
^[-1]:hover &
width: 20px
.foo
&__bar
&_baz
width: 10px
^[-1]:hover &
width: 20px
は以下のようにレンダリングされます。
.foo__bar_baz {
width: 10px;
}
.foo__bar:hover .foo__bar_baz {
width: 20px;
}
.foo__bar_baz {
width: 10px;
}
.foo__bar:hover .foo__bar_baz {
width: 20px;
}
負の値は、呼び出し元のネストレベルがわからない場合にMixin内で使用する場合に特に役立ちます。
部分参照には、セレクターの「一部」ではなく、指定されたネストレベルまでのセレクターのレンダリングされたチェーン全体が含まれることに注意してください。
部分参照の範囲
セレクター内の任意の場所にある`^[N..M]`(`N`と`M`はどちらも数字)は、部分参照を表します。
セレクターの未加工の部分を取得する必要がある場合、またはプログラムでパーツの範囲を取得する必要がある場合は、部分参照内で範囲を使用できます。
範囲が正の値から始まる場合、結果は前のレベルのセレクターを含まず、それらのレベルのセレクターがスタイルシートのルートに挿入され、結合子が省略されたかのように結果が得られます。
.foo
& .bar
width: 10px
^[0]:hover ^[1..-1]
width: 20px
.foo
& .bar
width: 10px
^[0]:hover ^[1..-1]
width: 20px
は以下のようにレンダリングされます。
.foo .bar {
width: 10px;
}
.foo:hover .bar {
width: 20px;
}
.foo .bar {
width: 10px;
}
.foo:hover .bar {
width: 20px;
}
範囲内の1つの数値は開始インデックス、2つ目は終了インデックスです。セレクターは常に最初のレベルから最後のレベルまでレンダリングされるため、これらの数値の順序は重要ではなく、`^[1..-1]`は`^[-1..1]`と同じになります。
両方の数値が等しい場合、結果はセレクターの未加工のレベルが1つだけになるため、前の例では`^[1..-1]`を`^[-1..-1]`に置き換えることができ、同じ最後の未加工のセレクターと同じになりますが、Mixin内で使用すると信頼性が高くなります。
初期参照
セレクターの先頭にある`~/`文字は、最初のネストのセレクターを指すために使用でき、 `^[0]`へのショートカットと見なすことができます。唯一の欠点は、セレクターの先頭でのみ初期参照を使用できることです。
.block
&__element
~/:hover &
color: red
.block
&__element
~/:hover &
color: red
は以下のようにレンダリングされます。
.block:hover .block__element {
color: #f00;
}
.block:hover .block__element {
color: #f00;
}
相対参照
セレクターの先頭にある`../`文字は相対参照を示し、`&`でコンパイルされたセレクターの前のセレクターを指します。相対参照をネストできます。`../../`を使用してより深いレベルを取得しますが、セレクターの先頭でのみ使用できることに注意してください。
.foo
.bar
width: 10px
&,
../ .baz
height: 10px
.foo
.bar
width: 10px
&,
../ .baz
height: 10px
は以下のようにレンダリングされます。
.foo .bar {
width: 10px;
}
.foo .bar,
.foo .baz {
height: 10px;
}
.foo .bar {
width: 10px;
}
.foo .bar,
.foo .baz {
height: 10px;
}
相対参照は、`^[0..-(N + 1)]`のような範囲を持つ部分参照へのショートカットと見なすことができます。ここで、`N`は使用される相対参照の数です。
ルート参照
セレクターの先頭にある`/`文字はルート参照です。これはルートコンテキストを参照し、セレクターは親のセレクターを先頭に付加しないことを意味します(`&`と一緒に使用する場合を除く)。現在のスコープにないネストされたセレクターと別のセレクターの両方にスタイルを記述する必要がある場合に役立ちます。
textarea
input
color #A7A7A7
&:hover,
/.is-hovered
color #000
textarea
input
color #A7A7A7
&:hover,
/.is-hovered
color #000
以下にコンパイルされます。
textarea,
input {
color: #a7a7a7;
}
textarea:hover,
input:hover,
.is-hovered {
color: #000;
}
textarea,
input {
color: #a7a7a7;
}
textarea:hover,
input:hover,
.is-hovered {
color: #000;
}
selector()組み込み関数
組み込みの`selector()`を使用して、現在コンパイルされているセレクターを取得できます。チェックやその他の巧妙な操作のためにMixin内で使用できます。
.foo
selector()
// => '.foo'
.foo
&:hover
selector()
// '.foo:hover'
.foo
selector()
// => '.foo'
.foo
&:hover
selector()
// '.foo:hover'
この組み込み関数はオプションの文字列引数も受け入れることができます。この場合、コンパイルされたセレクターを返します。`&`記号がない場合、現在のスコープのセレクターを先頭に付加しないことに注意してください。
.foo
selector('.bar')
// => '.bar'
.foo
selector('&:hover')
// '.foo:hover'
.foo
selector('.bar')
// => '.bar'
.foo
selector('&:hover')
// '.foo:hover'
selector()組み込み関数の複数の値
`selector()`組み込み関数は、ネストされたセレクター構造を簡単に作成するために、複数の値またはカンマ区切りのリストを受け入れることができます。
{selector('.a', '.b', '.c, .d')}
color: red
{selector('.a', '.b', '.c, .d')}
color: red
は以下と同じです。
.a
.b
.c,
.d
color: red
.a
.b
.c,
.d
color: red
そして、以下のようにレンダリングされます。
.a .b .c,
.a .b .d {
color: #f00;
}
.a .b .c,
.a .b .d {
color: #f00;
}
selectors()組み込み関数
この組み込み関数は、現在のレベルのネストされたセレクターのカンマ区切りリストを返します。
.a
.b
&__c
content: selectors()
.a
.b
&__c
content: selectors()
は以下のようにレンダリングされます。
.a .b__c {
content: '.a', '& .b', '&__c';
}
.a .b__c {
content: '.a', '& .b', '&__c';
}
あいまいさの解消
margin - n
のような式は、減算演算としても、単項マイナスを持つプロパティとしても解釈される可能性があります。あいまいさを避けるために、式をかっこで囲んでください。
pad(n)
margin (- n)
body
pad(5px)
pad(n)
margin (- n)
body
pad(5px)
以下にコンパイルされます。
body {
margin: -5px;
}
body {
margin: -5px;
}
ただし、これは関数内でのみ該当します(関数はmixinとしても、戻り値を持つ呼び出しとしても機能するためです)。
たとえば、以下は問題なく動作し、上記と同じ結果になります。
body
margin -5px
body
margin -5px
Stylusが処理できない奇妙なプロパティ値がありますか? unquote()
が役立ちます。
filter unquote('progid:DXImageTransform.Microsoft.BasicImage(rotation=1)')
filter unquote('progid:DXImageTransform.Microsoft.BasicImage(rotation=1)')
結果:
filter progid:DXImageTransform.Microsoft.BasicImage(rotation=1)
filter progid:DXImageTransform.Microsoft.BasicImage(rotation=1)