メインコンテンツにスキップ ドキュメントナビゲーションにスキップ

ユーティリティAPI(Utility API) v5.0.0新設

ユーティリティAPIは、ユーティリティクラスを生成するためのSassベースのツール。

※"v5.0.0"での変更はv5.0.0-alpha版、v5.0.0-beta版での変更も含みます。

※"v5.2.0"での変更はv5.2.0-beta1での変更も含みます。
※"v5.3.0"での変更はv5.3.0-alpha版での変更も含みます。

Bootstrapユーティリティは、ユーティリティAPIを使用して生成され、Sassを経由してユーティリティクラスのデフォルトセットの変更や拡張に使用できる。このユーティリティAPIは、さまざまなオプションを備えたクラスのファミリーを生成するための一連のSassマップと関数に基づく。Sassマップに慣れていない場合は、公式のSassドキュメントを参照。

scss/_utilities.scss ファイルにある $utilities マップにはすべてのBootstrapユーティリティが集約されており、カスタムした $utilities マップがある場合は後からマージされる。ユーティリティマップには、以下のオプションを受け入れるユーティリティグループのキー付きリストが集約されている。

オプション名 タイプ デフォルト値 説明
property 必須 プロパティの名前。これは文字列か文字列の配列(水平方向のパディングやマージンなどに必要)。
values 必須 クラス名を値と同じにしたくない場合は、値のリストかマップにできる。マップキーとして null が使用されている場合、クラス名の前に class は追加されない。
class オプション null 生成されたクラス名。キーを指定せず property が文字列の配列である場合、class 名はデフォルトで property 配列の最初の要素になる。キーを指定せず property が文字列の場合、values キーが class 名に使用される。
css-var
v5.1.0追加
オプション false CSSルールの代わりにCSS変数を生成するブール値。
css-variable-name
v5.2.0追加
オプション null ルールセット内のCSS変数のカスタムのプレフィックスなしの名前。
local-vars
v5.1.0追加
オプション null CSSルールに加えて生成するローカルCSS変数のマップ。
state
v5.0.0-beta1追加
オプション null ユーティリティ用に生成する :hover:focus などの疑似クラスバリアントのリスト。
responsive オプション false レスポンシブクラスを生成する必要があるかどうかを示すブール値。
rfs オプション false 拡大縮小を可能にするための変数。これがどのように機能するかはRFSの項目に記載。
print オプション false 印刷クラスを生成する必要があるかどうかを示すブール値。
rtl
v5.0.0-beta1追加
オプション true ユーティリティをRTL(右書き)に保持する必要があるかどうかを示すブール値。

APIの説明(API explained)

すべてのユーティリティ変数は、_utilities.scss スタイルシート内の $utilities 変数に追加される。ユーティリティの各グループは次のようになる:

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

以下を出力:

CSS.opacity-0 { opacity: 0; }
.opacity-25 { opacity: .25; }
.opacity-50 { opacity: .5; }
.opacity-75 { opacity: .75; }
.opacity-100 { opacity: 1; }
【設定】
  • 新たにユーティリティクラスを作成する場合、$utilities 変数に、"グループキー"propertyvalues の設定を追加(.{property}-{value} が作成される)

プロパティ(Property)v5.1.0追加

すべてのユーティリティに必要なプロパティキーを設定する必要があり、有効なCSSプロパティが含まれている必要がある。このプロパティは、生成されたユーティリティのルールセットで使用される。クラスキーを省略するとデフォルトのクラス名としても機能。text-decoration ユーティリティについて考察:

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

出力:

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

値(Values)v5.1.0追加

values キーを使用して、生成されたクラス名とルールで指定された property のどの値を使用するかを指定。リストかマップにすることができる(ユーティリティかSass変数で設定)。

text-decoration ユーティリティのようにリストとして:

設定例
values: none underline line-through

opacity ユーティリティのようにマップとして:

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

position ユーティリティのようにリストかマップを設定するSass変数として:

設定例
values: $position-values

クラス(Class)v5.1.0「カスタム・クラスプレフィックス」から変更

コンパイルされたCSSで使用されるクラスプレフィックスを変更するには、class オプションを使用。例えば、.opacity-* から .o-* に変更:

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

出力:

CSS.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 キーごとにクラスを生成。v5.2.0追加

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

出力:

CSS.visible { visibility: visible !important; }
.invisible { visibility: hidden !important; }
【設定】
  • 新たなユーティリティクラス名に接頭辞を設定する場合、$utilities 変数に、class オプションの設定を追加(.{class}-{values} が作成される)
    設定がない場合は、.{values} が作成される

