」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 只需幾行 JavaScript 即可更改淺色和深色主題

只需幾行 JavaScript 即可更改淺色和深色主題

發佈於2024-08-26
瀏覽:371

好吧..牽涉到一點CSS?但它比我在網路上找到的答案要容易得多。

我想要實現什麼?
我試圖用這種方法實現兩件事。

  1. 我需要允許網站以使用者喜歡的方式載入(他們已經在作業系統中選擇主題的部分)
  2. 但我也想允許它們在加載後在深色和淺色模式之間切換。

因此,我們將擁有一個網站,該網站將加載用戶期望的主題,然後允許他們在需要時進行更改。

第 1 步:建立用於切換的按鈕

只需幾行 JavaScript 即可更改淺色和深色主題

我使用一個圖像作為我的按鈕,其中有一個月亮的 svg 圖像。您可以新增您感覺可以在兩個選項之間切換的按鈕或複選框。

第 2 步:將顏色詳細資訊作為自訂屬性放入 CSS 中

:root{
    color-scheme: light dark;

    --light-bg: ghostwhite;
    --light-color: darkslategray;
    --light-code: tomato;

    --dark-bg: darkslategray;
    --dark-color: ghostwhite;
    --dark-code: gold;
}

.light{
    color-scheme: light;
}

.dark{
    color-scheme: dark;
}

好吧..所以在根中你會看到名為 color-scheme 的屬性,這將成為我們的遊戲規則改變者。
正如您所看到的,它需要淺色或深色的值。我還創建了兩個類別 .light 和 .dark,將顏色方案的值設為深色或淺色。

第 3 步:為程式碼的各個部分加上顏色

body{
    background-color: light-dark(var(--light-bg), var(--dark-bg));
}

現在每當屬性要求顏色(如背景、顏色屬性)時,您可以使用名為 light-dark() 的函數。
此函數有兩個值,第一個值在顏色方案設定為淺色時使用,第二個值在顏色方案設定為深色時使用。

是的...這是2024年5月發布的功能。它相當新,但很快就會適應。截至撰寫本文時,它處於基線支援中。這是它的文檔

Change Light and Dark theme in just lines of JavaScript

light-dark() - CSS:級聯樣式表 | light-dark() MDN

light-dark() CSS 函數可以為屬性設定兩種顏色- 透過偵測開發人員是否設定了淺色或深色配色方案或使用者是否請求了淺色或深色主題來傳回兩種顏色選項之一-無需將主題顏色包含在首選顏色方案媒體功能查詢中。 使用者可以透過作業系統設定(例如淺色或深色模式)或使用者代理設定來表明他們的顏色方案偏好。 light-dark() 函數可以提供兩個顏色值,其中任何 值都可以接受。如果使用者的首選項設定為淺色或未設定首選項,則 light-dark() CSS 顏色函數傳回第一個值;如果使用者的首選項設為深色,則傳回第二個值。

Change Light and Dark theme in just lines of JavaScript 開發者.mozilla.org

如果您使用此功能,CSS 將自動從作業系統偵測使用者首選項並將其設定為他們想要的顏色。
我們實現了第一個目標,網站將載入用戶作業系統中已經想要的顏色模式。

第 4 步:使用 Javascript 在深色模式和淺色模式之間切換

// mode is the toggle button 
mode.addEventListener("click", ()=>{
    // we are getting the color scheme here
    let theme = document.documentElement.style.colorScheme;
    /*  when a website is first loaded
    it will have null as its color-scheme value*/
    if(theme == null){
        // this window.matchMedia() checks if the user prefers the dark theme
        if(window.matchMedia("(prefers-color-scheme:dark)").matches){
            /* if they prefer dark, clicking on our button should turn everything to light, 
            the color-scheme will be given a value as light  */
            document.documentElement.style.colorScheme = "light"; 
        }
        // Or else the color-scheme will be set to dark
        document.documentElement.style.colorScheme = "dark";
    }

    /* Now since our toggle button set the color scheme,
        we can simply change light to dark and dark to light using below code 
    */

    else{
        document.documentElement.style.colorScheme = (theme == "light")? "dark": "light";
    }
});

這裡,document.documentElement.style.colorScheme實際上引用了CSS中的:root元素。
由於我們在上一個步驟中已經實現了以使用者首選模式開啟網站,因此當單擊切換按鈕時,它會執行以下操作。

  1. 它檢查 color-scheme 是否有任何值,如果沒有,網站處於使用者首選模式,我們需要確定是深色還是淺色來更改模式。
  2. 它使用window.matchMedia("(prefers-color-scheme:dark)").matches 來查找是否處於深色模式,如果處於深色模式,我們將color-scheme 更改為淺色,如果不是,我們將其更改為深色。
  3. 下次他們點擊按鈕時,我們已經為顏色方案設定了值,因此我們只需在深色或淺色之間切換。

