GitHubで表示

Bootstrapのテーマ設定

Bootstrap 4 を、グローバルなスタイルの設定を簡単に行える、組み込みの新しいSass変数を使用してカスタマイズし、テーマ設定やコンポーネントの変更を容易に行えるようにします。

イントロダクション

Bootstrap 3では、テーマ設定は主にLESSの変数上書き、カスタムCSS、および`dist`ファイルに含まれていた別のテーマスタイルシートによって行われていました。多少の労力で、コアファイルに触れることなくBootstrap 3の外観を完全に再設計することができました。Bootstrap 4は、馴染みがあるものの、わずかに異なるアプローチを提供します。

現在、テーマ設定はSass変数、Sassマップ、およびカスタムCSSによって行われます。専用のテーマスタイルシートはなくなりました。代わりに、組み込みテーマを有効にして、グラデーション、シャドウなどを追加できます。

Sass

独自の資産パイプラインを使用してSassをコンパイルするときに、ソースSassファイルを利用して、変数、マップ、mixinなどを活用してください。

ファイル構造

可能な限り、Bootstrapのコアファイルを変更しないでください。Sassの場合、Bootstrapをインポートする独自のスタイルシートを作成して、変更および拡張できるようにすることを意味します。npmのようなパッケージマネージャーを使用していると仮定すると、次のようなファイル構造になります。

your-project/
├── scss
│   └── custom.scss
└── node_modules/
    └── bootstrap
        ├── js
        └── scss

ソースファイルをダウンロードし、パッケージマネージャーを使用していない場合は、Bootstrapのソースファイルを独自のものとは別に保持して、同様の構造を手動で設定する必要があります。

your-project/
├── scss
│   └── custom.scss
└── bootstrap/
    ├── js
    └── scss

インポート

`custom.scss`で、BootstrapのソースSassファイルをインポートします。2つのオプションがあります。Bootstrapのすべてを含めるか、必要な部分を選択します。後者を推奨しますが、コンポーネント全体でいくつかの要件と依存関係があることに注意してください。また、プラグイン用のJavaScriptも含める必要があります。

// Custom.scss
// Option A: Include all of Bootstrap

// Include any default variable overrides here (though functions won't be available)

@import "../node_modules/bootstrap/scss/bootstrap";

// Then add additional custom code here
// Custom.scss
// Option B: Include parts of Bootstrap

// 1. Include functions first (so you can manipulate colors, SVGs, calc, etc)
@import "../node_modules/bootstrap/scss/functions";

// 2. Include any default variable overrides here

// 3. Include remainder of required Bootstrap stylesheets
@import "../node_modules/bootstrap/scss/variables";
@import "../node_modules/bootstrap/scss/mixins";

// 4. Include any optional Bootstrap components as you like
@import "../node_modules/bootstrap/scss/reboot";
@import "../node_modules/bootstrap/scss/type";
@import "../node_modules/bootstrap/scss/images";
@import "../node_modules/bootstrap/scss/code";
@import "../node_modules/bootstrap/scss/grid";

この設定を適切に行うと、`custom.scss`でSass変数とマップを変更し始めることができます。必要に応じて、`// Optional`セクションの下にBootstrapの一部を追加することもできます。`bootstrap.scss`ファイルからの完全なインポートスタックを開始点として使用することをお勧めします。

変数のデフォルト

BootstrapのすべてのSass変数には、`!default`フラグが含まれており、Bootstrapのソースコードを変更せずに、Sassで変数のデフォルト値を上書きできます。必要に応じて変数をコピーアンドペーストし、値を変更して、`!default`フラグを削除します。変数がすでに割り当てられている場合、Bootstrapのデフォルト値によって再割り当てされることはありません。

Bootstrapの変数の完全なリストは、`scss/_variables.scss`にあります。一部の変数は`null`に設定されています。これらの変数は、構成で上書きされない限り、プロパティを出力しません。

変数の上書きは、関数、変数、mixinがインポートされた後、残りのインポートの前に来る必要があります。

以下は、npmを介してBootstrapをインポートおよびコンパイルするときに、`<body>`の`background-color`と`color`を変更する例です。

