Stylus

Expressive, dynamic, robust CSS

Fork me on GitHub

条件文原文

条件文は条件付きimport、mixins、functionなどを介して制御フローを提供し、言語を動的に処理させることを可能にします。 以下の例はシンプルな例であり、あまり推奨しません。:)

if / else if / else

Along with if are the typical else if and else tokens, acting as fallbacks.

if 条件文は期待通りに動作します。評価式を受け入れ、true の場合、次のブロックを評価します。 if はフォールバックとして機能する 典型的な else ifelse トークンを伴います。

次の例では、条件によって paddingmargin で交換して上書きします。

overload-padding = true

if overload-padding
  padding(y, x)
    margin y x

body
  padding 5px 10px

他の例:

box(x, y, margin = false)
  padding y x
  if margin
    margin y x

body
  box(5px, 10px, true)

他の box() ヘルパー:

box(x, y, margin-only = false)
  if margin-only
    margin y x
  else
    padding y x

unless

Rubyプログラミングに親しい人向けに unless 条件文を持っています。 これは基本的に if の反対(本質的には if (!(expr)) )の作用をします。

以下の例では、disable-padding-overrideundefined または false の場合、 padding が上書きされ、代わりに margin で表示します。 しかし、true の場合、padding は予定通り padding 5px 10px のまま出力されます。

 disable-padding-override = true

 unless disable-padding-override is defined and disable-padding-override
   padding(x, y)
     margin y x

 body
   padding 5px 10px

後置条件文

Stylusは後置条件文をサポートしています。 これは、ifunless がオペレータのように振舞うことを意味しています。 右辺の式がtrueと評価される場合、左辺のオペレータが評価されます。

例えば、幾つかの基本型のチェックをするために、negative() を定義してみましょう。 以下では、ブロックスタイルの条件文を使用しています。

  negative(n)
    unless n is a 'unit'
      error('invalid number')
    if n < 0
      yes
    else
      no

続いて、関数を簡潔に保つために後置条件文を使用します。

  negative(n)
    error('invalid number') unless n is a 'unit'
    return yes if n < 0
    no

もちろんこれをさらに改良することもできます。 例えば、n < 0 ? yes : no と書くことも出来ますし、次のように単純にブール値とすることもできます。n < 0 

後置条件文はほとんどのシングルライン文に適用することができます。 例えば、@import@charset やmixins。もちろん次に示すようにプロパティにも。

  pad(types = margin padding, n = 5px)
    padding unit(n, px) if padding in types
    margin unit(n, px) if margin in types

  body
    pad()

  body
    pad(margin)

  body
    apply-mixins = true
    pad(padding, 10) if apply-mixins

結果:

  body {
    padding: 5px;
    margin: 5px;
  }
  body {
    margin: 5px;
  }
  body {
    padding: 10px;
  }