Light, Dark and Custom Mode

越來越多細節要做

prefers-color-scheme

  1. 先暸解 CSS Variables 用法

  2. prefers-color-scheme 可以幫助我們快速設定 Light 與 Dark mode

我們來看看一個範例:

<button>Button</button>
button {
    background-color: red;
}

@media (prefers-color-scheme: dark) {
  button {
    background-color: green;
  }  
}

這個範例應該蠻直覺的,按鈕原本的背景是紅色,當您使用的瀏覽器是使用 Dark Mode 的時候,按鈕背景就會變成綠色,您可以打開 codepen 嘗試看看。

同理,如果寫的是 @media (prefers-color-scheme: light) ,那就是瀏覽器如果是 Light Mode 就會套用。

也就是說,prefers-color-scheme 是跟著瀏覽器外觀決定。一般情況下,瀏覽器的外觀是預設成跟隨系統外觀。

接下來,我們再使用 CSS Variables 技巧,讓 CSS 更貼近實際 CSS 管理的情況。

實務上我們通常會將顏色的部分做統一管理,這樣會方便我們切換主題色,所以通常會使用變數系統。如果不考慮 IE 的話,原生 CSS 可以使用 CSS Variables 的技術。

所以只需要在不同的情況下,改變變數的值,就可以達成調出 Light 與 Dark Mode 的主題色。您可以自行發想您的 CSS 如何管理,在此例中,我們是使用了一個主要的設定 --color-theme,然後在 Dark Mode 的時候,利用 CSS Variables 的特性,將 --color-theme 的值設為 --color-theme-dark-mode,之後如果我們有需要改變顏色,只要在最上頭的變數區修正即可,不需要動到主要的內容,就可以達成兩種主題色的設定。如果您還看不太明白這一段 CSS 如何運作,可以先到 CSS Variables 這篇文章複習。

更貼心的做法

現在我們來看看 Mozilla 文件網站的做法,您會發現到他的右上角 theme 的地方,有一個選項是 OS Default 選項。

這樣的做法可以提供使用者自己決定外觀,不讓網站外觀跟隨瀏覽器的外觀的時候使用。但一開始不知道使用者的想法時,先判斷一開始進網站時使用者的瀏覽器環境,給予預設外觀的選項,如果使用者想改變再去改變。

那實作上應該要如何做呢?

我們可以查看 Mozilla 的 _theme.scss 檔,發現預設外觀就是使用我們上述教過的觀念,而切換成 Light/Dark 時使用 classname 的變化,切換該載入那一些 CSS Variables,不過他這裡還有使用 scss 的 @mixin 和 js,所以如果您不太會 js 的話,需要跟您的前端工程師討論如何實行,因為還需要記錄使用者的選擇,可能會跟 session 或 cookie 有關,這樣才會形成一個完整的體驗。

chevron-rightMozilla _theme.scsshashtag

標題還有一個 Custom Mode 還沒講噎?

其實剛剛就已經講完囉,就是使用 classname 的變化,切換該載入那一些 CSS Variables。您可以自行設定很多不同的外觀主題色。

還有兩個跟主題色有關的事!

那就是 accent-color 這個屬性,這是改變瀏覽器預設顏色的一個屬性,可以適時的搭配 CSS Variables 使用。

另一個則是 color-scheme ,如果將它設成 dark ,則會幫您反轉顏色,這樣調起色來事半功倍!

小結

其實這件事情並不難,所以也沒什麼好總結,只要您的 CSS 管理有準則可以遵循,主題色的 CSS 管理會自然而然地迎刃而解。

作業

實作 Mozilla 的顏色改變系統,並且多新增一種自己的客製化主題色。

參考連結

Last updated

Was this helpful?