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

ボタン(Buttons)

フォーム、ダイアログなどのアクションには、Bootstrapのカスタムボタンスタイルを使用。文脈的なバリエーション、サイズ、状態などにも対応済。

※"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版での変更も含みます。

基本クラス(Base class)v5.3.0新設

Bootstrapには、パディングやコンテンツの配置などの基本的なスタイルを設定する基本的な .btn クラスがある。デフォルトでは .btn コントロールは透明な罫線と背景色を持ち、明示的なフォーカススタイルとホバースタイルはない。

見本
設定例
<button type="button" class="btn">基本クラス</button>

.btn クラスは、ボタンのバリエーションと組み合わせて使用したり、独自のカスタムスタイルの基礎として使用することが目的。

バリエーション(Variants)v5.2.0スタイル変更、v5.3.0「ボタンの設定」から変更

Bootstrapには、いくつかのボタンの種類があり、それぞれが意味上の目的を果たし、さらにコントロールするためにいくつかの余分なものが加えられている。

ボタンの種類
.btn-primary .btn-secondary
.btn-success .btn-danger .btn-warning .btn-info .btn-light .btn-dark .btn-link

裏技

.btn-{themecolor}.rounded-0 丸ボタン(1文字用):.btn-{themecolor}.rounded-circle.p-0 .btn-{themecolor}.rounded-pill .btn.btn-default-v3v5.3.0設定変更v3のDefault風ボタン
設定例
デフォルトのボタン<button type="button" class="btn btn-primary">...</button>

Primarybtn[type].btn.btn-primary

Secondarybtn[type].btn.btn-secondary

Successbtn[type].btn.btn-success

Dangerbtn[type].btn.btn-danger

Warningbtn[type].btn.btn-warning

Infobtn[type].btn.btn-info

Lightbtn[type].btn.btn-light

Darkbtn[type].btn.btn-dark

Linkbtn[type].btn.btn-link

角ボタン<button type="button" class="btn btn-primary rounded-0">角ボタン</button>
丸ボタン<button type="button" class="btn btn-primary rounded-circle p-0" style="width:2rem;height:2rem;">+</button>
長丸ボタン<button type="button" class="btn btn-primary rounded-pill">長丸ボタン</button>
v3ボタン<button type="button" class="btn btn-default-v3">v3ボタン</button>
v3ボタンのscss/css.btn-default-v3 {
  --bs-btn-color: var(--bs-body-color);
  --bs-btn-bg: var(--bs-body-bg-rgb);
  --bs-btn-border-color: var(--bs-border-color);
  --bs-btn-hover-color: var(--bs-dark);
  --bs-btn-hover-bg: var(--bs-gray-200);
  --bs-btn-hover-border-color: var(--bs-border-color);
  --bs-btn-focus-shadow-rgb: var(--bs-link-color-rgb);
  --bs-btn-active-color: var(--bs-btn-hover-color);
  --bs-btn-active-bg: var(--bs-gray-200);
  --bs-btn-active-border-color: var(--bs-btn-hover-border-color);
}
【設定】
  • <button>.btn.btn-{themecolor}.btn-{themecolor} は上記の「ボタンの種類」から選択)を入れる
    • {themecolor} は、primary, secondary, success, danger, warning, info, light, dark, link のいずれかを選択
  • ※裏技で .btn.btn-{themecolor} に、
    • .rounded-0 を追加すると角ボタン
    • .rounded-circle.p-0 を追加すると丸ボタン(幅と高さの指定も必要)
    • .rounded-pill を追加すると長丸ボタン
    • .btn-{themecolor} の代わりに、.btn-default-v3 を入れ、別途scssかcssの設定(scssとcssの設定は同じ)を追加するとv3のDefault風ボタン
    になる
【変更履歴】
  • 【v5.1.3】
    • v5.1.2でflexコンテナでのレンダリングを改善するため、.btn のスタイル設定に align-self: center を追加したが、flexコンテナ内で複数ボタンを縦積みにするとブロック表示されなくなるので、align-self: center を削除
  • 【v5.2.0】
    • border-radius の値を調整したので、若干丸みを帯びたデザインに変更
    • v3のDefault風ボタン:.btn.page-link.link-dark.btn.btn-default-v3(別途scssかcssの設定を追加)
  • 【v5.3.0】
    • v3のDefault風ボタンの設定をダークモード対応に変更