CSS変数ユーティリティ(CSS variable utilities)v5.1.0追加、v5.2.0オプション追加

css-var ブール値オプションを true に設定すると、APIは、通常の property: value ルールの代わりに、指定されたセレクターのローカルCSS変数を生成。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
    )
  ),
);

出力:

CSS.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; }
【変更履歴】
  • 【v5.2.0】
    • css-variable-name オプションを追加して、出力されるCSS変数名の変更ができる

ローカルCSS変数(Local CSS variables)v5.1.0追加

local-vars オプションを使用して、ユーティリティクラスのルールセット内でローカルCSS変数を生成するSassマップを指定。生成されたCSSルールでこれらのローカルCSS変数を使用するには、追加の作業が必要になる場合があるので注意。例として、.bg-* ユーティリティについて考察:

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

出力:

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

状態(States)v5.0.0-beta1追加

state オプションを使用して、疑似クラスのバリエーションを生成。疑似クラスの例は、:hover:focus。状態のリストが提供されると、その疑似クラスのクラス名が作成される。例えば、hoverの不透明度を変更するには、state: hover を追加すると、コンパイルされたCSSに .opacity-hover:hoverr が組み込まれる。

複数の疑似クラスが必要なら、状態のリストをスペースで区切って使用する: state: hover focus

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

出力:

CSS.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)v5.1.0「レスポンシブ・ユーティリティ」から変更

レスポンシブブール値を追加して、すべてのブレークポイントにわたってレスポンシブユーティリティ(.opacity-md-25 など)を生成。

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

出力:

CSS.opacity-0 { opacity: 0; }
.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; }
}
【設定】
  • ユーティリティクラスにレスポンシブ設定をする場合、$utilities 変数に、responsive: true, を追加(.{property}-{breakpoint}-{value} が作成される)

印刷時(Print)v5.1.0「印刷ユーティリティ」から変更

print オプションを有効にすると、印刷用のユーティリティクラスも生成できる。これは、 @media print { ... } メディアクエリ内でのみ適用される。

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

出力:

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

@media print {
  .opacity-print-0 { opacity: 0; }
  .opacity-print-25 { opacity: .25; }
  .opacity-print-50 { opacity: .5; }
  .opacity-print-75 { opacity: .75; }
  .opacity-print-100 { opacity: 1; }
}
【設定】
  • ユーティリティクラスに印刷時の設定を追加する場合、$utilities 変数に、print: true, を追加(.{class}-print-{value} が作成される)

優先度(Importance)v5.0.2追加

APIによって生成されるすべてのユーティリティには、意図したとおりにコンポーネントと修飾子クラスを再定義するために !important を組み込んでいる。scss/_variables.scss 内の $enable-important-utilities 変数(デフォルトは true)を使用して、この設定をグローバルで切り替えられる。

APIの使用(Using the API)v5.0.0-alpha3追加、v5.0.0-beta2変更

ユーティリティAPIの仕組みを理解したところで、独自のカスタムクラスを追加し、デフォルトのユーティリティを変更する方法を学習。

ユーティリティを再定義(Override utilities)v5.1.0APIの説明の「ユーティリティの変更」から移動

同じキーを使用して、既存のユーティリティを再定義。例えば、追加のレスポンシブはみ出しユーティリティクラスが必要な場合は、次のように実行できる:

設定例
custom.scss$utilities: (
  "overflow": (
    responsive: true,
    property: overflow,
    values: visible hidden scroll auto,
  ),
);

ユーティリティを追加(Add utilities)v5.3.0設定変更

新しいユーティリティは、map-merge を使用してデフォルトの $utilities マップに追加できる。必要なSassファイルと _utilities.scss が最初にインポートされていることを確認してから、map-merge を使用してユーティリティを追加。例えば、3つの値を持つレスポンシブ cursor ユーティリティを追加する方法は以下のとおり。

Bootstrap5.3.0の設定例 緑背景が5.2.0以降の変更箇所
custom.scss@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";
【変更履歴】
  • 【v5.0.0-beta2】
    • インポートするSassファイルに bootstrap/scss/functions, bootstrap/scss/variables を追加
  • 【v5.2.0】
    • インポートするSassファイルに bootstrap/scss/maps, bootstrap/scss/mixins, bootstrap/scss/utilities/api を追加
  • 【v5.3.0】
    • ダークモードを新設したので、インポートするSassファイルに bootstrap/scss/variables-dark を追加

