跳至主要內容 跳至文件導覽

通用類別 API(Utility API)

通用類別 API 是一個基於 Sass 的工具,用於產生通用類別。

Bootstrap 工具程式是透過我們的通用類別 API 產生的,可用於透過 Sass 修改或擴充我們預設的通用類別集合。我們的通用類別 API 基於一系列 Sass maps 和函式,用於產生具有各種選項的類別族群。如果您不熟悉 Sass maps,請先閱讀 Sass 官方文件 以開始使用。

$utilities map 包含我們所有的工具程式,並會在稍後與您自訂的 $utilities map 合併(如果有的話)。utility map 包含一個以鍵值組成的工具群組清單,接受以下選項:

選項類型預設值說明
property必填屬性名稱,可以是字串或字串陣列(例如水平 padding 或 margin)。
values必填值的清單,或是當您不希望類別名稱與值相同時使用的 map。如果使用 null 作為 map 鍵,則 class 不會被加到類別名稱前面。
class選填null產生的類別名稱。如果未提供且 property 是字串陣列,class 將預設為 property 陣列的第一個元素。如果未提供且 property 是字串,則使用 values 的鍵作為 class 名稱。
css-var選填false布林值,用於產生 CSS 變數而非 CSS 規則。
css-variable-name選填null規則集內 CSS 變數的自訂無前綴名稱。
local-vars選填null除了 CSS 規則外,額外產生的區域 CSS 變數 map。
state選填null要產生的偽類別變體清單(例如 :hover:focus)。
responsive選填false布林值,指示是否應產生響應式類別。
rfs選填false布林值,啟用 RFS 流體縮放
print選填false布林值,指示是否需要產生列印類別。
rtl選填true布林值,指示工具程式是否應保留在 RTL 中。

API 說明(API explained)

所有工具變數都會在我們的 _utilities.scss 樣式表中加入到 $utilities 變數中。每組工具程式看起來像這樣:

$utilities: (
  "opacity": (
    property: opacity,
    values: (
      0: 0,
      25: .25,
      50: .5,
      75: .75,
      100: 1,
    )
  )
);

這會輸出以下內容:

.opacity-0 { opacity: 0; }
.opacity-25 { opacity: .25; }
.opacity-50 { opacity: .5; }
.opacity-75 { opacity: .75; }
.opacity-100 { opacity: 1; }

Property

任何工具程式都必須設定必填的 property 鍵,且必須包含有效的 CSS 屬性。此屬性用於產生的工具程式規則集中。當省略 class 鍵時,它也會作為預設類別名稱。以 text-decoration 工具程式為例:

$utilities: (
  "text-decoration": (
    property: text-decoration,
    values: none underline line-through
  )
);

輸出:

.text-decoration-none { text-decoration: none !important; }
.text-decoration-underline { text-decoration: underline !important; }
.text-decoration-line-through { text-decoration: line-through !important; }

Values

使用 values 鍵來指定指定 property 應使用哪些值來產生類別名稱和規則。可以是清單或 map(在工具程式中或在 Sass 變數中設定)。

作為清單,如同 text-decoration 工具程式

values: none underline line-through

作為 map,如同 opacity 工具程式

values: (
  0: 0,
  25: .25,
  50: .5,
  75: .75,
  100: 1,
)

作為設定清單或 map 的 Sass 變數,如同我們的 position 工具程式

values: $position-values

Class

使用 class 選項來變更編譯後 CSS 中使用的類別前綴。例如,要從 .opacity-* 改為 .o-*

$utilities: (
  "opacity": (
    property: opacity,
    class: o,
    values: (
      0: 0,
      25: .25,
      50: .5,
      75: .75,
      100: 1,
    )
  )
);

輸出:

.o-0 { opacity: 0 !important; }
.o-25 { opacity: .25 !important; }
.o-50 { opacity: .5 !important; }
.o-75 { opacity: .75 !important; }
.o-100 { opacity: 1 !important; }

如果 class: null,則為每個 values 鍵產生類別:

$utilities: (
  "visibility": (
    property: visibility,
    class: null,
    values: (
      visible: visible,
      invisible: hidden,
    )
  )
);

輸出:

.visible { visibility: visible !important; }
.invisible { visibility: hidden !important; }