テキストの折り返しを無効にする(Disable text wrapping)

ボタンのテキストが折り返されたくない場合は、ボタン(.btn)に .text-nowrap クラスを追加する。Sass上でボタンのテキストの折り返しを無効にするには、scss/_variables.scss$btn-white-space: nowrap と設定する(デフォルトでは $btn-white-space: null に設定)。

ボタンタグ(Button tags)

.btn クラスは、<button> 要素で使用するように設計されているが、<a><input> 要素でこれらのクラスの使用もできる(ブラウザによっては若干異なるレンダリングが適用される可能性あり)。

現在のページ内の新しいページやセクションにリンクするのではなく、ページ内の機能(例えばコンテンツの折り畳みなど)を起動する <a> 要素のボタンクラスを使用する場合は、その目的をスクリーンリーダーなどの支援技術に伝えるため、これらのリンクに適切に role="button" を付ける必要がある。

見本
リンク
設定例
アンカーリンク<a>に設定<a class="btn btn-primary" href="#" role="button">リンク</a>
a.btn.btn-primary[role=button]
.btn-primary の部分はお好みのボタンカラーを選んで下さい
ボタンタグ<button>に設定<button type="submit" class="btn btn-primary">ボタン</button>
type="button":btn[type=button].btn.btn-primary
type="submit":btn:s.btn.btn-primary
type="reset":btn:r.btn.btn-primary
.btn-primary の部分はお好みのボタンカラーを選んで下さい
インプットボタンに設定<input type="button" class="btn btn-primary" value="入力する">
<input type="submit" class="btn btn-primary" value="登録する">
<input type="reset" class="btn btn-primary" value="リセット">
type="button":input:b.btn.btn-primary
type="submit":input:s.btn.btn-primary
type="reset":input:reset.btn.btn-primary
.btn-primary の部分はお好みのボタンカラーを選んで下さい
【設定】
  • <button> だけでなく、<a>, <input[type="button"]>, <input[type="submit"]>, <input[type="reset"]> のいずれかに .btn.btn-{themecolor} を入れる
アクセシビリティの設定】
  • <a> で使用する際には、role="button" 属性(支援技術にボタンの役割を伝える)を入れる

アウトラインボタン(Outline buttons)

豊かな背景色をもたらすボタンが必要なら、デフォルトの修飾子クラスを .btn-outline-* に置き換えて、ボタンの色を背景画像や色にする。
※背景色の設定がないボタン。背景画像がある場合でも邪魔になりにくい。

ボタンの種類
.btn-outline-primary .btn-outline-secondary .btn-outline-success .btn-outline-danger .btn-outline-warning .btn-outline-info .btn-outline-light※色が見やすいように背景色と余白をつけています .btn-outline-dark※ダークモードで色が見やすいように背景色と余白をつけています

裏技

.btn-outline-{themecolor}.bg-{color}
設定例
<button type="button" class="btn btn-outline-primary">...</button>

Primarybtn[type].btn.btn-outline-primary

Secondarybtn[type].btn.btn-outline-secondary

Successbtn[type].btn.btn-outline-success

Dangerbtn[type].btn.btn-outline-danger

Warningbtn[type].btn.btn-outline-warning

Infobtn[type].btn.btn-outline-info

Lightbtn[type].btn.btn-outline-light

Darkbtn[type].btn.btn-outline-dark

背景色と併用<button type="button" class="btn btn-outline-primary bg-warning">...</button>
【設定】
  • .btn.btn-outline-{themecolor}.btn-outline-{themecolor} は上記の「ボタンの種類」から選択)
    • {themecolor} は、primary, secondary, success, danger, warning, info, light, dark のいずれかを選択
【注意】
  • 背景色を合わせて設定する場合は、.btn-{themecolor} ではなく、.bg-{color} を使用すること(.bg-{color} は「背景色の種類」から選択)

ボタンのサイズ(Sizes)v5.2.0設定追加

大きめか小さめのボタンにしたいなら、追加サイズとして .btn-lg.btn-sm を追加。

サイズの種類
.btn-lg .btn-sm

(参考)

設定例
大きめのボタン<button type="button" class="btn btn-primary btn-lg">大きめ</button>
<button type="button" class="btn btn-secondary btn-lg">大きめ</button>
小さめのボタン<button type="button" class="btn btn-primary btn-sm">小さめ</button>
<button type="button" class="btn btn-secondary btn-sm">小さめ</button>
【設定】
  • .btn.btn-{themecolor}(または .btn.btn-outline-{themecolor})に .btn-{size}(上記の「サイズの種類」から選択)を追加

