【Bootstrap5】scssでtheme-colorsの色を追加・変更する

CSSがすごい苦手なので、作るアプリはフレームワークのBootstrapに統一しようと思います。Bootstrapなら解説しているサイトや本も多いので、調べやすいのが最大のメリットです。

Bootstrap 5 フロントエンド開発の教科書 という本を買って勉強したんですが、Bootstrapの初心者である私にとってはすごく分かりやすかったです。

画像のスライドショー(カルーセルと言うらしい)とかも結構簡単に作れるんだなというのが分かり、大変参考になりました。

ただ、個人的にBootstrapの配色が好きじゃないので、配色だけ変えたいんです。本にも配色を変更する方法が載っていましたが、本に書いてある通りに設定しても上手くいきません。$theme-colorsがどうしても上書きされてしまいます。仕様が変わったのかもしれません。

色々試していると、結果的には、配色を変更・追加することは出来ました。しかし、このコードは信用しないでください。とりあえず動くというレベルです。私はcssもscssもsassも無知であるため、このコードが正しいのか判断できません。あくまでも自己流の備忘録です。

ダウンロード

https://getbootstrap.jp/docs/5.0/getting-started/download/からソースファイルをダウンロードします。

階層

ダウンロードしたBootstrap5のscssファイルは、scssディレクトリにすべて突っ込んであります。

├─css
│  └─custom.scss
└─scss

custom.scss(コメントあり)

// 変数を上書きする場合は@importよりも前に書く

$secondary: #0e5fb1;
$info: #00ff62;
$enable-gradients: true;
$enable-rounded: false;


// scssディレクトリにあるファイルをインポート
// $theme-colorsの変更には以下の2つが必要

@import "../scss/functions";    // _functions.scssのこと
@import "../scss/variables";    // _variables.scssのこと


// カスタムカラーを設定
// variablesをimportしているため、bootstrapの変数も利用可

$custom-colors: (
    "pink": $pink,
    "indigo": $indigo,
    "cpink": #f023c3
);


// $theme-colorsに先ほど設定した$custom-colorsを追加
// VSCodeでmap-mergeを入力すると、自動で$map1:と$map2:が出力されたが書かなくても良いっぽい
// $theme-colors: map-merge($theme-colors, $custom-colors);

$theme-colors: map-merge($map1: $theme-colors, $map2: $custom-colors);


// 最後にbootstrap.scssをインポート

@import "../scss/bootstrap";


// 独自CSSを追加する場合は、bootstrap.scssのインポート後?

section {
    margin-top: -60px;
    padding-top: 60px;
}

// custom.scssを置いているディレクトリでターミナルからscssをコンパイル
// 例) sass custom.scss custom.css

custom.scss(コメントなし)

$secondary: #0e5fb1;
$info: #00ff62;
$enable-gradients: true;
$enable-rounded: false;

@import "../scss/functions";
@import "../scss/variables";

$custom-colors: (
    "pink": $pink,
    "indigo": $indigo,
    "cpink": #f023c3
);

$theme-colors: map-merge($map1: $theme-colors, $map2: $custom-colors);

@import "../scss/bootstrap";

section {
    margin-top: -60px;
    padding-top: 60px;
}