css/media query
屬於CSS Media Query,用來檢測用戶是否有將系統的主題色設置為亮色(light mode)或暗色(Dark Mode)。
https://codepen.io/phoebe4561/pen/oNGPBpg?editors=0010
暗色主題本身是由 Apple 先提出的,所以 Mac OS、iOS 的支援度較高
目前在 Apple 及 Material Design 中也都有針對亮色、暗色的佈景主題提供規範。
Material Design
Apple
There are two prefers-color-scheme values to choose from:
暗色系與亮色中的色彩並不是黑白兩色互換,如果透過一個個的 @media 設定將會增加開發及管理的困難度,通常搭配CSS Variables 快速切換網頁的主題色
CSS Variables
(1)宣告變數:建議定義在 :root 最高層級的選取器便於取用,並且使用 --自訂名稱
作為屬性的方式來宣告變數。
(2)取值:前方是撰寫我們需要套用的樣式屬性,後方使用 var (--變數名稱)
來套用。
MediaQueryList object維護一組針對 document 的 media query , 並且當 media query 相對應的文件狀態改變時,觸發註冊的事件處理器通知之。
The MediaQueryList object stores information from a media query.
The MediaQueryList object is a property of the window object.
matches
addListener()
作為MediaQueryList object的callback function
透過呼叫window.matchMedia()方法創建MediaQueryList
object
mediaQueryString
MediaQueryList
object for the media query.建立MediaQueryList object useDark
: 偵測media query狀態的改變
toggleDarkMode
function :傳入一個參數(Boolean value)並根據傳入的參數t or f 決定是否在根原件上 document.documentElement
(<html>
element) 添加 .dark-mode
classuseDark
object有matches
property,用來檢測prefers-color-scheme
的狀態
useDark.matches
returns a Boolean 傳入 toggleDarkMode
function的參數,作為初始化模式(因為我們沒有在CSS中設定prefers-color-scheme
media query)
若使用者啟用dark mode 則 useDark.matches
return true
, toggleDarkMode
新增 .dark-mode
class,第一次開啟網站顯示dark mode
初始載入的設定由 localStorage
state取得狀態 而非基於prefers-color-scheme
的value
Q有些圖在dark mode中非常亮
解決方式:
(1)使用<picture>
中的media attribute 進行選擇性加載
<picture>
支援度 https://caniuse.com/?search=picture
不佳–––––––––––––––––––––––––––佳
<picture>
<source>
元素以及一個<img>
元素,以為不同裝置提供同張圖片的不同版本。<source>
順序很重要<source>
而忽略掉後續的標籤。<picture>
結束前指定一個<img>
<picture>
或是沒有符合的<source>
時,則<img>
屬性會被選擇。<source>
的 srcset、media以及 type屬性,以選出最適合當前版面以及顯示裝置支援度的圖片。media 屬性
指定特定的媒體類型(跟 media query 很像)。如果 <source>的指定媒體類型被判斷為 false ,則瀏覽器會跳過它。
srcset 屬性
用來提供根據大小區分的可能的圖片清單。
每一個圖片描述句是由該圖片的 URL 以及以下描述組成(擇一):
1.寬度,結尾為 w
2.像素密度,結尾為 x,為高 DPI 螢幕提供高解析度圖片
type 屬性
為URL 指定 MIME type 。如果 user agent 不支援該 type 的話,此 <source>元素被略過。
(2)使用css filter
需要新增<meta>標註是否支援light, dark, or both modes, 因為某些UI元件可能尚未完整支援Dark Mode
參考資料
https://www.ditdot.hr/en/dark-mode-website-tutorial
https://wcc723.github.io/css/2019/12/22/css-dark-mode/
MediaQueryList
MediaQueryList.addListener()
window.matchMedia()
關於<picture>的詳細說明