CSS変数を使用した独自のカスタムサイズにもできる。v5.2.0追加

見本
設定例
<button type="button" class="btn btn-primary" style="--bs-btn-padding-y: .25rem; --bs-btn-padding-x: .5rem; --bs-btn-font-size: .75rem;">カスタムボタン</button>
【設定】
  • ボタンのスタイルに --bs-btn-font-size を入れてサイズ調整ができる(--bs-btn-padding-y, --bs-btn-padding-x を入れて余白の調整もできる)

ボタンの無効化(Disabled state)v5.1.1設定変更

disabled 属性を <button> 要素に追加することによって、ボタンを非アクティブに見えるようにする。無効化されたボタンには pointer-events: none が適用され、hoverやactive状態に切り替わらなくなる。

1. <button> タグで設定

見本
設定例
<button type="button" class="btn btn-primary" disabled>無効ボタン</button>
<button type="button" class="btn btn-secondary" disabled>無効ボタン</button>
<button type="button" class="btn btn-outline-primary" disabled>無効ボタン</button>
<button type="button" class="btn btn-outline-secondary" disabled>無効ボタン</button>
【設定】
  • ボタンの設定に disabled 属性を入れる

2. <a> タグで設定 v5.1.1設定変更

<a> 要素で使用する無効化ボタンは、少し違った動作をする:

  • <a>disabled 属性をサポートしていないため、.disabled クラスを追加して視覚的に無効に見えるようにする必要がある
  • アンカーボタンのすべての pointer-events を無効にするために、将来的に使いやすいスタイルが含まれている。
  • <a> を使用する無効化ボタンには、支援技術に対する要素の状態を示すために、aria-disabled="true" 属性を含める必要がある。
  • <a> を使用する無効化ボタンには、href 属性を含めるべきではない
見本
Bootstrap5.1.1~の設定例
<a class="btn btn-primary disabled" role="button" aria-disabled="true">無効ボタン</a>
<a class="btn btn-secondary disabled" role="button" aria-disabled="true">無効ボタン</a>
※Bootstrap5.1.0の設定例 赤背景が変更箇所
<a href="#" class="btn btn-primary disabled" tabindex="-1" role="button" aria-disabled="true">無効ボタン</a>
<a href="#" class="btn btn-secondary disabled" tabindex="-1" role="button" aria-disabled="true">無効ボタン</a>
【設定】
  • <a> タグでは disabled 属性の設定ができないので .disabled を入れる
アクセシビリティの設定】
  • .disabled と同じ要素に、aria-disabled="true"(支援技術に要素が無効の状態だと伝える)を入れる
【変更履歴】
  • 【v5.1.1】
    • href 属性とtabindex="-1"(リンクにキーボードフォーカスを受け取らないようにする)の設定が不要に(参考、v4.6.1でバックポート)
      ※他の無効リンクとは違い、role="button" がある場合には aria-disabled="true" の設定は必要

無効化されたリンクで href 属性を保持する必要がある場合をカバーするために、.disabled クラスは pointer-events: none を使用して <a> のリンク機能を無効にしようとする。このCSSプロパティはまだHTMLに対して標準化されていないが、最近のすべてのブラウザがサポートしているので注意。さらに pointer-events: none をサポートするブラウザであっても、キーボードナビゲーションは影響を受けない。つまりこれは晴眼者キーボードユーザーと支援技術ユーザーが引き続きこれらのリンクをアクティブにできることを意味する。従って安全のために、aria-disabled="true" に加えて、これらのリンクに tabindex="-1" 属性を含めて、それらがキーボードフォーカスを受け取らないようにし、カスタムJavaScriptを使用してそれらの機能を完全に無効にする。

見本
設定例
<a href="#" class="btn btn-primary disabled" tabindex="-1" role="button" aria-disabled="true">無効ボタン</a>
<a href="#" class="btn btn-secondary disabled" tabindex="-1" role="button" aria-disabled="true">無効ボタン</a>
【設定】
  • a.btn.btn-{themecolor}.disabledhref 属性が必要な場合は tabindex="-1"(リンクにキーボードフォーカスを受け取らないようにする)の設定が必要