@import "../node_modules/bootstrap/scss/functions";

// Default variable overrides
$body-bg: #000;
$body-color: #111;

// Required
@import "../node_modules/bootstrap/scss/variables";
@import "../node_modules/bootstrap/scss/mixins";

// Optional Bootstrap components here
@import "../node_modules/bootstrap/scss/root";
@import "../node_modules/bootstrap/scss/reboot";
@import "../node_modules/bootstrap/scss/type";
// etc

グローバルオプションを含む、Bootstrapのすべての変数に対して必要に応じて繰り返します。

スタータープロジェクトを使用してnpm経由でBootstrapを始めましょう! twbs/bootstrap-npm-starterテンプレートリポジトリにアクセスして、独自のnpmプロジェクトでBootstrapを構築およびカスタマイズする方法を確認してください。Sassコンパイラー、Autoprefixer、Stylelint、PurgeCSS、およびBootstrapアイコンが含まれています。

マップとループ

Bootstrap 4には、関連するCSSのファミリを簡単に生成できるようにする、キーと値のペアである、いくつかのSassマップが含まれています。色、グリッドブレークポイントなどにSassマップを使用しています。Sass変数と同様に、すべてのSassマップには`!default`フラグが含まれており、上書きおよび拡張できます。

一部のSassマップは、デフォルトで空のマップにマージされています。これは、特定のSassマップを簡単に拡張できるようにするために行われますが、マップからアイテムを*削除*することをわずかに難しくするという代償が伴います。

マップの変更

`$theme-colors`マップ内の既存の色を変更するには、カスタムSassファイルに次を追加します。

$theme-colors: (
  "primary": #0074d9,
  "danger": #ff4136
);

マップに追加

`$theme-colors`に新しい色を追加するには、新しいキーと値を追加します。

$theme-colors: (
  "custom-color": #900
);

マップから削除

`$theme-colors`またはその他のマップから色を削除するには、`map-remove`を使用します。必須項目とオプションの間に入れる必要があることに注意してください。

// Required
@import "../node_modules/bootstrap/scss/functions";
@import "../node_modules/bootstrap/scss/variables";
@import "../node_modules/bootstrap/scss/mixins";

$theme-colors: map-remove($theme-colors, "info", "light", "dark");

// Optional
@import "../node_modules/bootstrap/scss/root";
@import "../node_modules/bootstrap/scss/reboot";
@import "../node_modules/bootstrap/scss/type";
...

必須キー

Bootstrapは、Sassマップ内で、私たち自身が使用および拡張するときにいくつかの特定のキーの存在を想定しています。含まれているマップをカスタマイズすると、特定のSassマップのキーが使用されているエラーが発生する場合があります。

たとえば、リンク、ボタン、フォームの状態には、`$theme-colors`から`primary`、`success`、`danger`キーを使用します。これらのキーの値を置き換えても問題は発生しませんが、削除するとSassのコンパイルの問題が発生する可能性があります。このような場合は、これらの値を使用するSassコードを変更する必要があります。

関数

BootstrapはいくつかのSass関数を利用していますが、一般的なテーマ設定に適用できるのはごく一部だけです。カラーマップから値を取得するための3つの関数が含まれています。

@function color($key: "blue") {
  @return map-get($colors, $key);
}

@function theme-color($key: "primary") {
  @return map-get($theme-colors, $key);
}

@function gray($key: "100") {
  @return map-get($grays, $key);
}

これにより、v3からカラー変数を使用する方法とよく似た方法で、Sassマップから1つの色を選択できます。

.custom-element {
  color: gray("100");
  background-color: theme-color("dark");
}

`$theme-colors`マップから特定の色*レベル*を取得するための別の関数もあります。負のレベル値は色を明るくし、高いレベルは色を暗くします。

