跳到內容
在此頁面上

條件

條件提供控制流程給原本靜態的語言,提供條件式導入、mixin、函式,以及更多。以下範例僅為範例,不建議使用 😃

if / else if / else

if 條件運作方式符合預期,僅接受一個表達式,在 true 時評估後續區塊。if 會搭配典型的 else ifelse 符號,作為後備選項。

以下範例會條件式覆寫 padding 屬性,將其替換為 margin

overload-padding = true

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

body
  padding 5px 10px
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(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
box(x, y, margin-only = false)
  if margin-only
    margin y x
  else
    padding y x

unless

對於熟悉 Ruby 程式語言的使用者,我們有 unless 條件。它基本上是 if 的相反,本質上是 if (!(expr))

在以下範例中,如果 disable-padding-overrideundefinedfalsepadding 會被覆寫,改顯示 margin。但如果它是 truepadding 會繼續輸出預期的 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
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 作為運算子;當右手邊的運算式為真時,它們會評估左手邊的運算元。

例如,我們定義 negative() 來執行一些基本的類型檢查。以下我們使用區塊式條件式

negative(n)
  unless n is a 'unit'
    error('invalid number')
  if n < 0
    yes
  else
    no
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
negative(n)
  error('invalid number') unless n is a 'unit'
  return yes if n < 0
  no

當然,我們可以更進一步。例如,我們可以寫 n < 0 ? yes : no,或僅使用布林值:n < 0

後置條件式可以套用於大多數單行陳述式。例如,@import@charset、混合,當然還有屬性,如下所示

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
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;
}
body {
  padding: 5px;
  margin: 5px;
}
body {
  margin: 5px;
}
body {
  padding: 10px;
}