ブロックボタン(Block buttons)v5.3.1設定変更

1.常にブロックボタン

表示ユーティリティギャップユーティリティを組み合わせて、Bootstrap4のような縦積みレスポンシブの全幅"ブロックボタン"を作成。

見本

ボタンが2つの場合

ボタンが1つの場合

<a> タグの場合v5.3.1設定変更

Bootstrap5.xの設定例 緑背景が変更箇所
ボタンが2つの場合<div class="d-grid gap-2">
  <button type="button" class="btn btn-primary">ボタン</button>
  <button type="button" class="btn btn-primary">ボタン</button>
</div>
ボタンが1つの場合<button type="button" class="btn btn-primary w-100">ボタン</button>
<a> タグを使用<div class="d-grid gap-2">
  <a href="#" class="btn btn-primary w-100" role="button">ボタン</a>
  <a href="#" class="btn btn-primary w-100" role="button">ボタン</a>
</div>
※Bootstrap4.xの設定例 赤背景が変更箇所
ボタンが2つの場合<button type="button" class="btn btn-primary btn-block">ボタン</button>
<button type="button" class="btn btn-primary btn-block">ボタン</button>
ボタンが1つの場合<button type="button" class="btn btn-primary btn-block">ボタン</button>
<a> タグを使用<a href="#" class="btn btn-primary btn-block mb-1" role="button">ボタン</a>
<a href="#" class="btn btn-primary btn-block" role="button">ボタン</a>

2.モバイルではブロックボタン

ここでは、垂直に積み重ねられたボタンから、md ブレークポイントで .d-md-block.d-grid クラスを置き換え、gap-2 ユーティリティを無効にするレスポンシブバリエーションを作成。ブラウザのサイズを変更して、その変更をご確認下さい。

見本

<button> タグを使用

<a> タグを使用 v5.1.0設定変更

Bootstrap5.xの設定例 緑背景が変更箇所
<button> タグを使用<div class="d-grid gap-2 d-md-block">
  <button type="button" class="btn btn-primary">ボタン</button>
  <button type="button" class="btn btn-primary">ボタン</button>
</div>
<a> タグを使用<div class="d-flex flex-column flex-md-row gap-2">
  <a href="#" class="btn btn-primary" role="button">ボタン</a>
  <a href="#" class="btn btn-primary" role="button">ボタン</a>
</div>
※Bootstrap4.xの設定例 赤背景が変更箇所
<button> タグを使用<div class="d-flex flex-column flex-md-row">
  <button type="button" class="btn btn-primary flex-fill flex-md-grow-0">ボタン</button>
  <button type="button" class="btn btn-primary flex-fill flex-md-grow-0 ml-md-1 mt-1 mt-md-0">ボタン</button>
</div>
<a> タグを使用<a href="#" class="btn btn-primary d-block d-md-inline-block mb-2 mb-md-0" role="button">ボタン</a>
<a href="#" class="btn btn-primary d-block d-md-inline-block mb-2 mb-md-0" role="button">ボタン</a>

3.半分の幅のブロックボタン

グリッド列幅クラスを使用してブロックボタンの幅を調整。例えば、半分の幅の"ブロックボタン"にする場合は、.col-6 を使用。.mx-auto で水平方向で中央揃えにもする。

見本
設定例
<div class="d-grid gap-2 col-6 mx-auto">
  <button type="button" class="btn btn-primary">ボタン</button>
  <button type="button" class="btn btn-primary">ボタン</button>
</div>

4.積み重ならない場合は行末揃え

追加のユーティリティを使用して、水平の場合のボタンの配置を調整。ここでは、2.のレスポンシブの例を取り上げ、ボタンにいくつかのFlexユーティリティとマージンユーティリティを追加して、ボタンが積み重ならないときはボタンを行末揃えにする。

見本
設定例
<div class="d-grid gap-2 d-md-flex justify-content-md-end">
  <button type="button" class="btn btn-primary me-md-2">ボタン</button>
  <button type="button" class="btn btn-primary">ボタン</button>
</div>

積み重ねヘルパーを使用した設定もできる。