@function theme-color-level($color-name: "primary", $level: 0) {
  $color: theme-color($color-name);
  $color-base: if($level > 0, #000, #fff);
  $level: abs($level);

  @return mix($color-base, $color, $level * $theme-color-interval);
}

実際には、関数を呼び出し、2つのパラメーターを渡します。`$theme-colors`からの色の名前(例:primaryまたはdanger)と数値レベルです。

.custom-element {
  color: theme-color-level(primary, -10);
}

追加の関数は、将来追加したり、独自のカスタムSassで追加して、追加のSassマップのレベル関数を作成したり、より詳細に記述したい場合は汎用関数を作成したりできます。

色のコントラスト

Bootstrapに含まれている追加の関数は、色のコントラスト関数、`color-yiq`です。これは、YIQカラースペースを利用して、指定されたベースカラーに基づいて、明るい(`#fff`)または暗い(`#111`)コントラストカラーを自動的に返します。この関数は、複数のクラスを生成するmixinまたはループで特に役立ちます。

たとえば、`$theme-colors`マップからカラーサンプルを生成するには

@each $color, $value in $theme-colors {
  .swatch-#{$color} {
    color: color-yiq($value);
  }
}

1回限りのコントラストのニーズにも使用できます。

.custom-element {
  color: color-yiq(#000); // returns `color: #fff`
}

カラーマップ関数を使用してベースカラーを指定することもできます。

.custom-element {
  color: color-yiq(theme-color("dark")); // returns `color: #fff`
}

SVGのエスケープ

`escape-svg`関数を使用して、SVG背景画像の`<`、`>`、および`#`文字をエスケープします。これらの文字は、IEで背景画像を適切にレンダリングするためにエスケープする必要があります。`escape-svg`関数を使用する場合、データURIは引用符で囲む必要があります。

加算および減算関数

CSSの`calc`関数をラップするために、`add`および`subtract`関数を使用します。これらの関数の主な目的は、「単位なし」の`0`値が`calc`式に渡された場合にエラーを回避することです。`calc(10px - 0)`のような式は、数学的に正しいにもかかわらず、すべてのブラウザーでエラーを返します。

calcが有効な例

$border-radius: .25rem;
$border-width: 1px;

.element {
  // Output calc(.25rem - 1px) is valid
  border-radius: calc($border-radius - $border-width);
}

.element {
  // Output the same calc(.25rem - 1px) as above
  border-radius: subtract($border-radius, $border-width);
}

calcが無効な例

$border-radius: .25rem;
$border-width: 0;

.element {
  // Output calc(.25rem - 0) is invalid
  border-radius: calc($border-radius - $border-width);
}

.element {
  // Output .25rem
  border-radius: subtract($border-radius, $border-width);
}

Sassオプション

組み込みのカスタム変数ファイルを使用してBootstrap 4をカスタマイズし、新しい`$enable-*` Sass変数を使用してグローバルCSS設定を簡単に切り替えます。必要に応じて変数の値を上書きし、`npm run test`を使用して再コンパイルします。

Bootstrapの`scss/_variables.scss`ファイルで、主要なグローバルオプションのこれらの変数を見つけてカスタマイズできます。

変数 説明
$spacer `1rem`(デフォルト)、または0より大きい任意の値 スペーサーユーティリティをプログラムで生成するためのデフォルトのスペーサー値を指定します。
$enable-rounded `true`(デフォルト)または`false` さまざまなコンポーネントで定義済みの`border-radius`スタイルを有効にします。
$enable-shadows `true`または`false`(デフォルト) さまざまなコンポーネントで定義済みの装飾的な`box-shadow`スタイルを有効にします。フォーカス状態に使用される`box-shadow`には影響しません。
$enable-gradients `true`または`false`(デフォルト) さまざまなコンポーネントで`background-image`スタイルを介して定義済みのグラデーションを有効にします。
$enable-transitions `true`(デフォルト)または`false` さまざまなコンポーネントで定義済みの`transition`を有効にします。
$enable-prefers-reduced-motion-media-query `true`(デフォルト)または`false` ユーザーのブラウザ/オペレーティングシステムの環境設定に基づいて、特定のアニメーション/トランジションを抑制する`prefers-reduced-motion`メディアクエリを有効にします。
$enable-hover-media-query `true`または`false`(デフォルト) 非推奨
$enable-grid-classes `true`(デフォルト)または`false` グリッドシステム(例:`.container`、`.row`、`.col-md-1`など)のCSSクラスの生成を有効にします。
$enable-caret `true`(デフォルト)または`false` `.dropdown-toggle`に擬似要素キャレットを有効にします。
$enable-pointer-cursor-for-buttons `true`(デフォルト)または`false` 無効になっていないボタン要素に「手の形」カーソルを追加します。
$enable-print-styles `true`(デフォルト)または`false` 印刷を最適化するためのスタイルを有効にします。
$enable-responsive-font-sizes `true`または`false`(デフォルト) レスポンシブフォントサイズを有効にします。
$enable-validation-icons `true`(デフォルト)または`false` テキスト入力内およびいくつかのカスタムフォームで、検証状態の`background-image`アイコンを有効にします。
$enable-deprecation-messages `true`(デフォルト)または`false` v5で削除される予定の非推奨のmixinおよび関数を使用する際の警告を非表示にするには、`false`に設定します。

Bootstrapのさまざまなコンポーネントとユーティリティの多くは、Sassマップで定義された一連の色を使用して構築されています。このマップはSassでループ処理して、一連のルールセットをすばやく生成できます。

すべての色

Bootstrap 4で利用可能なすべての色は、`scss/_variables.scss`ファイル内のSass変数およびSassマップとして利用できます。これは、グレースケールパレットと同様に、後続のマイナーリリースで追加のシェードを追加するために拡張されます。

$blue #007bff
$indigo #6610f2
$purple #6f42c1
$pink #e83e8c
$red #dc3545
$orange #fd7e14
$yellow #ffc107
$green #28a745
$teal #20c997
$cyan #17a2b8

Sassでこれらを使用する方法は次のとおりです。

// With variable
.alpha { color: $purple; }

// From the Sass map with our `color()` function
.beta { color: color("purple"); }

カラーユーティリティクラスは、colorbackground-colorを設定するためにも利用できます。

将来的には、以下のグレースケールカラーと同様に、各色のシェードのSassマップと変数を提供する予定です。

テーマカラー

Bootstrapのscss/_variables.scssファイルにあるSass変数とSassマップとしても利用可能な、カラースキームを生成するための小さなカラーパレットを作成するために、すべての色のサブセットを使用します。

$primary #007bff
$secondary #6c757d
$success #28a745
$danger #dc3545
$warning #ffc107
$info #17a2b8
$light #f8f9fa
$dark #343a40

グレースケール

プロジェクト全体で一貫したグレーのシェードを実現するための、広範なグレー変数とscss/_variables.scss内のSassマップ。これらはニュートラルなグレーではなく、微妙な青色のトーンに傾いている「クールグレー」であることに注意してください。

$gray-100 #f8f9fa
$gray-200 #e9ecef
$gray-300 #dee2e6
$gray-400 #ced4da
$gray-500 #adb5bd
$gray-600 #6c757d
$gray-700 #495057
$gray-800 #343a40
$gray-900 #212529

scss/_variables.scss内には、Bootstrapのカラー変数とSassマップがあります。以下は$colorsSassマップの例です。

$colors: (
  "blue": $blue,
  "indigo": $indigo,
  "purple": $purple,
  "pink": $pink,
  "red": $red,
  "orange": $orange,
  "yellow": $yellow,
  "green": $green,
  "teal": $teal,
  "cyan": $cyan,
  "white": $white,
  "gray": $gray-600,
  "gray-dark": $gray-800
) !default;

マップ内の値を追加、削除、または変更して、多くの他のコンポーネントでの使用方法を更新します。残念ながら、現時点では、*すべての*コンポーネントがこのSassマップを使用しているわけではありません。今後のアップデートでは、この点を改善するよう努めます。それまでは、${color}変数とこのSassマップを利用することを計画してください。

コンポーネント

Bootstrapの多くのコンポーネントとユーティリティは、Sassマップを反復処理する@eachループを使用して構築されています。これは、$theme-colorsによってコンポーネントのバリアントを生成し、各ブレークポイントに対してレスポンシブバリアントを作成するのに特に役立ちます。これらのSassマップをカスタマイズして再コンパイルすると、これらのループに変更が自動的に反映されます。

修飾子

Bootstrapの多くのコンポーネントは、ベースモディファイアクラスのアプローチで構築されています。これは、スタイリングの大部分がベースクラス(例:.btn)に含まれており、スタイルのバリエーションがモディファイアクラス(例:.btn-danger)に限定されていることを意味します。これらのモディファイアクラスは、モディファイアクラスの数と名前をカスタマイズするために、$theme-colorsマップから構築されます。

以下に、$theme-colorsマップをループ処理して、.alertコンポーネントとすべての.bg-*背景ユーティリティにモディファイアを生成する2つの例を示します。

// Generate alert modifier classes
@each $color, $value in $theme-colors {
  .alert-#{$color} {
    @include alert-variant(theme-color-level($color, -10), theme-color-level($color, -9), theme-color-level($color, 6));
  }
}

