色彩模式
從 v5.3.0 起,Bootstrap 現在支援色彩模式或主題。探索我們的預設淺色模式和新的深色模式,或使用我們的樣式作為範本建立您自己的模式。
深色模式
Bootstrap 現在支援色彩模式,從暗色模式開始!使用 v5.3.0,你可以實作自己的色彩模式切換器(見下方 Bootstrap 文件中的範例),並依據你的喜好套用不同的色彩模式。我們支援淺色模式(預設)和現在的暗色模式。色彩模式可以在 <html>
元素上或特定元件和元素上進行切換,這要歸功於 data-bs-theme
屬性。
或者,你也可以使用我們的色彩模式混合器切換到媒體查詢實作,請參閱 使用部分的詳細資訊。不過請注意,這會消除你根據每個元件變更佈景主題的能力,如下所示。
範例
例如,要變更下拉式功能表色彩模式,請將 data-bs-theme="light"
或 data-bs-theme="dark"
加入父層 .dropdown
。現在,無論全域色彩模式為何,這些下拉式功能表都會顯示指定的佈景主題值。
<div class="dropdown" data-bs-theme="light">
<button class="btn btn-secondary dropdown-toggle" type="button" id="dropdownMenuButtonLight" data-bs-toggle="dropdown" aria-expanded="false">
Default dropdown
</button>
<ul class="dropdown-menu" aria-labelledby="dropdownMenuButtonLight">
<li><a class="dropdown-item active" href="#">Action</a></li>
<li><a class="dropdown-item" href="#">Action</a></li>
<li><a class="dropdown-item" href="#">Another action</a></li>
<li><a class="dropdown-item" href="#">Something else here</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="#">Separated link</a></li>
</ul>
</div>
<div class="dropdown" data-bs-theme="dark">
<button class="btn btn-secondary dropdown-toggle" type="button" id="dropdownMenuButtonDark" data-bs-toggle="dropdown" aria-expanded="false">
Dark dropdown
</button>
<ul class="dropdown-menu" aria-labelledby="dropdownMenuButtonDark">
<li><a class="dropdown-item active" href="#">Action</a></li>
<li><a class="dropdown-item" href="#">Action</a></li>
<li><a class="dropdown-item" href="#">Another action</a></li>
<li><a class="dropdown-item" href="#">Something else here</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="#">Separated link</a></li>
</ul>
</div>
運作方式
-
如上所示,色彩模式樣式由
data-bs-theme
屬性控制。此屬性可以套用到<html>
元素,或任何其他元素或 Bootstrap 元件。如果套用到<html>
元素,它將套用到所有內容。如果套用到元件或元素,它將限定於該特定元件或元素。 -
對於你希望支援的每個色彩模式,你需要為共用全域 CSS 變數加入新的覆寫。我們已經在
_root.scss
樣式表中為暗色模式這樣做了,而淺色模式為預設值。在撰寫色彩模式特定樣式時,請使用混合器// Color mode variables in _root.scss @include color-mode(dark) { // CSS variable overrides here... }
-
我們使用自訂的
_variables-dark.scss
來提供這些共用的全域 CSS 變數覆寫以供深色模式使用。這個檔案對你自己的自訂色彩模式不是必要的,但由於兩個原因,它對我們的深色模式是必要的。首先,最好有一個單一的地方來重設全域色彩。其次,某些 Sass 變數必須被覆寫,以供嵌入我們 CSS 中的背景圖片使用,這些圖片用於手風琴、表單元件等等。
用法
啟用深色模式
透過將 data-bs-theme="dark"
屬性新增到 <html>
元素,來啟用整個專案內建的深色色彩模式。這會將深色色彩模式套用至所有元件和元素,除了那些套用特定 data-bs-theme
屬性的元件和元素之外。建立在 快速入門範本 上
<!doctype html>
<html lang="en" data-bs-theme="dark">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Bootstrap demo</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
</head>
<body>
<h1>Hello, world!</h1>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin="anonymous"></script>
</body>
</html>
Bootstrap 目前尚未內建色彩模式選擇器,但如果你喜歡,你可以使用我們自己的文件中的那個。 在 JavaScript 區段中了解更多。
使用 Sass 建置
我們新的深色模式選項可供所有 Bootstrap 使用者使用,但它透過資料屬性而非媒體查詢來控制,而且不會自動切換專案的色彩模式。你可以透過將 $enable-dark-mode
變更為 false
,在 Sass 中完全停用我們的深色模式。
我們使用自訂 Sass mixin,color-mode()
,來協助您控制色彩模式的套用方式。預設情況下,我們使用 data
屬性方法,讓您可以創造更友善的使用者體驗,讓您的訪客可以選擇自動暗色模式或控制他們的偏好設定(就像我們自己的文件中的範例)。這也是一種簡單且可擴充的方式,可以新增不同的主題和更自訂的色彩模式,不只限於淺色和深色。
如果您想要使用媒體查詢,並只讓色彩模式自動化,您可以透過 Sass 變數來變更 mixin 的預設類型。請考慮以下程式碼片段及其編譯後的 CSS 輸出。
$color-mode-type: data;
@include color-mode(dark) {
.element {
color: var(--bs-primary-text-emphasis);
background-color: var(--bs-primary-bg-subtle);
}
}
輸出至
[data-bs-theme=dark] .element {
color: var(--bs-primary-text-emphasis);
background-color: var(--bs-primary-bg-subtle);
}
並在設定為 media-query
時
$color-mode-type: media-query;
@include color-mode(dark) {
.element {
color: var(--bs-primary-text-emphasis);
background-color: var(--bs-primary-bg-subtle);
}
}
輸出至
@media (prefers-color-scheme: dark) {
.element {
color: var(--bs-primary-text-emphasis);
background-color: var(--bs-primary-bg-subtle);
}
}
自訂色彩模式
雖然色彩模式的主要使用案例是淺色和深色模式,自訂色彩模式也是可行的。使用自訂值作為色彩模式名稱,建立您自己的 data-bs-theme
選擇器,然後視需要修改我們的 Sass 和 CSS 變數。我們選擇建立一個獨立的 _variables-dark.scss
樣式表,來容納 Bootstrap 的深色模式特定 Sass 變數,但這對您來說並非必要。
例如,您可以使用選擇器 data-bs-theme="blue"
建立「藍色主題」。在您的自訂 Sass 或 CSS 檔案中,新增新的選擇器,並視需要覆寫任何全域或元件 CSS 變數。如果您使用 Sass,您也可以在 CSS 變數覆寫中使用 Sass 的函式。
[data-bs-theme="blue"] {
--bs-body-color: var(--bs-white);
--bs-body-color-rgb: #{to-rgb($white)};
--bs-body-bg: var(--bs-blue);
--bs-body-bg-rgb: #{to-rgb($blue)};
--bs-tertiary-bg: #{$blue-600};
.dropdown-menu {
--bs-dropdown-bg: #{mix($blue-500, $blue-600)};
--bs-dropdown-link-active-bg: #{$blue-700};
}
.btn-secondary {
--bs-btn-bg: #{mix($gray-600, $blue-400, .5)};
--bs-btn-border-color: #{rgba($white, .25)};
--bs-btn-hover-bg: #{darken(mix($gray-600, $blue-400, .5), 5%)};
--bs-btn-hover-border-color: #{rgba($white, .25)};
--bs-btn-active-bg: #{darken(mix($gray-600, $blue-400, .5), 10%)};
--bs-btn-active-border-color: #{rgba($white, .5)};
--bs-btn-focus-border-color: #{rgba($white, .5)};
--bs-btn-focus-box-shadow: 0 0 0 .25rem rgba(255, 255, 255, .2);
}
}
一些段落文字,用來展示藍色主題在書面文字中的外觀。
<div data-bs-theme="blue">
...
</div>
JavaScript
若要讓訪客或使用者切換色彩模式,您需要建立一個切換元素來控制根元素 <html>
上的 data-bs-theme
屬性。我們在文件中建立了一個切換器,它最初會延用使用者的目前系統色彩模式,但提供一個選項可以覆寫它並選擇特定的色彩模式。
以下是驅動它的 JavaScript。歡迎檢查我們自己的文件導覽列,看看它是如何使用我們自己元件的 HTML 和 CSS 實作的。建議在頁面頂端包含 JavaScript,以減少在重新載入網站期間潛在的畫面閃爍。請注意,如果您決定為色彩模式使用媒體查詢,如果您偏好隱式控制,您的 JavaScript 可能需要修改或移除。
/*!
* Color mode toggler for Bootstrap's docs (https://bootstrap.dev.org.tw/)
* Copyright 2011-2024 The Bootstrap Authors
* Licensed under the Creative Commons Attribution 3.0 Unported License.
*/
(() => {
'use strict'
const getStoredTheme = () => localStorage.getItem('theme')
const setStoredTheme = theme => localStorage.setItem('theme', theme)
const getPreferredTheme = () => {
const storedTheme = getStoredTheme()
if (storedTheme) {
return storedTheme
}
return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'
}
const setTheme = theme => {
if (theme === 'auto') {
document.documentElement.setAttribute('data-bs-theme', (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'))
} else {
document.documentElement.setAttribute('data-bs-theme', theme)
}
}
setTheme(getPreferredTheme())
const showActiveTheme = (theme, focus = false) => {
const themeSwitcher = document.querySelector('#bd-theme')
if (!themeSwitcher) {
return
}
const themeSwitcherText = document.querySelector('#bd-theme-text')
const activeThemeIcon = document.querySelector('.theme-icon-active use')
const btnToActive = document.querySelector(`[data-bs-theme-value="${theme}"]`)
const svgOfActiveBtn = btnToActive.querySelector('svg use').getAttribute('href')
document.querySelectorAll('[data-bs-theme-value]').forEach(element => {
element.classList.remove('active')
element.setAttribute('aria-pressed', 'false')
})
btnToActive.classList.add('active')
btnToActive.setAttribute('aria-pressed', 'true')
activeThemeIcon.setAttribute('href', svgOfActiveBtn)
const themeSwitcherLabel = `${themeSwitcherText.textContent} (${btnToActive.dataset.bsThemeValue})`
themeSwitcher.setAttribute('aria-label', themeSwitcherLabel)
if (focus) {
themeSwitcher.focus()
}
}
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => {
const storedTheme = getStoredTheme()
if (storedTheme !== 'light' && storedTheme !== 'dark') {
setTheme(getPreferredTheme())
}
})
window.addEventListener('DOMContentLoaded', () => {
showActiveTheme(getPreferredTheme())
document.querySelectorAll('[data-bs-theme-value]')
.forEach(toggle => {
toggle.addEventListener('click', () => {
const theme = toggle.getAttribute('data-bs-theme-value')
setStoredTheme(theme)
setTheme(theme)
showActiveTheme(theme, true)
})
})
})
})()
新增主題色彩
在 $theme-colors
中新增一個新色彩對某些元件來說是不夠的,例如 提醒 和 列表群組。新色彩還必須在 $theme-colors-text
、$theme-colors-bg-subtle
和 $theme-colors-border-subtle
中定義,以適用於淺色主題;但對於深色主題,還必須在 $theme-colors-text-dark
、$theme-colors-bg-subtle-dark
和 $theme-colors-border-subtle-dark
中定義。
這是一個手動程序,因為 Sass 無法從現有變數或對應中產生自己的 Sass 變數。在 Bootstrap 的未來版本中,我們將重新檢視此設定以減少重複。
// Required
@import "functions";
@import "variables";
@import "variables-dark";
// Add a custom color to $theme-colors
$custom-colors: (
"custom-color": #712cf9
);
$theme-colors: map-merge($theme-colors, $custom-colors);
@import "maps";
@import "mixins";
@import "utilities";
// Add a custom color to new theme maps
// Light mode
$custom-colors-text: ("custom-color": #712cf9);
$custom-colors-bg-subtle: ("custom-color": #e1d2fe);
$custom-colors-border-subtle: ("custom-color": #bfa1fc);
$theme-colors-text: map-merge($theme-colors-text, $custom-colors-text);
$theme-colors-bg-subtle: map-merge($theme-colors-bg-subtle, $custom-colors-bg-subtle);
$theme-colors-border-subtle: map-merge($theme-colors-border-subtle, $custom-colors-border-subtle);
// Dark mode
$custom-colors-text-dark: ("custom-color": #e1d2f2);
$custom-colors-bg-subtle-dark: ("custom-color": #8951fa);
$custom-colors-border-subtle-dark: ("custom-color": #e1d2f2);
$theme-colors-text-dark: map-merge($theme-colors-text-dark, $custom-colors-text-dark);
$theme-colors-bg-subtle-dark: map-merge($theme-colors-bg-subtle-dark, $custom-colors-bg-subtle-dark);
$theme-colors-border-subtle-dark: map-merge($theme-colors-border-subtle-dark, $custom-colors-border-subtle-dark);
// Remainder of Bootstrap imports
@import "root";
@import "reboot";
// etc
CSS
變數
數十個根層級 CSS 變數重複作為暗色模式的覆寫。這些變數的範圍限定在色彩模式選擇器,預設為 data-bs-theme
,但 可以設定 使用 prefers-color-scheme
媒體查詢。使用這些變數作為產生您自己的新色彩模式的指南。
--#{$prefix}body-color: #{$body-color-dark};
--#{$prefix}body-color-rgb: #{to-rgb($body-color-dark)};
--#{$prefix}body-bg: #{$body-bg-dark};
--#{$prefix}body-bg-rgb: #{to-rgb($body-bg-dark)};
--#{$prefix}emphasis-color: #{$body-emphasis-color-dark};
--#{$prefix}emphasis-color-rgb: #{to-rgb($body-emphasis-color-dark)};
--#{$prefix}secondary-color: #{$body-secondary-color-dark};
--#{$prefix}secondary-color-rgb: #{to-rgb($body-secondary-color-dark)};
--#{$prefix}secondary-bg: #{$body-secondary-bg-dark};
--#{$prefix}secondary-bg-rgb: #{to-rgb($body-secondary-bg-dark)};
--#{$prefix}tertiary-color: #{$body-tertiary-color-dark};
--#{$prefix}tertiary-color-rgb: #{to-rgb($body-tertiary-color-dark)};
--#{$prefix}tertiary-bg: #{$body-tertiary-bg-dark};
--#{$prefix}tertiary-bg-rgb: #{to-rgb($body-tertiary-bg-dark)};
@each $color, $value in $theme-colors-text-dark {
--#{$prefix}#{$color}-text-emphasis: #{$value};
}
@each $color, $value in $theme-colors-bg-subtle-dark {
--#{$prefix}#{$color}-bg-subtle: #{$value};
}
@each $color, $value in $theme-colors-border-subtle-dark {
--#{$prefix}#{$color}-border-subtle: #{$value};
}
--#{$prefix}heading-color: #{$headings-color-dark};
--#{$prefix}link-color: #{$link-color-dark};
--#{$prefix}link-hover-color: #{$link-hover-color-dark};
--#{$prefix}link-color-rgb: #{to-rgb($link-color-dark)};
--#{$prefix}link-hover-color-rgb: #{to-rgb($link-hover-color-dark)};
--#{$prefix}code-color: #{$code-color-dark};
--#{$prefix}highlight-color: #{$mark-color-dark};
--#{$prefix}highlight-bg: #{$mark-bg-dark};
--#{$prefix}border-color: #{$border-color-dark};
--#{$prefix}border-color-translucent: #{$border-color-translucent-dark};
--#{$prefix}form-valid-color: #{$form-valid-color-dark};
--#{$prefix}form-valid-border-color: #{$form-valid-border-color-dark};
--#{$prefix}form-invalid-color: #{$form-invalid-color-dark};
--#{$prefix}form-invalid-border-color: #{$form-invalid-border-color-dark};
Sass 變數
我們暗色色彩模式的 CSS 變數部分從 _variables-dark.scss
中的暗色模式特定 Sass 變數產生。這也包含一些自訂覆寫,用於變更元件中使用的內嵌 SVG 的色彩。
$primary-text-emphasis-dark: tint-color($primary, 40%);
$secondary-text-emphasis-dark: tint-color($secondary, 40%);
$success-text-emphasis-dark: tint-color($success, 40%);
$info-text-emphasis-dark: tint-color($info, 40%);
$warning-text-emphasis-dark: tint-color($warning, 40%);
$danger-text-emphasis-dark: tint-color($danger, 40%);
$light-text-emphasis-dark: $gray-100;
$dark-text-emphasis-dark: $gray-300;
$primary-bg-subtle-dark: shade-color($primary, 80%);
$secondary-bg-subtle-dark: shade-color($secondary, 80%);
$success-bg-subtle-dark: shade-color($success, 80%);
$info-bg-subtle-dark: shade-color($info, 80%);
$warning-bg-subtle-dark: shade-color($warning, 80%);
$danger-bg-subtle-dark: shade-color($danger, 80%);
$light-bg-subtle-dark: $gray-800;
$dark-bg-subtle-dark: mix($gray-800, $black);
$primary-border-subtle-dark: shade-color($primary, 40%);
$secondary-border-subtle-dark: shade-color($secondary, 40%);
$success-border-subtle-dark: shade-color($success, 40%);
$info-border-subtle-dark: shade-color($info, 40%);
$warning-border-subtle-dark: shade-color($warning, 40%);
$danger-border-subtle-dark: shade-color($danger, 40%);
$light-border-subtle-dark: $gray-700;
$dark-border-subtle-dark: $gray-800;
$body-color-dark: $gray-300;
$body-bg-dark: $gray-900;
$body-secondary-color-dark: rgba($body-color-dark, .75);
$body-secondary-bg-dark: $gray-800;
$body-tertiary-color-dark: rgba($body-color-dark, .5);
$body-tertiary-bg-dark: mix($gray-800, $gray-900, 50%);
$body-emphasis-color-dark: $white;
$border-color-dark: $gray-700;
$border-color-translucent-dark: rgba($white, .15);
$headings-color-dark: inherit;
$link-color-dark: tint-color($primary, 40%);
$link-hover-color-dark: shift-color($link-color-dark, -$link-shade-percentage);
$code-color-dark: tint-color($code-color, 40%);
$mark-color-dark: $body-color-dark;
$mark-bg-dark: $yellow-800;
//
// Forms
//
$form-select-indicator-color-dark: $body-color-dark;
$form-select-indicator-dark: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'><path fill='none' stroke='#{$form-select-indicator-color-dark}' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/></svg>");
$form-switch-color-dark: rgba($white, .25);
$form-switch-bg-image-dark: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'><circle r='3' fill='#{$form-switch-color-dark}'/></svg>");
$form-valid-color-dark: $green-300;
$form-valid-border-color-dark: $green-300;
$form-invalid-color-dark: $red-300;
$form-invalid-border-color-dark: $red-300;
//
// Accordion
//
$accordion-icon-color-dark: $primary-text-emphasis-dark;
$accordion-icon-active-color-dark: $primary-text-emphasis-dark;
$accordion-button-icon-dark: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='#{$accordion-icon-color-dark}'><path fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/></svg>");
$accordion-button-active-icon-dark: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='#{$accordion-icon-active-color-dark}'><path fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/></svg>");
Sass 混入
暗色模式的樣式,以及您建立的任何自訂色彩模式,可以使用可自訂的 color-mode()
混入適當地限定範圍到 data-bs-theme
屬性選擇器或媒體查詢。請參閱 Sass 使用區段 以取得更多詳細資料。
@mixin color-mode($mode: light, $root: false) {
@if $color-mode-type == "media-query" {
@if $root == true {
@media (prefers-color-scheme: $mode) {
:root {
@content;
}
}
} @else {
@media (prefers-color-scheme: $mode) {
@content;
}
}
} @else {
[data-bs-theme="#{$mode}"] {
@content;
}
}
}