tag:crieit.net,2005:https://crieit.net/tags/Bootstrap5/feed
「Bootstrap5」の記事 - Crieit
Crieitでタグ「Bootstrap5」に投稿された最近の記事
2022-02-06T21:41:13+09:00
https://crieit.net/tags/Bootstrap5/feed
tag:crieit.net,2005:PublicArticle/17979
2022-02-06T21:41:13+09:00
2022-02-06T21:41:13+09:00
https://crieit.net/posts/bootstrap5-paint-in-variable-20220206
Bootstrap 5 の変数やマップを上書きする
<p>Bootstrap 5 が去年5月にリリースされてからかなり経ってしまいましたが、 4 とは変数の上書きや追加の方法が変わっていると知ったので実験をしてみました。</p>
<h2 id="検証結果"><a href="#%E6%A4%9C%E8%A8%BC%E7%B5%90%E6%9E%9C">検証結果</a></h2>
<ul>
<li>ページ: <a target="_blank" rel="nofollow noopener" href="https://arm-band.github.io/test_bootstrap5_blackout/">Black in me - Black! - Blackout</a></li>
<li>リポジトリ: <a target="_blank" rel="nofollow noopener" href="https://github.com/arm-band/test_bootstrap5_blackout">GitHub - arm-band\/test_bootstrap5_blackout: Bootstrap5 の変数を上書きできるかテスト。</a></li>
</ul>
<h2 id="コード"><a href="#%E3%82%B3%E3%83%BC%E3%83%89">コード</a></h2>
<h3 id="ディレクトリ (関連する部分のみ)"><a href="#%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA+%28%E9%96%A2%E9%80%A3%E3%81%99%E3%82%8B%E9%83%A8%E5%88%86%E3%81%AE%E3%81%BF%29">ディレクトリ (関連する部分のみ)</a></h3>
<pre><code> /
└ src/
└ scss/
└ foundation/
├ bootstrap/
│ └ _import.scss
│
├ _append.scss
├ _index.scss
├ _mixin.scss
└ _variables.scss
</code></pre>
<p>ひとまずこんな形に。今回はデモ用なので <code>global</code>ディレクトリ を用意しませんでしたが、実際には <code>global</code>ディレクトリ で運用しようかな、と思います。</p>
<h3 id="src/scss/foundation/bootstrap/_import.scss"><a href="#src%2Fscss%2Ffoundation%2Fbootstrap%2F_import.scss">src/scss/foundation/bootstrap/_import.scss</a></h3>
<pre><code class="scss">@charset "utf-8";
// color custom (override)
@import "../variables";
// Configuration
@import "node_modules/bootstrap/scss/functions";
@import "node_modules/bootstrap/scss/variables";
@import "node_modules/bootstrap/scss/mixins";
@import "node_modules/bootstrap/scss/utilities";
// color custom (add to map)
@import "../append";
// Layout & components
@import "node_modules/bootstrap/scss/root";
@import "node_modules/bootstrap/scss/reboot";
// 略
</code></pre>
<p>元々の Bootstrap 5 の <code>bootstrap/scss/bootstrap.scss</code> のパスを調整したコピーを用意。</p>
<p>このコピーに2箇所手を加えます。</p>
<ol>
<li>Configuration の読み込みの<strong>前</strong>に <code>src/scss/foundation/_variables.scss</code> を読み込む</li>
<li>Configuration の読み込みの<strong>後</strong>に <code>src/scss/foundation/_append.scss</code> を読み込む</li>
</ol>
<h3 id="src/scss/foundation/_index.scss"><a href="#src%2Fscss%2Ffoundation%2F_index.scss">src/scss/foundation/_index.scss</a></h3>
<pre><code class="scss">@charset "utf-8";
//@forward "variables";
@forward "bootstrap/import";
@forward "mixin";
</code></pre>
<p>元々同じディレクトリにあった <code>_variable.scss</code> の読み込みを削除。これは先の <code>src/scss/foundation/bootstrap/_import.scss</code> で <code>_variable.scss</code> を読み込んでいるためです。</p>
<h3 id="src/scss/foundation/_variables.scss (既存変数の上書き)"><a href="#src%2Fscss%2Ffoundation%2F_variables.scss+%28%E6%97%A2%E5%AD%98%E5%A4%89%E6%95%B0%E3%81%AE%E4%B8%8A%E6%9B%B8%E3%81%8D%29">src/scss/foundation/_variables.scss (既存変数の上書き)</a></h3>
<pre><code class="scss">@charset "utf-8";
@use "sass:color";
$m-color: #333;
$m-main-color: #666;
$m-main-color_d: color.scale($m-main-color, $lightness: -8%);
$m-main-color_l: color.scale($m-main-color, $lightness: 8%);
$m-accent-color: color.adjust($m-main-color, $hue: 150deg);
$m-link-color: color.adjust($m-main-color, $hue: 210deg);
$m-link-v-color: color.scale($m-link-color, $lightness: -8%);
$m-link-ha-color: color.scale($m-link-color, $lightness: 8%);
$m-bg-color: #fff;
// override
$primary: $m-main-color;
$secondary: $m-bg-color;
</code></pre>
<p>変数宣言。前半は自分用の変数なのでお好みで。ただし <code>$link-color</code> 等は Bootstrap 側の変数とバッティングするのでそういった変数名は避けます。</p>
<p>その上で、今回は最後の部分に Bootstrap5 の変数の値を上書きするための <code>$primary</code> や <code>$secondary</code> を用意。このように Bootstrap 5 の変数より前に定義することで既存変数の上書きができます。</p>
<h3 id="src/scss/foundation/_append.scss"><a href="#src%2Fscss%2Ffoundation%2F_append.scss">src/scss/foundation/_append.scss</a></h3>
<pre><code class="scss">@charset "utf-8";
$custom-colors: (
"blackout": #000
);
// blackout をマップ $theme-colors に追加
$theme-colors: map-merge($theme-colors, $custom-colors);
</code></pre>
<p>一方、マップ <code>$theme-colors</code> に新たな要素を追加するためには先程の変数上書きとは異なり、 Bootstrap 5 の変数等の後でマップに追加する必要があります。</p>
<p>……確かに <code>map-merge</code> で合体するマップを指定する都合上、予め指定するマップが存在していなければならないですよね。</p>
<p>これで既存のマップ <code>$theme-colors</code> に要素 <code>blackout</code> を追加できました。</p>
<h2 id="結果"><a href="#%E7%B5%90%E6%9E%9C">結果</a></h2>
<p><a href="https://crieit.now.sh/upload_images/d1a0f6ba9f3afd27485f516c65bd2f6d61ffc13a60151.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d1a0f6ba9f3afd27485f516c65bd2f6d61ffc13a60151.jpg?mw=700" alt="ボタンの色を上書きしたり追加したり" /></a></p>
<p>Bootstrap のボタンで検証。左から2つの <code>primary</code> と <code>secondary</code> は上書きしたのでカスタマイズした色に、3つ目はオリジナルの <code>blackout</code> です。4つ目以降はデフォルトの <code>success</code> や <code>info</code> 等が続いており、上述のようにマップに一部の色のみを指定して <code>map-merge</code> しても他の色が影響を受けていないことを確認しました。</p>
<p>これで大丈夫そうですね。</p>
<h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2>
<ul>
<li><a target="_blank" rel="nofollow noopener" href="https://bootstrap-guide.com/customize/sass">Sassのカスタマイズ~Bootstrap5設置ガイド</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://getbootstrap.jp/docs/5.0/customize/sass/">Sass · Bootstrap v5.0</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/shouchida/items/2c3fc4586de66a067dfd">Bootstrap(v5)をカスタマイズして必要な機能だけ利用する - Qiita</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://stackoverflow.com/questions/67592367/unable-to-customize-bootstrap-5-theme-colors">reactjs - Unable to customize Bootstrap 5 theme colors - Stack Overflow</a></li>
</ul>
arm-band