// Generate `.bg-*` color utilities
@each $color, $value in $theme-colors {
  @include bg-variant('.bg-#{$color}', $value);
}

レスポンシブ

これらのSassループは、カラーマップに限定されません。コンポーネントやユーティリティのレスポンシブバリエーションも生成できます。たとえば、$grid-breakpointsSassマップの@eachループをメディアクエリのインクルードと組み合わせた、レスポンシブなテキスト配置ユーティリティがあります。

@each $breakpoint in map-keys($grid-breakpoints) {
  @include media-breakpoint-up($breakpoint) {
    $infix: breakpoint-infix($breakpoint, $grid-breakpoints);

    .text#{$infix}-left   { text-align: left !important; }
    .text#{$infix}-right  { text-align: right !important; }
    .text#{$infix}-center { text-align: center !important; }
  }
}

$grid-breakpointsを変更する必要がある場合、そのマップを反復処理するすべてのループに変更が適用されます。

CSS変数

Bootstrap 4には、コンパイルされたCSSに約20個のCSSカスタムプロパティ(変数)が含まれています。これらは、ブラウザのインスペクター、コードサンドボックス、または一般的なプロトタイピングで作業するときに、テーマカラー、ブレークポイント、プライマリフォントスタックなどの一般的に使用される値に簡単にアクセスできるようにします。