【設定】
  • ボタンを div.d-grid.gap-{size} で囲む(ボタンごとにグリッド表示になる)
  • モバイルではブロックボタン(<button> タグの場合):div.d-grid.gap-{size}.d-md-block を追加(md 以上で全体が横並び表示になる)
  • モバイルではブロックボタン(<a> タグの場合):div.d-flex.flex-column.flex-md-row.gap-{size} で囲む(md 以上で全体が横並び表示になる)
  • div.d-grid.gap-{size}.col-{size} を追加すれば、幅の調整が可能
  • div.d-grid.gap-{size}.d-md-flex.justify-content-md-end を追加すれば、md 以上で全体が行末揃えされる
【変更履歴】
  • 【v5.0.0-alpha3】
    • ボタンが2つの場合:.btn.btn-{themecolor}.btn-blockdiv.d-grid.gap-{size} > .btn.btn-{themecolor}
    • ボタンが1つの場合や <a> タグの場合:.btn.btn-{themecolor}.btn-block.btn.btn-{themecolor}.w-100
    • .btn-block は廃止
  • 【v5.0.0-beta2】
    • モバイルのみブロック表示(<a> タグの場合):div.d-grid.gap-2.d-md-flex > <div> > .btn.btn-{themecolor}.w-100div.d-grid.gap-2.d-flex.flex-column.d-md-inline-flex.flex-md-row > .btn.btn-{themecolor}
  • 【v5.1.0】
    • モバイルのみブロック表示(<a> タグの場合):div.d-grid.gap-2.d-flex.flex-column.d-md-inline-flex.flex-md-rowdiv.d-flex.flex-column.flex-md-row.gap-2
  • 【v5.3.1】
    • 常にブロック表示の <a> タグの場合でも div.d-grid.gap-{size} で囲む設定に変更

ボタンプラグイン(Button plugin)

ボタンプラグインを使用すると、簡単なオン/オフの切替ボタンが作成できる。

切替ボタン(Toggle states)v5.3.1設定変更

ボタンをプッシュ状態に切り替えるには、data-bs-toggle="button" を追加。ボタンをあらかじめプッシュ状態に切り替えておく場合は、手動で .active クラス aria-pressed="true"<button> に追加する必要がある。

1. button.btn を使用

見本

基本クラスボタンの場合

Primaryボタンの場合

Bootstrap5.xの設定例 緑背景がv5.0.0-beta1での変更箇所
基本クラスボタンの場合<p class="d-inline-flex gap-1">
  <button type="button" class="btn" data-bs-toggle="button">通常の状態</button>
  <button type="button" class="btn active" data-bs-toggle="button" aria-pressed="true">アクティブ状態</button>
  <button type="button" class="btn" disabled data-bs-toggle="button">無効な状態</button>
</p>
Primaryボタンの場合<p class="d-inline-flex gap-1">
  <button type="button" class="btn btn-primary" data-bs-toggle="button">通常の状態</button>
  <button type="button" class="btn btn-primary active" data-bs-toggle="button" aria-pressed="true">アクティブ状態</button>
  <button type="button" class="btn btn-primary" data-bs-toggle="button" disabled>無効な状態</button>
</p>

2. a.btn を使用 v5.1.1設定変更

見本
Bootstrap5.xの設定例 緑背景がv5.0.0-beta1での変更箇所
基本クラスボタンの場合<p class="d-inline-flex gap-1">
  <a href="#" class="btn" role="button" data-bs-toggle="button">通常の状態</a>
  <a href="#" class="btn active" role="button" data-bs-toggle="button" aria-pressed="true">アクティブ状態</a>
  <a class="btn disabled" aria-disabled="true" role="button" data-bs-toggle="button">無効な状態</a>
</p>
Primaryボタンの場合<p class="d-inline-flex gap-1">
  <a href="#" class="btn btn-primary" role="button" data-bs-toggle="button">通常の状態</a>
  <a href="#" class="btn btn-primary active" role="button" data-bs-toggle="button" aria-pressed="true">アクティブ状態</a>
  <a class="btn btn-primary disabled" aria-disabled="true" role="button" data-bs-toggle="button">無効な状態</a>
</p>
【設定】
  • .btn.btn-{themecolor}(または .btn.btn-outline-{themecolor})に data-bs-toggle="button" を入れる
  • ボタンをあらかじめプッシュ状態に切り替えておく場合は、.btn.btn-{themecolor}(または .btn.btn-outline-{themecolor})に .active を追加し、data-bs-toggle="button"aria-pressed="true"(支援技術にボタンが押されている状態だと伝える属性)を入れる