*PS:*這是我的第一篇文章,我仍然是網頁開發的初學者。但當我搜尋這個方法時,並沒有看到任何相關的貼文。如果您已經知道這一點,我很抱歉點擊誘餌您?我認為這篇文章將幫助我在每次開發新專案時記住這個過程。
如果您正在努力讓您的網站在舊瀏覽器上運行,那麼此方法絕對不適合您。在關於這篇文章的評論中告訴我。感謝您的閱讀。

版本聲明 本文轉載於:https://dev.to/stewardrighteous/change-light-and-dark-theme-in-just-10-lines-of-javascript-25pp?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • Python垃圾收集器如何自動管理記憶體?
    Python垃圾收集器如何自動管理記憶體?
    Python 垃圾收集器文件Python 垃圾收集器是一個記憶體管理系統,可以自動釋放程式不再使用的記憶體。這有助於透過防止記憶體洩漏並確保程式不會耗盡記憶體來提高效能。 垃圾收集器的工作過程分為兩步:引用計數: 解釋器追蹤每個物件的引用數量。當引用計數達到零時,該物件被認為不可達,並添加到要刪除的...
    程式設計 發佈於2024-11-07
  • PHP 如何有效率地處理大整數?
    PHP 如何有效率地處理大整數?
    PHP 可以處理大整數嗎? PHP 可能沒有明確的「BigInteger」類,但它提供了幾種處理大整數的方法整數。 使用 BC 數學函數PHP 提供BC 數學函數,如用於整數算術的 bcadd() 和 bcsub()。然而,這種方法對於大量計算來說可能會很慢。 使用 GMP 擴展GMP(GNU 多精...
    程式設計 發佈於2024-11-07
  • 如何使用 Python 字串匹配驗證 IP 位址輸入?
    如何使用 Python 字串匹配驗證 IP 位址輸入?
    使用 Python 驗證 IP 位址輸入驗證使用者輸入的 IP 位址在各種應用中至關重要。本文將探討驗證以字串形式提供的 IP 位址合法性的最有效方法。 首選方法偏離解析,而是利用 Python 標準函式庫的套接字模組。透過利用 inet_aton(),我們可以確定輸入字串是否代表有效的 IP 位址...
    程式設計 發佈於2024-11-07
  • 那麼 Pull 請求如何再次發揮作用呢?螢幕顯示#3
    那麼 Pull 請求如何再次發揮作用呢?螢幕顯示#3
    在我之前的文章中,我談到了啟動一個基於開源 GenAI 的終端應用程式。本週的任務是為另一個用戶的專案貢獻一個新功能。由於我們必須與新人合作,所以我與 Lily 合作,她開發了一個應用程序,其代碼改進功能與我的類似,只是她的角色是老鼠! 有時間的話可以去看看她的專案老鼠助手。 她的程式碼是用 T...
    程式設計 發佈於2024-11-07
  • 為什麼 Go 中不能直接將 []string 轉換為 []interface{}?
    為什麼 Go 中不能直接將 []string 轉換為 []interface{}?
    為什麼將[]string 轉換為[]interface{} 會在Go 中引發編譯錯誤轉換字串切片([] string)考慮到它們共享切片特徵以及[]string 的每個元素都可以被視為一個接口,Go 中的接口切片([]interface{}) 似乎很簡單。然而,嘗試這種轉換時會出現編譯錯誤,讓程式設...
    程式設計 發佈於2024-11-07
  • 理解 Shadow DOM:封裝 Web 元件的關鍵
    理解 Shadow DOM:封裝 Web 元件的關鍵
    在現代 Web 開發中,創建可重複使用和可維護的元件至關重要。 Shadow DOM 是 Web 元件標準的一部分,在實現這一目標方面發揮著至關重要的作用。本文深入探討了 Shadow DOM 的概念、它的優點以及如何在您的專案中有效地使用它。 什麼是 Shadow DOM? Sh...
    程式設計 發佈於2024-11-07
  • 如何使用 Java 運行時解決輸出重定向問題?
    如何使用 Java 運行時解決輸出重定向問題?
    使用Runtime 的exec() 方法解決輸出重定向問題在Java 中,利用Runtime.getRuntime().exec() 運行指令可以擷取進程的輸出和錯誤流。但是,在需要輸出重定向的情況下,單獨使用此方法可能會無效。 問題:輸出未重定向當使用Runtime.getRuntime().ex...
    程式設計 發佈於2024-11-07
  • 如何使用 CSS 懸停效果從左到右填滿背景顏色?
    如何使用 CSS 懸停效果從左到右填滿背景顏色?
    使用CSS 從左到右填充背景顏色在CSS 中,您可以透過利用線性漸層和動畫背景定位來創造迷人的懸停效果。這種方法使您能夠在懸停時從左到右用新顏色填充元素的背景。 線性漸變和背景大小關鍵是使用由兩種顏色組成的線性漸變背景,並將背景大小設定為元素寬度的兩倍。這允許您在兩種顏色之間創建無縫過渡。 背景定位...
    程式設計 發佈於2024-11-07
  • GraalVM 本機映像中的記憶體管理
    GraalVM 本機映像中的記憶體管理
    内存管理是计算机软件开发的重要组成部分,负责应用程序中内存的有效分配、利用和释放。其重要性在于增强软件性能,保证系统稳定性。 垃圾收集 垃圾收集 (GC) 在 Java 和 Go 等当代编程语言中至关重要。它自动检测并回收未使用的内存,从而减轻开发人员手动管理内存的需要。 GC 的概...
    程式設計 發佈於2024-11-07
  • ## 在 C++ 中什麼時候應該使用參考作為函數參數?
    ## 在 C++ 中什麼時候應該使用參考作為函數參數?
    在 C 中傳遞參數:瞭解引用在 C 中,函數參數的行為由其型別決定。一個重要的區別是「按值傳遞」和「按引用傳遞」。 為什麼在函數參數中使用引用? 引用在函數參數中用於兩種情況主要原因:修改參數:引用允許函數修改值論證通過了。這意味著該函數可以進行呼叫者可見的更改。 避免物件複製: 透過引用傳遞大物件...
    程式設計 發佈於2024-11-07
  • 為什麼會出現“getaddrinfo 失敗”以及如何修復?
    為什麼會出現“getaddrinfo 失敗”以及如何修復?
    探索“getaddrinfo failed”錯誤名稱解析過程中發生錯誤“getaddrinfo failed”,其中主機名稱被翻譯轉換為IP 位址。它顯示所提供的主機名的解析有問題。 深入研究錯誤情境從提供的錯誤追蹤中,我們可以將原因追溯到套接字。 getaddrinfo(主機,連接埠)方法。當無法...
    程式設計 發佈於2024-11-07
  • 如何在單一命令列中運行多行命令?
    如何在單一命令列中運行多行命令?
    如何在一行命令列中執行多行語句使用Python的-c選項執行單行循環時,在循環之前導入模組會導致語法錯誤。這是因為Python解釋器將程式碼區塊視為單一語句。 要解決此問題,可以採用以下幾種方法:使用管道要克服語法錯誤,請使用echo 命令將程式碼區塊作為一系列輸入行重定向到Python:echo ...
    程式設計 發佈於2024-11-07
  • 如何在 PHP 中從 MySQL 遷移到 MySQLi?
    如何在 PHP 中從 MySQL 遷移到 MySQLi?
    從 MySQL 遷移到 MySQLi將網站從 MySQL 遷移到 MySQLi 需要修改 PHP 程式碼,但資料庫本身基本上不受影響。 MySQLi 是 MySQL 擴充功能的改進版本,提供增強的功能和安全性。 PHP 程式碼變更是的,您可以簡單地將 MySQLi 函數替換為 MySQL 函數。這裡...
    程式設計 發佈於2024-11-07
  • 如何在CSS中實現背景和子元素的不同透明度?
    如何在CSS中實現背景和子元素的不同透明度?
    理解 CSS 背景不透明度在 CSS 中,不透明度控制元素的透明度。當應用於容器時,它自然會影響背景及其子元素。 繼承問題要實現背景和子元素不同的不透明度, CSS 繼承帶來了挑戰。子元素從其父容器繼承不透明度,從而導致所提供範例中的背景和文字具有相同的不透明度。 實現所需不透明度的解決方案實現要達...
    程式設計 發佈於2024-11-07
  • 【個人網站】Next如何整合Notion資料庫
    【個人網站】Next如何整合Notion資料庫
    To integrate a Notion database into a Next.js project, you can use Notion as a content management system (CMS) and display its content on your website...
    程式設計 發佈於2024-11-07

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3