CSS 變數通用類別(CSS variable utilities)

css-var 布林選項設為 true,API 將為給定的選擇器產生區域 CSS 變數,而不是通常的 property: value 規則。加入可選的 css-variable-name 來設定與類別名稱不同的 CSS 變數名稱。

以我們的 .text-opacity-* 工具程式為例。如果我們加入 css-variable-name 選項,我們會得到自訂的輸出。

$utilities: (
  "text-opacity": (
    css-var: true,
    css-variable-name: text-alpha,
    class: text-opacity,
    values: (
      25: .25,
      50: .5,
      75: .75,
      100: 1
    )
  ),
);

輸出:

.text-opacity-25 { --bs-text-alpha: .25; }
.text-opacity-50 { --bs-text-alpha: .5; }
.text-opacity-75 { --bs-text-alpha: .75; }
.text-opacity-100 { --bs-text-alpha: 1; }

區域 CSS 變數(Local CSS variables)

使用 local-vars 選項來指定一個 Sass map,它將在通用類別的規則集中產生區域 CSS 變數。請注意,在產生的 CSS 規則中使用這些區域 CSS 變數可能需要額外的工作。例如,以我們的 .bg-* 工具程式為例:

$utilities: (
  "background-color": (
    property: background-color,
    class: bg,
    local-vars: (
      "bg-opacity": 1
    ),
    values: map-merge(
      $utilities-bg-colors,
      (
        "transparent": transparent
      )
    )
  )
);

輸出:

.bg-primary {
  --bs-bg-opacity: 1;
  background-color: rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important;
}

States

使用 state 選項來產生偽類別變體。範例偽類別有 :hover:focus。當提供狀態清單時,會為該偽類別建立類別名稱。例如,要在滑鼠懸停時變更透明度,加入 state: hover,您的編譯 CSS 中就會有 .opacity-hover:hover

需要多個偽類別?使用以空格分隔的狀態清單:state: hover focus

$utilities: (
  "opacity": (
    property: opacity,
    class: opacity,
    state: hover,
    values: (
      0: 0,
      25: .25,
      50: .5,
      75: .75,
      100: 1,
    )
  )
);

輸出:

.opacity-0-hover:hover { opacity: 0 !important; }
.opacity-25-hover:hover { opacity: .25 !important; }
.opacity-50-hover:hover { opacity: .5 !important; }
.opacity-75-hover:hover { opacity: .75 !important; }
.opacity-100-hover:hover { opacity: 1 !important; }

響應式(Responsive)

加入 responsive 布林值來產生跨所有中斷點的響應式工具程式(例如 .opacity-md-25)。

$utilities: (
  "opacity": (
    property: opacity,
    responsive: true,
    values: (
      0: 0,
      25: .25,
      50: .5,
      75: .75,
      100: 1,
    )
  )
);

輸出:

.opacity-0 { opacity: 0 !important; }
.opacity-25 { opacity: .25 !important; }
.opacity-50 { opacity: .5 !important; }
.opacity-75 { opacity: .75 !important; }
.opacity-100 { opacity: 1 !important; }

@media (min-width: 576px) {
  .opacity-sm-0 { opacity: 0 !important; }
  .opacity-sm-25 { opacity: .25 !important; }
  .opacity-sm-50 { opacity: .5 !important; }
  .opacity-sm-75 { opacity: .75 !important; }
  .opacity-sm-100 { opacity: 1 !important; }
}

@media (min-width: 768px) {
  .opacity-md-0 { opacity: 0 !important; }
  .opacity-md-25 { opacity: .25 !important; }
  .opacity-md-50 { opacity: .5 !important; }
  .opacity-md-75 { opacity: .75 !important; }
  .opacity-md-100 { opacity: 1 !important; }
}

@media (min-width: 992px) {
  .opacity-lg-0 { opacity: 0 !important; }
  .opacity-lg-25 { opacity: .25 !important; }
  .opacity-lg-50 { opacity: .5 !important; }
  .opacity-lg-75 { opacity: .75 !important; }
  .opacity-lg-100 { opacity: 1 !important; }
}