【変更履歴】
  • 【v5.0.0-beta1】
    • data- 属性に名前空間 bs- を追加
      • [data-toggle="button"][data-bs-toggle="button"]
  • 【v5.1.1】
    • a.btn で無効な状態にする場合、href 属性と tabindex="-1"(リンクにキーボードフォーカスを受け取らないようにする)の設定が不要に(v4.6.1でバックポート)
  • 【v5.3.1】
    • 基本クラスボタンの設定を追加

メソッド(Methods)v5.0.2メソッド追加、v5.2.0JavaScript変更

ボタンコンストラクタを使用してボタンインスタンスを作成できる。以下に例を表示:

Bootstrap5.2.0~の設定例 緑背景が5.2.0での変更箇所
JavaScriptconst bsButton = new bootstrap.Button('#myButton')
※Bootstrap5.1.xの設定例 赤背景が5.2.0での変更箇所
JavaScriptvar button = document.getElementById('myButton')
var bsButton = new bootstrap.Button(button)
メソッド 説明
dispose 要素のボタンを破棄(DOM要素に保存されているデータを削除)。
getInstance
v5.0.2追加
DOM要素に関連付けられたボタン・インスタンスを取得する静的メソッドで、次のように使用可能:bootstrap.Button.getInstance(element)
getOrCreateInstance
v5.0.2追加
DOM要素に関連付けられたボタン・インスタンスを取得したり、初期化されていない場合に新しいインスタンスを作成したりする静的メソッド。次のように使用可能:bootstrap.Button.getOrCreateInstance(element)
toggle プッシュ状態を切り替える。ボタンをアクティブ化された外観にする。

例えば、すべてのボタンを切り替えるには:

JavaScriptdocument.querySelectorAll('.btn').forEach(buttonElement => {
  const button = bootstrap.Button.getOrCreateInstance(buttonElement)
  button.toggle()
})
【変更履歴】
  • 【v5.0.0-alpha1】
  • 【v5.0.2】
    • getInstance, getOrCreateInstance メソッドが追加
  • 【v5.2.0】
    • JavaScriptの記述をES6(ES2015)に変更

CSS v5.0.0-beta3追加、v5.2.0Sassから名称変更

CSS変数(Variables)v5.2.0設定移行

Bootstrapの進化するCSS変数アプローチの一環として、ボタンは、リアルタイムのカスタマイズを強化するために、.button でローカルCSS変数を使用するようにした。CSS変数の値はSassを経由して設定されるため、Sassのカスタマイズも引き続きサポートされる。

