CSS 技巧:精簡語法操作暗色主題 - CSS Dark Mode

2022/8/11

卡斯伯提供的教學資源:

 

CSS 技巧:精簡語法操作暗色主題 - CSS Dark Mode

Mac 暗色主題推出後,就讓黑色控非常喜愛,而且這樣的暗色佈景使用起來更不傷眼。以我來說是比較喜歡在亮色的佈景下工作的,但暗主題的對於長期需要在電腦面前工作來說,真的相對輕鬆很多。雖然如此,也並非所有的介面都是有提供暗主題,以網頁來說就需要開發者另外定義暗主題才會進行切換(不使用任何瀏覽器插件的情況下)。

好在,暗色主題的語法相當容易,以下介紹如何作切換,並且會提供一個小技巧,只要透過短短的幾行就能操控整個網站所有元件的主題色彩。

支援度

先附上大家所在意的支援度,但其實暗色主題本身就是由 Apple 先提出的,所以 Mac OS、iOS 的支援度會比較高,其它的瀏覽器也正在持續跟進中。

語法

MDN 上的介紹:https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-color-scheme

暗色主題的 CSS 是透過 @media 取得裝置的主題模式,就如同取得裝置的形式一樣(尺寸、橫向或垂直、是否為螢幕等等…),相信對於撰寫過響應式的開發者都不陌生。

語法上使用 prefers-color-scheme 來監測是亮色或暗色的主題,相對應的值也就是 dark or light

@media (prefers-color-scheme: ${dark or light}) {
  // ...
}

實際演示範例範例:

<style>
.mode {
  background-color: #eee;
  color: #333;
}
.text-mode:after {
  content: "light";
}

@media (prefers-color-scheme: dark) {
  .mode {
    background-color: #333;
    color: #eee;
  }
  .text-mode:after {
    content: "dark";
  }
}
</style>
<div class="demo mode">
  <p>本區塊會隨著暗色與亮色主題切換</p>
  <p>您目前的是 <span class="text-mode"></span> 主題</p>
</div>

請透過切換你的暗色、亮色主題來改變下方的範例(暗色主題為深色背景,亮色則反之)。

本區塊會隨著暗色與亮色主題切換

您目前的是  主題

使用變數快速切換網頁的主題色

暗色系與亮色中的色彩並不是黑白兩色互相切換,以 Material Design 來說,如果亮色的主色色彩為 #6222ee,在暗色系並不會使用相同色,而是會改變為 #bb85fc 藉此來增加辨識度,而整個網頁中所需要套用色彩的區塊非常多,從按鈕到元件都會不斷地引用,如果透過一個個的 @media 設定將會增加開發及管理的困難度。

Material Design 中的暗色、亮色切換範例,兩者的主色(紫色)在不同的主題下色彩也會改變。

因此,在開發時可以將暗色、亮色的佈景主題色彩以 CSS 變數的方式作定義,避免直接將色彩寫入 CSS 元素上,接下來在 @media 中僅需要改變 CSS 的變數就能夠完整切換所有元件的主題色彩。

.card {
  --theme-primary: #6222ee;
  --theme-background: #eee;
}

.card {
  /* ... */
  background-color: var(--theme-background);
  color: var(--theme-primary);
}

@media (prefers-color-scheme: dark) {
  .card {
    --theme-primary: #bb85fc;
    --theme-background: #111;
  }
}

本卡片會隨著暗色與亮色主題切換

本文中還有利用到 CSS Variables,有興趣可參閱本篇文「原生 CSS 變數運用技巧(CSS Variables)」。