@media (min-width: 1200px) {
  .opacity-xl-0 { opacity: 0 !important; }
  .opacity-xl-25 { opacity: .25 !important; }
  .opacity-xl-50 { opacity: .5 !important; }
  .opacity-xl-75 { opacity: .75 !important; }
  .opacity-xl-100 { opacity: 1 !important; }
}

@media (min-width: 1400px) {
  .opacity-xxl-0 { opacity: 0 !important; }
  .opacity-xxl-25 { opacity: .25 !important; }
  .opacity-xxl-50 { opacity: .5 !important; }
  .opacity-xxl-75 { opacity: .75 !important; }
  .opacity-xxl-100 { opacity: 1 !important; }
}

列印(Print)

啟用 print 選項也會產生列印用的通用類別,這些類別僅在 @media print { ... } media query 中套用。

$utilities: (
  "opacity": (
    property: opacity,
    print: true,
    values: (
      0: 0,
      25: .25,
      50: .5,
      75: .75,
      100: 1,
    )
  )
);

輸出:

.opacity-0 { opacity: 0 !important; }
.opacity-25 { opacity: .25 !important; }
.opacity-50 { opacity: .5 !important; }
.opacity-75 { opacity: .75 !important; }
.opacity-100 { opacity: 1 !important; }

@media print {
  .opacity-print-0 { opacity: 0 !important; }
  .opacity-print-25 { opacity: .25 !important; }
  .opacity-print-50 { opacity: .5 !important; }
  .opacity-print-75 { opacity: .75 !important; }
  .opacity-print-100 { opacity: 1 !important; }
}

重要性(Importance)

所有由 API 產生的工具程式都包含 !important,以確保它們能如預期般覆寫元件和修飾類別。您可以使用 $enable-important-utilities 變數全域切換此設定(預設為 true)。

使用 API(Using the API)

現在您已熟悉通用類別 API 的運作方式,請了解如何加入您自己的自訂類別並修改我們的預設工具程式。

覆寫通用類別(Override utilities)

使用相同的鍵來覆寫現有工具程式。例如,如果您想要額外的響應式 overflow 通用類別,您可以這樣做:

$utilities: (
  "overflow": (
    responsive: true,
    property: overflow,
    values: visible hidden scroll auto,
  ),
);

新增通用類別(Add utilities)

可以使用 map-merge 將新工具程式加入到預設的 $utilities map 中。請確保先匯入我們必要的 Sass 檔案和 _utilities.scss,然後使用 map-merge 來加入您的額外工具程式。例如,以下是如何加入一個具有三個值的響應式 cursor 工具程式。

@import "bootstrap/scss/functions";
@import "bootstrap/scss/variables";
@import "bootstrap/scss/variables-dark";
@import "bootstrap/scss/maps";
@import "bootstrap/scss/mixins";
@import "bootstrap/scss/utilities";

$utilities: map-merge(
  $utilities,
  (
    "cursor": (
      property: cursor,
      class: cursor,
      responsive: true,
      values: auto pointer grab,
    )
  )
);

@import "bootstrap/scss/utilities/api";

修改通用類別(Modify utilities)

使用 map-getmap-merge 函式修改預設 $utilities map 中的現有工具程式。在下面的範例中,我們為 width 工具程式加入一個額外的值。從初始的 map-merge 開始,然後指定您要修改的工具程式。從那裡,使用 map-get 取得巢狀的 "width" map 來存取和修改工具程式的選項和值。

@import "bootstrap/scss/functions";
@import "bootstrap/scss/variables";
@import "bootstrap/scss/variables-dark";
@import "bootstrap/scss/maps";
@import "bootstrap/scss/mixins";
@import "bootstrap/scss/utilities";

$utilities: map-merge(
  $utilities,
  (
    "width": map-merge(
      map-get($utilities, "width"),
      (
        values: map-merge(
          map-get(map-get($utilities, "width"), "values"),
          (10: 10%),
        ),
      ),
    ),
  )
);

@import "bootstrap/scss/utilities/api";

啟用響應式(Enable responsive)

您可以為一組預設非響應式的現有工具程式啟用響應式類別。例如,要讓 border 類別變成響應式:

@import "bootstrap/scss/functions";
@import "bootstrap/scss/variables";
@import "bootstrap/scss/variables-dark";
@import "bootstrap/scss/maps";
@import "bootstrap/scss/mixins";
@import "bootstrap/scss/utilities";