デフォルトの設定
scss/_buttons.scss 内 btn-css-vars の設定--#{$prefix}btn-padding-x: #{$btn-padding-x};
--#{$prefix}btn-padding-y: #{$btn-padding-y};
--#{$prefix}btn-font-family: #{$btn-font-family};
@include rfs($btn-font-size, --#{$prefix}btn-font-size);
--#{$prefix}btn-font-weight: #{$btn-font-weight};
--#{$prefix}btn-line-height: #{$btn-line-height};
--#{$prefix}btn-color: #{$body-color};
--#{$prefix}btn-bg: transparent;
--#{$prefix}btn-border-width: #{$btn-border-width};
--#{$prefix}btn-border-color: transparent;
--#{$prefix}btn-border-radius: #{$btn-border-radius};
--#{$prefix}btn-hover-border-color: transparent;
--#{$prefix}btn-box-shadow: #{$btn-box-shadow};
--#{$prefix}btn-disabled-opacity: #{$btn-disabled-opacity};
--#{$prefix}btn-focus-box-shadow: 0 0 0 #{$btn-focus-width} rgba(var(--#{$prefix}btn-focus-shadow-rgb), .5);

.btn-* 修飾子クラスは適切なCSS変数を更新して、button-variant(), button-outline-variant(), button-size() ミックスインを使用して追加のCSSルールを最小限に抑える。

以下は、BootstrapのCSS変数を独自のCSS変数とSass変数の混合で再割り当てすることで、解説の固有のボタンと同様なカスタム .btn-* 修飾クラスを構築する例。

見本
設定例
HTML<button type="button" class="btn btn-bd-primary">カスタムボタン</button>
custom.scss.btn-bd-primary {
  --bs-btn-font-weight: 600;
  --bs-btn-color: var(--bs-white);
  --bs-btn-bg: var(--bd-violet-bg);
  --bs-btn-border-color: var(--bd-violet-bg);
  --bs-btn-hover-color: var(--bs-white);
  --bs-btn-hover-bg: #{shade-color($bd-violet, 10%)};
  --bs-btn-hover-border-color: #{shade-color($bd-violet, 10%)};
  --bs-btn-focus-shadow-rgb: var(--bd-violet-rgb);
  --bs-btn-active-color: var(--bs-btn-hover-color);
  --bs-btn-active-bg: #{shade-color($bd-violet, 20%)};
  --bs-btn-active-border-color: #{shade-color($bd-violet, 20%)};
}
--bd-violetの作成用scss$bd-purple:        #4c0bce;
$bd-violet:        lighten(saturate($bd-purple, 5%), 15%);

:root,
[data-bs-theme="light"] {
  --bd-violet: #{$bd-violet};
  --bd-violet-rgb: #{to-rgb($bd-violet)};
  --bd-violet-bg: var(--bd-violet);
}

@include color-mode(dark, true) {
  --bd-violet: #{mix($bd-violet, $white, 75%)};
  --bd-violet-bg: #{$bd-violet};
}

Sass変数(Sass variables)v5.2.0変数から名称変更

デフォルトの設定
scss/_variables.scss 内 btn-variables の設定$btn-color:                   var(--#{$prefix}body-color);
$btn-padding-y:               $input-btn-padding-y;
$btn-padding-x:               $input-btn-padding-x;
$btn-font-family:             $input-btn-font-family;
$btn-font-size:               $input-btn-font-size;
$btn-line-height:             $input-btn-line-height;
$btn-white-space:             null; // テキストの折り返しを防ぐには、`nowrap`に設定

$btn-padding-y-sm:            $input-btn-padding-y-sm;
$btn-padding-x-sm:            $input-btn-padding-x-sm;
$btn-font-size-sm:            $input-btn-font-size-sm;

$btn-padding-y-lg:            $input-btn-padding-y-lg;
$btn-padding-x-lg:            $input-btn-padding-x-lg;
$btn-font-size-lg:            $input-btn-font-size-lg;

$btn-border-width:            $input-btn-border-width;

$btn-font-weight:             $font-weight-normal;
$btn-box-shadow:              inset 0 1px 0 rgba($white, .15), 0 1px 1px rgba($black, .075);
$btn-focus-width:             $input-btn-focus-width;
$btn-focus-box-shadow:        $input-btn-focus-box-shadow;
$btn-disabled-opacity:        .65;
$btn-active-box-shadow:       inset 0 3px 5px rgba($black, .125);

$btn-link-color:              var(--#{$prefix}link-color);
$btn-link-hover-color:        var(--#{$prefix}link-hover-color);
$btn-link-disabled-color:     $gray-600;
$btn-link-focus-shadow-rgb:   to-rgb(mix(color-contrast($link-color), $link-color, 15%));

// グローバルな境界の角丸とは別にボタンの角丸をカスタマイズ
$btn-border-radius:           var(--#{$prefix}border-radius);
$btn-border-radius-sm:        var(--#{$prefix}border-radius-sm);
$btn-border-radius-lg:        var(--#{$prefix}border-radius-lg);

$btn-transition:              color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out;

$btn-hover-bg-shade-amount:       15%;
$btn-hover-bg-tint-amount:        15%;
$btn-hover-border-shade-amount:   20%;
$btn-hover-border-tint-amount:    10%;
$btn-active-bg-shade-amount:      20%;
$btn-active-bg-tint-amount:       20%;
$btn-active-border-shade-amount:  25%;
$btn-active-border-tint-amount:   10%;

Sassミックスイン(Sass mixins)v5.2.0mixinから名称変更

ボタンには、通常のボタンとアウトラインボタンのバリエーションミックスイン(どちらも $theme-colors に基づく)とボタンサイズのミックスインの3つのミックスインがある。

デフォルトの設定
scss/mixins/_buttons.scss 内 btn-variant-mixin の設定@mixin button-variant(
  $background,
  $border,
  $color: color-contrast($background),
  $hover-background: if($color == $color-contrast-light, shade-color($background, $btn-hover-bg-shade-amount), tint-color($background, $btn-hover-bg-tint-amount)),
  $hover-border: if($color == $color-contrast-light, shade-color($border, $btn-hover-border-shade-amount), tint-color($border, $btn-hover-border-tint-amount)),
  $hover-color: color-contrast($hover-background),
  $active-background: if($color == $color-contrast-light, shade-color($background, $btn-active-bg-shade-amount), tint-color($background, $btn-active-bg-tint-amount)),
  $active-border: if($color == $color-contrast-light, shade-color($border, $btn-active-border-shade-amount), tint-color($border, $btn-active-border-tint-amount)),
  $active-color: color-contrast($active-background),
  $disabled-background: $background,
  $disabled-border: $border,
  $disabled-color: color-contrast($disabled-background)
) {
  --#{$prefix}btn-color: #{$color};
  --#{$prefix}btn-bg: #{$background};
  --#{$prefix}btn-border-color: #{$border};
  --#{$prefix}btn-hover-color: #{$hover-color};
  --#{$prefix}btn-hover-bg: #{$hover-background};
  --#{$prefix}btn-hover-border-color: #{$hover-border};
  --#{$prefix}btn-focus-shadow-rgb: #{to-rgb(mix($color, $border, 15%))};
  --#{$prefix}btn-active-color: #{$active-color};
  --#{$prefix}btn-active-bg: #{$active-background};
  --#{$prefix}btn-active-border-color: #{$active-border};
  --#{$prefix}btn-active-shadow: #{$btn-active-box-shadow};
  --#{$prefix}btn-disabled-color: #{$disabled-color};
  --#{$prefix}btn-disabled-bg: #{$disabled-background};
  --#{$prefix}btn-disabled-border-color: #{$disabled-border};
}
scss/mixins/_buttons.scss 内 btn-outline-variant-mixin の設定@mixin button-outline-variant(
  $color,
  $color-hover: color-contrast($color),
  $active-background: $color,
  $active-border: $color,
  $active-color: color-contrast($active-background)
) {
  --#{$prefix}btn-color: #{$color};
  --#{$prefix}btn-border-color: #{$color};
  --#{$prefix}btn-hover-color: #{$color-hover};
  --#{$prefix}btn-hover-bg: #{$active-background};
  --#{$prefix}btn-hover-border-color: #{$active-border};
  --#{$prefix}btn-focus-shadow-rgb: #{to-rgb($color)};
  --#{$prefix}btn-active-color: #{$active-color};
  --#{$prefix}btn-active-bg: #{$active-background};
  --#{$prefix}btn-active-border-color: #{$active-border};
  --#{$prefix}btn-active-shadow: #{$btn-active-box-shadow};
  --#{$prefix}btn-disabled-color: #{$color};
  --#{$prefix}btn-disabled-bg: transparent;
  --#{$prefix}gradient: none;
}
scss/mixins/_buttons.scss 内 btn-size-mixin の設定@mixin button-size($padding-y, $padding-x, $font-size, $border-radius) {
  --#{$prefix}btn-padding-y: #{$padding-y};
  --#{$prefix}btn-padding-x: #{$padding-x};
  @include rfs($font-size, --#{$prefix}btn-font-size);
  --#{$prefix}btn-border-radius: #{$border-radius};
}

Sassループ(Sass loops)v5.2.0ループから名称変更

ボタンバリエーション(通常のボタンとアウトラインボタン用)は、それぞれのミックスインを $theme-colors マップで使用して、scss/_buttons.scss に修飾子クラスを生成。

デフォルトの設定
scss/_buttons.scss 内 btn-variant-loops の設定@each $color, $value in $theme-colors {
  .btn-#{$color} {
    @if $color == "light" {
      @include button-variant(
        $value,
        $value,
        $hover-background: shade-color($value, $btn-hover-bg-shade-amount),
        $hover-border: shade-color($value, $btn-hover-border-shade-amount),
        $active-background: shade-color($value, $btn-active-bg-shade-amount),
        $active-border: shade-color($value, $btn-active-border-shade-amount)
      );
    } @else if $color == "dark" {
      @include button-variant(
        $value,
        $value,
        $hover-background: tint-color($value, $btn-hover-bg-tint-amount),
        $hover-border: tint-color($value, $btn-hover-border-tint-amount),
        $active-background: tint-color($value, $btn-active-bg-tint-amount),
        $active-border: tint-color($value, $btn-active-border-tint-amount)
      );
    } @else {
      @include button-variant($value, $value);
    }
  }
}

@each $color, $value in $theme-colors {
  .btn-outline-#{$color} {
    @include button-outline-variant($value);
  }
}