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

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

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

好吧..牽涉到一點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]刪除
最新教學 更多>
  • FastAPI自定義404頁面創建指南
    FastAPI自定義404頁面創建指南
    response = await call_next(request) if response.status_code == 404: return RedirectResponse("https://fastapi.tiangolo.com") else: ...
    程式設計 發佈於2025-04-16
  • 為什麼不````''{margin:0; }`始終刪除CSS中的最高邊距?
    為什麼不````''{margin:0; }`始終刪除CSS中的最高邊距?
    在CSS 問題:不正確的代碼: 全球範圍將所有餘量重置為零,如提供的代碼所建議的,可能會導致意外的副作用。解決特定的保證金問題是更建議的。 例如,在提供的示例中,將以下代碼添加到CSS中,將解決餘量問題: body H1 { 保證金頂:-40px; } 此方法更精確,避免了由全局保證金重置...
    程式設計 發佈於2025-04-16
  • 如何從Google API中檢索最新的jQuery庫?
    如何從Google API中檢索最新的jQuery庫?
    從Google APIS 問題中提供的jQuery URL是版本1.2.6。對於檢索最新版本,以前有一種使用特定版本編號的替代方法,它是使用以下語法:獲取最新版本:未壓縮)While these legacy URLs still remain in use, it is recommended ...
    程式設計 發佈於2025-04-16
  • 如何使用Regex在PHP中有效地提取括號內的文本
    如何使用Regex在PHP中有效地提取括號內的文本
    php:在括號內提取文本在處理括號內的文本時,找到最有效的解決方案是必不可少的。一種方法是利用PHP的字符串操作函數,如下所示: 作為替代 $ text ='忽略除此之外的一切(text)'; preg_match('#((。 &&& [Regex使用模式來搜索特...
    程式設計 發佈於2025-04-16
  • Java開發者如何保護數據庫憑證免受反編譯?
    Java開發者如何保護數據庫憑證免受反編譯?
    在java 在單獨的配置文件保護數據庫憑證的最有效方法中存儲憑據是將它們存儲在單獨的配置文件中。該文件可以在運行時加載,從而使登錄數據從編譯的二進製文件中遠離。 使用prevereness class import java.util.prefs.preferences; 公共類示例{ 首選...
    程式設計 發佈於2025-04-16
  • HTML格式標籤
    HTML格式標籤
    HTML 格式化元素 **HTML Formatting is a process of formatting text for better look and feel. HTML provides us ability to format text without us...
    程式設計 發佈於2025-04-16
  • 反射動態實現Go接口用於RPC方法探索
    反射動態實現Go接口用於RPC方法探索
    在GO 使用反射來實現定義RPC式方法的界面。例如,考慮一個接口,例如:鍵入myService接口{ 登錄(用戶名,密碼字符串)(sessionId int,錯誤錯誤) helloworld(sessionid int)(hi String,錯誤錯誤) } 替代方案而不是依靠反射...
    程式設計 發佈於2025-04-16
  • 如何檢查對像是否具有Python中的特定屬性?
    如何檢查對像是否具有Python中的特定屬性?
    方法來確定對象屬性存在尋求一種方法來驗證對像中特定屬性的存在。考慮以下示例,其中嘗試訪問不確定屬性會引起錯誤: >>> a = someClass() >>> A.property Trackback(最近的最新電話): 文件“ ”,第1行, attributeError:SomeClass實...
    程式設計 發佈於2025-04-16
  • 如何修復\“常規錯誤:2006 MySQL Server在插入數據時已經消失\”?
    如何修復\“常規錯誤:2006 MySQL Server在插入數據時已經消失\”?
    How to Resolve "General error: 2006 MySQL server has gone away" While Inserting RecordsIntroduction:Inserting data into a MySQL database can...
    程式設計 發佈於2025-04-16
  • 如何使用Python理解有效地創建字典?
    如何使用Python理解有效地創建字典?
    在python中,詞典綜合提供了一種生成新詞典的簡潔方法。儘管它們與列表綜合相似,但存在一些顯著差異。 與問題所暗示的不同,您無法為鑰匙創建字典理解。您必須明確指定鍵和值。 For example:d = {n: n**2 for n in range(5)}This creates a dict...
    程式設計 發佈於2025-04-16
  • 為什麼我會收到MySQL錯誤#1089:錯誤的前綴密鑰?
    為什麼我會收到MySQL錯誤#1089:錯誤的前綴密鑰?
    mySQL錯誤#1089:錯誤的前綴鍵錯誤descript [#1089-不正確的前綴鍵在嘗試在表中創建一個prefix鍵時會出現。前綴鍵旨在索引字符串列的特定前綴長度長度,可以更快地搜索這些前綴。 了解prefix keys `這將在整個Movie_ID列上創建標準主鍵。主密鑰對於唯一識...
    程式設計 發佈於2025-04-16
  • 如何在Java中正確顯示“ DD/MM/YYYY HH:MM:SS.SS”格式的當前日期和時間?
    如何在Java中正確顯示“ DD/MM/YYYY HH:MM:SS.SS”格式的當前日期和時間?
    如何在“ dd/mm/yyyy hh:mm:mm:ss.ss”格式“ gormat 解決方案: args)拋出異常{ 日曆cal = calendar.getInstance(); SimpleDateFormat SDF =新的SimpleDateFormat(“...
    程式設計 發佈於2025-04-16
  • 如何在Java的全屏獨家模式下處理用戶輸入?
    如何在Java的全屏獨家模式下處理用戶輸入?
    Handling User Input in Full Screen Exclusive Mode in JavaIntroductionWhen running a Java application in full screen exclusive mode, the usual event ha...
    程式設計 發佈於2025-04-16
  • C++20 Consteval函數中模板參數能否依賴於函數參數?
    C++20 Consteval函數中模板參數能否依賴於函數參數?
    [ consteval函數和模板參數依賴於函數參數在C 17中,模板參數不能依賴一個函數參數,因為編譯器仍然需要對非contexexpr futcoriations contim at contexpr function進行評估。 compile time。 C 20引入恆定函數,必須在編譯時進...
    程式設計 發佈於2025-04-16
  • 如何從PHP中的Unicode字符串中有效地產生對URL友好的sl。
    如何從PHP中的Unicode字符串中有效地產生對URL友好的sl。
    為有效的slug生成首先,該函數用指定的分隔符替換所有非字母或數字字符。此步驟可確保slug遵守URL慣例。隨後,它採用ICONV函數將文本簡化為us-ascii兼容格式,從而允許更廣泛的字符集合兼容性。 接下來,該函數使用正則表達式刪除了不需要的字符,例如特殊字符和空格。此步驟可確保slug僅包...
    程式設計 發佈於2025-04-16

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

Copyright© 2022 湘ICP备2022001581号-3