$utilities: map-merge(
  $utilities,
  (
    "border": map-merge(
      map-get($utilities, "border"),
      ( responsive: true ),
    ),
  )
);

@import "bootstrap/scss/utilities/api";

這現在將為每個中斷點產生 .border.border-0 的響應式變體。您產生的 CSS 將如下所示:

.border { ... }
.border-0 { ... }

@media (min-width: 576px) {
  .border-sm { ... }
  .border-sm-0 { ... }
}

@media (min-width: 768px) {
  .border-md { ... }
  .border-md-0 { ... }
}

@media (min-width: 992px) {
  .border-lg { ... }
  .border-lg-0 { ... }
}

@media (min-width: 1200px) {
  .border-xl { ... }
  .border-xl-0 { ... }
}

@media (min-width: 1400px) {
  .border-xxl { ... }
  .border-xxl-0 { ... }
}

重新命名通用類別(Rename utilities)

想念 v4 的工具程式,或習慣使用其他命名慣例?Utility API 可用於覆寫給定工具程式產生的 class——例如,將 .ms-* 工具程式重新命名為舊式的 .ml-*

@import "bootstrap/scss/functions";
@import "bootstrap/scss/variables";
@import "bootstrap/scss/variables-dark";
@import "bootstrap/scss/maps";
@import "bootstrap/scss/mixins";
@import "bootstrap/scss/utilities";

$utilities: map-merge(
  $utilities,
  (
    "margin-start": map-merge(
      map-get($utilities, "margin-start"),
      ( class: ml ),
    ),
  )
);

@import "bootstrap/scss/utilities/api";

移除通用類別(Remove utilities)

使用 map-remove() Sass 函式移除任何預設工具程式。

@import "bootstrap/scss/functions";
@import "bootstrap/scss/variables";
@import "bootstrap/scss/variables-dark";
@import "bootstrap/scss/maps";
@import "bootstrap/scss/mixins";
@import "bootstrap/scss/utilities";

// Remove multiple utilities with a comma-separated list
$utilities: map-remove($utilities, "width", "float");

@import "bootstrap/scss/utilities/api";

您也可以使用 map-merge() Sass 函式並將群組鍵設為 null 來移除工具程式。

@import "bootstrap/scss/functions";
@import "bootstrap/scss/variables";
@import "bootstrap/scss/variables-dark";
@import "bootstrap/scss/maps";
@import "bootstrap/scss/mixins";
@import "bootstrap/scss/utilities";

$utilities: map-merge(
  $utilities,
  (
    "width": null
  )
);

@import "bootstrap/scss/utilities/api";

新增、移除、修改(Add, remove, modify)

您可以使用 map-merge() Sass 函式一次新增、移除和修改許多工具程式。以下是如何將前面的範例組合成一個更大的 map。

@import "bootstrap/scss/functions";
@import "bootstrap/scss/variables";
@import "bootstrap/scss/variables-dark";
@import "bootstrap/scss/maps";
@import "bootstrap/scss/mixins";
@import "bootstrap/scss/utilities";

$utilities: map-merge(
  $utilities,
  (
    // Remove the `width` utility
    "width": null,
    // Make an existing utility responsive
    "border": map-merge(
      map-get($utilities, "border"),
      ( responsive: true ),
    ),
    // Add new utilities
    "cursor": (
      property: cursor,
      class: cursor,
      responsive: true,
      values: auto pointer grab,
    )
  )
);

@import "bootstrap/scss/utilities/api";

在 RTL 中移除通用類別(Remove utility in RTL)

某些邊緣情況會使 RTL 樣式變得困難,例如阿拉伯文中的換行。因此,可以透過將 rtl 選項設為 false 來將工具程式從 RTL 輸出中排除:

$utilities: (
  "word-wrap": (
    property: word-wrap word-break,
    class: text,
    values: (break: break-word),
    rtl: false
  ),
);

輸出:

/* rtl:begin:remove */
.text-break {
  word-wrap: break-word !important;
  word-break: break-word !important;
}
/* rtl:end:remove */

這在 RTL 中不會輸出任何內容,這要感謝 RTLCSS remove 控制指令