ユーティリティを変更(Modify utilities)v5.3.0設定変更

map-get 関数と map-merge 関数を使用して、デフォルトの $utilities マップの既存のユーティリティを変更。以下の例では、width ユーティリティに値を追加。最初の map-merge から始めて、変更するユーティリティを指定。そこから、map-get を使用して入れ子になった "width" マップをフェッチし、ユーティリティのオプションと値にアクセスして変更。

Bootstrap5.3.0の設定例 緑背景が5.2.0以降の変更箇所
custom.scss@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";
【変更履歴】
  • 【v5.0.0-beta2】
    • インポートするSassファイルに bootstrap/scss/functions, bootstrap/scss/variables を追加
  • 【v5.2.0】
    • インポートするSassファイルに bootstrap/scss/maps, bootstrap/scss/mixins, bootstrap/scss/utilities/api を追加
  • 【v5.3.0】
    • ダークモードを新設したので、インポートするSassファイルに bootstrap/scss/variables-dark を追加

レスポンシブを有効にする(Enable responsive)v5.0.2追加、v5.3.0設定変更

デフォルトで現在レスポンシブではない既存のユーティリティセットのレスポンシブクラスを有効にする。例えば、border クラスをレスポンシブにするには:

Bootstrap5.3.0の設定例 緑背景が5.2.0以降の変更箇所
custom.scss@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は次のようになる:

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)v5.0.0-beta2追加、v5.3.0設定変更

v4のユーティリティがないとか別の命名規則に慣れているのなら、ユーティリティAPIを使用して、特定のユーティリティの結果のクラスが再定義できる。例えば、.ms-* ユーティリティの名前を古い .ml-* に変更:

Bootstrap5.3.0の設定例 緑背景が5.2.0以降の変更箇所
custom.scss@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";
【変更履歴】
  • 【v5.2.0】
    • インポートするSassファイルに bootstrap/scss/maps, bootstrap/scss/mixins, bootstrap/scss/utilities/api を追加
  • 【v5.3.0】
    • ダークモードを新設したので、インポートするSassファイルに bootstrap/scss/variables-dark を追加

ユーティリティを削除(Remove utilities)v5.3.0設定変更

map-remove() Sass関数を使用してデフォルトのユーティリティを削除。

Bootstrap5.3.0の設定例 緑背景が5.3.0での変更箇所
custom.scss@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-remove($utilities, "width", "float");

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

map-merge() Sass関数を使用し、グループキーを null に設定して、ユーティリティを削除することもできる。

Bootstrap5.3.0の設定例 緑背景が5.2.0以降の変更箇所
@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";
【変更履歴】
  • 【v5.0.0-beta2】
    • インポートするSassファイルに bootstrap/scss/functions, bootstrap/scss/variables を追加
  • 【v5.2.0】
    • map-remove() Sass関数を使用する方法を追加
    • map-merge() Sass関数を使用する方法では、インポートするSassファイルに bootstrap/scss/maps, bootstrap/scss/mixins, bootstrap/scss/utilities/api を追加
  • 【v5.3.0】
    • ダークモードを新設したので、インポートするSassファイルに bootstrap/scss/variables-dark を追加

ユーティリティを一度に追加、削除、変更(Add, remove, modify)v5.2.0新設、v5.3.0設定変更

map-merge() Sass関数を使用して、複数のユーティリティを一度に追加、削除、変更できる。前の例を1つの大きなマップに組み合わせる方法は次のとおり。

Bootstrap5.3.0の設定例 緑背景が5.3.0での変更箇所
@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`ユーティリティを削除
    "width": null,

    // 既存のユーティリティをレスポンシブにする
    "border": map-merge(
      map-get($utilities, "border"),
      ( responsive: true ),
    ),

    // 新しいユーティリティを追加
    "cursor": (
      property: cursor,
      class: cursor,
      responsive: true,
      values: auto pointer grab,
    )
  )
);

@import "bootstrap/scss/utilities/api";
【変更履歴】
  • 【v5.3.0】
    • ダークモードを新設したので、インポートするSassファイルに bootstrap/scss/variables-dark を追加

RTLのユーティリティを削除(Remove utility in RTL)v5.0.0-beta1追加

一部のエッジケースでは、アラビア語の改行など、RTLのスタイルが困難になる。従って、rtl オプションを false に設定することにより、出力時にRTLのユーティリティを削除できる。

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

出力:

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

RTLCSS削除制御ディレクティブのおかげで、これでRTL時に何も出力しない。