prefers-color-scheme設(shè)置檢測(cè)系統(tǒng)主題色
引言
我們?cè)谠L問(wèn)某個(gè)站點(diǎn)時(shí),有時(shí)可能會(huì)發(fā)現(xiàn)這樣一種場(chǎng)景:該站點(diǎn)在白天訪問(wèn)時(shí),它是亮色主題;當(dāng)晚上訪問(wèn)時(shí),它就變成暗色主題了。而且這種主題的切換是自動(dòng)的,他會(huì)隨系統(tǒng)主題變化而改變。如果我們要將這種功能應(yīng)用在自己站點(diǎn)上,該如何實(shí)現(xiàn)呢?
本文涉及三個(gè)相關(guān)知識(shí)點(diǎn):
- 設(shè)置主題色
- 檢查主題色
- 監(jiān)聽(tīng)主題色變化
設(shè)置主題色
在 CSS 中,提供了一種設(shè)置系統(tǒng)主題色的媒體特性 prefers-color-scheme
,該特性通常提供兩個(gè)值 light
和 dark
。顧名思義,這兩個(gè)值一個(gè)代表 日間模式
,一個(gè)表示 夜間模式
。并且他們的兼容性也是最好的。
這里有一個(gè)簡(jiǎn)單的例子,可以很方便的通過(guò) CSS 實(shí)現(xiàn)系統(tǒng)主題色:
.day { background: #eee; color: black; } .night { background: #333; color: white; } @media (prefers-color-scheme: dark) { .day.dark-scheme { background: #333; color: white; } .night.dark-scheme { background: black; color: #ddd; } } @media (prefers-color-scheme: light) { .day.light-scheme { background: white; color: #555; } .night.light-scheme { background: #eee; color: black; } }
當(dāng)系統(tǒng)主題為日間模式時(shí),會(huì)應(yīng)用上面的 light 主題樣式;當(dāng)系統(tǒng)主題為夜間模式時(shí),會(huì)應(yīng)用上面的 dark 主題樣式。
實(shí)際開發(fā)中,我們會(huì)將項(xiàng)目用到的色值抽離出來(lái)作為全局的公共變量,方便我們對(duì)項(xiàng)目整體的色值管理。如:
:root { // Light Theme --PrimaryBackgroundColorLight: #f9f9f9; --PageBackgroundColorLight: #efefef; --PrimaryColorLight: #34495e; --PrimaryActivedColorLight: #1890FF; // Dark Theme --PrimaryBackgroundColorDark: #293042; --PageBackgroundColorDark: #202634; --PrimaryColorDark: #c6cfd8; --PrimaryActivedColorDark: #1890FF; }
我們定義好全局 CSS 變量后,在需要的地方直接引用即可:
.day.light { background-color: var(--PrimaryBackgroundColorLight); }
檢測(cè)主題色
既然能通過(guò) CSS 設(shè)置系統(tǒng)主題色,那 JS 肯定也有能力來(lái)檢測(cè)系統(tǒng)主題色。JS 提供了一個(gè)用于檢查媒體查詢的函數(shù) matchMedia
,利用該函數(shù)能方便地檢查當(dāng)前系統(tǒng)主題色:
const themeMedia = window.matchMedia("(prefers-color-scheme: light)"); if (themeMedia.matches) { // 日間模式 } else { // 夜間模式 }
監(jiān)聽(tīng)主題色變化
除了獲取當(dāng)前系統(tǒng)主題色,我們還能監(jiān)聽(tīng)主題色的變化。
const themeMedia = window.matchMedia("(prefers-color-scheme: light)"); themeMedia.addListener(e => { if (e.matches) { console.log("light"); } else { console.log("dark"); } });
通過(guò)上面提到的三個(gè)知識(shí)點(diǎn),在自己站點(diǎn)實(shí)現(xiàn)主題色功能是綽綽有余的。像一些更豐富的多主題切換,雖然實(shí)現(xiàn)的方法不同,但思路基本都是類似的??偨Y(jié)起來(lái)就是開篇的三句話:如何設(shè)置主題、獲取當(dāng)前被應(yīng)用的主題以及監(jiān)聽(tīng)主題的變更。
以上就是prefers-color-scheme設(shè)置檢測(cè)系統(tǒng)主題色的詳細(xì)內(nèi)容,更多關(guān)于prefers-color-scheme主題色的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
JSCode all of Brower 全局屏蔽網(wǎng)頁(yè)右鍵功能 具體實(shí)現(xiàn)
JSCode all of Brower 全局屏蔽網(wǎng)頁(yè)右鍵功能 具體實(shí)現(xiàn),需要的朋友可以參考一下2013-06-06JS利用?clip-path?實(shí)現(xiàn)動(dòng)態(tài)區(qū)域裁剪功能
這篇文章主要介紹了JS利用?clip-path?實(shí)現(xiàn)動(dòng)態(tài)區(qū)域裁剪功能,文中主要通過(guò)使用 box-shadow 實(shí)現(xiàn),代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12淺析document.createDocumentFragment()與js效率
對(duì)于循環(huán)批量操作頁(yè)面的DOM有很大幫助!利用文檔碎片處理,然后一次性append,并且使用原生的javascript語(yǔ)句操作2013-07-07淺談監(jiān)聽(tīng)單選框radio改變事件(和layui中單選按鈕改變事件)
今天小編就為大家分享一篇淺談監(jiān)聽(tīng)單選框radio改變事件(和layui中單選按鈕改變事件),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-09-09JavaScript復(fù)制變量三種方法實(shí)例詳解
這篇文章主要介紹了JavaScript復(fù)制變量三種方法實(shí)例詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01JavaScript的事件監(jiān)聽(tīng)你了解嗎
這篇文章主要為大家詳細(xì)介紹了JavaScript的事件監(jiān)聽(tīng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-03-03微信小程序長(zhǎng)按識(shí)別二維碼的幾種情況分析
最近接到需求,在小程序內(nèi)部長(zhǎng)按識(shí)別二維碼添加個(gè)人微信,下面這篇文章主要給大家分析介紹了關(guān)于微信小程序長(zhǎng)按識(shí)別二維碼的幾種情況,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08微信小程序?qū)崿F(xiàn)簡(jiǎn)單倒計(jì)時(shí)功能
這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)簡(jiǎn)單倒計(jì)時(shí)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05