利用可能な変数

以下に、含まれている変数を示します(:rootが必要であることに注意してください)。これらは_root.scssファイルにあります。

:root {
  --blue: #007bff;
  --indigo: #6610f2;
  --purple: #6f42c1;
  --pink: #e83e8c;
  --red: #dc3545;
  --orange: #fd7e14;
  --yellow: #ffc107;
  --green: #28a745;
  --teal: #20c997;
  --cyan: #17a2b8;
  --white: #fff;
  --gray: #6c757d;
  --gray-dark: #343a40;
  --primary: #007bff;
  --secondary: #6c757d;
  --success: #28a745;
  --info: #17a2b8;
  --warning: #ffc107;
  --danger: #dc3545;
  --light: #f8f9fa;
  --dark: #343a40;
  --breakpoint-xs: 0;
  --breakpoint-sm: 576px;
  --breakpoint-md: 768px;
  --breakpoint-lg: 992px;
  --breakpoint-xl: 1200px;
  --font-family-sans-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
  --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
}

サンプル

CSS変数は、Sassの変数と同様の柔軟性を提供しますが、ブラウザに提供する前にコンパイルする必要はありません。たとえば、ここでは、CSS変数を使用してページのフォントとリンクのスタイルをリセットしています。

body {
  font: 1rem/1.5 var(--font-family-sans-serif);
}
a {
  color: var(--blue);
}

ブレークポイント変数

当初はブレークポイントをCSS変数(例:--breakpoint-md)に含めていましたが、**これらはメディアクエリではサポートされていません**が、メディアクエリ内のルールセット*内*では引き続き使用できます。これらのブレークポイント変数は、JavaScriptで使用できるため、下位互換性のためにコンパイルされたCSSに残ります。仕様の詳細はこちら

以下に**サポートされていない**例を示します。

@media (min-width: var(--breakpoint-sm)) {
  ...
}

以下に**サポートされている**例を示します。

@media (min-width: 768px) {
  .custom-element {
    color: var(--primary);
  }
}