」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 如何使用 CSS 和 JavaScript 將網站切換到深色模式

如何使用 CSS 和 JavaScript 將網站切換到深色模式

發佈於2024-08-31
瀏覽:779

How to Switch Your Website to Dark Mode Using CSS and JavaScript

介紹

深色模式是一種使用深色背景和淺色文字和元素的顯示設定。它之所以受歡迎,是因為它看起來不錯並且提供了一些實際好處。

深色模式的好處包括:

  1. 減少眼睛疲勞:深色模式可以減少眼睛發出的強光,因此更適合眼睛,尤其是在弱光環境中。
  2. 延長OLED 螢幕的電池壽命: 在OLED(有機發光二極管)螢幕上,深色模式可以節省電池壽命,因為黑色像素基本上被關閉,與顯示明亮的顏色相比,消耗的電量更少。

在本教學中,我們將介紹如何使用 CSS 和 JavaScript 將網站切換到深色模式。我們將從一個簡單的淺色主題網頁模板開始,將其改造成一個可切換淺色/深色模式的網站,讓用戶可以在淺色和深色主題之間順利切換。

設定項目

讓我們從一個簡單的淺色主題網頁範本開始。然後,我們將其改造成一個可切換明暗模式的網站,讓使用者在明暗主題之間切換。

實現深色模式樣式

選擇顏色

第一步是列出我們正在使用的所有顏色,並為每種顏色選擇深色主題版本。在下表中,我列出了頁面上的所有顏色及其對應的深色版本。

姓名 精簡版 深色版
body-bg #f4f4f4 #121212
主要文本 #333333 #e0e0e0
頁首-頁尾-bg #333333 #181818
頁首-頁尾-文字 #ffffff #ffffff
section-bg #ffffff #1f1f1f
輔助文本 #006baf #1e90ff
陰影 rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.2)

自訂變數

然後我們使用 CSS 變數在 body 上使用這些變數來建立一個深色和淺色類別。

body.dark {
    --body-bg: #121212;
    --primary-text: #e0e0e0;
    --header-footer-bg: #1f1f1f;
    --header-footer-text: #ffffff;
    --section-bg: #1f1f1f;
    --secondary-text: #1e90ff;
    --shadow: rgba(0, 0, 0, 0.2);
}

body.light {
    --body-bg: #f4f4f4;
    --primary-text: #333333;
    --header-footer-bg: #333333;
    --header-footer-text: #ffffff;
    --section-bg: #ffffff;
    --secondary-text: #006baf;
    --shadow: rgba(0, 0, 0, 0.1);
}

您可以在使用 CSS 自訂屬性中閱讀有關 CSS 變數的內容。本質上,它們是使用兩個破折號 (--) 定義的實體,用於儲存值以便在文件中重複使用。 CSS 變數允許自動更新更改,從而使維護變得更加容易。

動態元素顏色

我們使用 var() CSS 函數插入 CSS 變數的值。這樣,我們就可以動態更改顏色並更新一個變數以反映整個文件的更改,而不是手動更改每個變數。

這是 nav 元素及其子元素的例子:

body {
  background-color: var(--body-bg);
  color: var(--primary-text);
}

header, footer {
  background-color: var(--header-footer-bg);
  color: var(--header-footer-text);
}

article {
  background-color: var(--section-bg);
  box-shadow: 0 4px 8px var(--shadow);
}

a {
  color: var(--secondary-text);
}

使用 JavaScript 切換亮/暗模式

現在我們可以將主體的類別改為深色或淺色來切換主體。首先,在標題中新增一個按鈕,並為其點擊事件設定changeTheme()函數:


定義切換主體類別的changeTheme()函數:

function changeTheme() {
    if (document.body.classList.contains('light')) {
        document.body.classList.remove('light');
        document.body.classList.add('dark');
    } else {
        document.body.classList.remove('dark');
        document.body.classList.add('light');
    }
}

現在使用者可以透過點擊按鈕來更改網站的主題。

下面的CodePen中可以看到教學的程式碼

下一步

此外,您可以將使用者的主題偏好儲存在本機儲存中。更新 changeTheme() 函數以保存選定的主題並在頁面加載時檢查它,這將確保用戶的選擇被記住並在下次訪問時自動套用。

function changeTheme() {
    if (document.body.classList.contains('light')) {
        document.body.classList.remove('light');
        document.body.classList.add('dark');
    } else {
        document.body.classList.remove('dark');
        document.body.classList.add('light');
    }

    // Save the current theme in localStorage
    const theme = document.body.classList.contains('dark') ? 'dark' : 'light';
    localStorage.setItem('theme', theme);
}

document.addEventListener('DOMContentLoaded', function () {
    // Get the saved theme from localStorage when the page loads
    const savedTheme = localStorage.getItem('theme') || 'light';
    document.body.classList.add(savedTheme);
});

添加配色方案:深色;深色主題中的屬性還可以確保某些難以設定樣式的元素的樣式將被瀏覽器更改。

body.dark {
  color-scheme: dark;
}

結論

總而言之,在您的網站中添加深色模式可以透過減少眼睛疲勞並延長 OLED 螢幕的電池壽命來改善用戶體驗。遵循本指南,您可以使用 CSS 和 JavaScript 輕鬆設定亮/暗模式切換。自訂深色模式以適合您的設計。

分享您的實現或在下面的評論中提出問題。

版本聲明 本文轉載於:https://dev.to/msarabi/how-to-switch-your-website-to-dark-mode-using-css-and-javascript-670?1如有侵犯,請聯絡study_golang@163 .com刪除
最新教學 更多>
  • findSequence函數如何使用遞迴進行暴力搜尋?
    findSequence函數如何使用遞迴進行暴力搜尋?
    理解 FindSequence 函數中的遞歸提供的 findSequence 函數依照回溯的強力搜尋原理進行操作。以下是對其遞歸性質的逐步解釋:在每次遞歸調用時,該函數都會嘗試兩種可能的轉換:加法:它添加5 到當前數字,並將方程式與新數字一起儲存。 乘法:將當前數字乘以 3 並相應更新方程式。 遞...
    程式設計 發佈於2024-11-08
  • 了解 DSA 中的時間和空間複雜性:開發人員指南
    了解 DSA 中的時間和空間複雜性:開發人員指南
    介紹 在軟體開發領域,效率是關鍵。無論您是建立小型應用程式還是大型複雜系統,了解程式碼在各種條件下的執行情況都至關重要。這就是時間複雜度和空間複雜度的概念發揮作用的地方。這些指標可協助開發人員評估演算法的效率,引導他們編寫運行速度更快且消耗更少記憶體的程式碼。 在本文中,我們將深...
    程式設計 發佈於2024-11-08
  • 如何批次上傳CSV檔案資料到MySql表中?使用 LOAD DATA 的一種非常快速的方法。
    如何批次上傳CSV檔案資料到MySql表中?使用 LOAD DATA 的一種非常快速的方法。
    ?介紹 您是否仍在使用“for”或“while”循環來迭代行並將它們插入資料庫?您還在編寫單獨的程式碼來讀取 .csv 檔案並將其上傳到 MySQL 資料庫嗎? 用MySQL提供的「LOAD DATA」語句對線性邏輯說「NO」。準備好更改程式碼以最大限度地減少行數並大幅提高效能。...
    程式設計 發佈於2024-11-08
  • 使用住宅代理商解鎖 Facebook 的指南
    使用住宅代理商解鎖 Facebook 的指南
    Facebook作為全球最大的社群媒體平台之一,擁有多種業務場景,包括廣告服務、消費者通訊服務、電子商務、社群媒體平台等。這些業務場景為使用者提供了豐富的社交體驗和商機。在Facebook行銷管理中,穩定且有效率的代理商至關重要。不僅可以保護您的真實IP位址,還可以幫助您突破地域限制,管理多個帳戶,...
    程式設計 發佈於2024-11-08
  • 程式設計日快樂
    程式設計日快樂
    祝福所有社區程式設計師快樂! 這份職業給了我很大的滿足感,也因此我也實現了一些目標。 它讓我透過開發者社群和作為講師的工作與數百人更加接近。非常感謝。 也慶祝一下,享受你的一天。 9 月 12 日慶祝程式設計師節,以強調和慶祝​​在不同數位系統開發中工作的人們的作用。網頁、應用程式、遊戲、軟...
    程式設計 發佈於2024-11-08
  • 如何在 MySQL 中使用 LOAD DATA INFILE 填入自增欄位?
    如何在 MySQL 中使用 LOAD DATA INFILE 填入自增欄位?
    在MySQL 中使用LOAD DATA INFILE 填入自增欄位使用ID 列為自增欄位的現有表時,透過LOAD 匯入資料DATA INFILE 可能會帶來挑戰。本文提供了處理此類場景的有效解決方案。 為了清楚起見,請考慮以下表格結構:--------------------- ID | AFiel...
    程式設計 發佈於2024-11-08
  • JavaScript 中的記憶化:有效提升效能
    JavaScript 中的記憶化:有效提升效能
    簡介:加速 JavaScript JavaScript 是一種多功能但有時速度較慢的程式語言。如果您可以透過簡單的更改使應用程式運行得更快怎麼辦?記憶是一種可以透過記住先前的結果來極大地提高程式速度的技術。 什麼是記憶化? 記憶就像記下你已經解決的數學難題的筆記本。當你再次遇到同樣的問題時,你不...
    程式設計 發佈於2024-11-08
  • ## 使用下拉式選單時還需要 SQL 注入保護嗎?
    ## 使用下拉式選單時還需要 SQL 注入保護嗎?
    使用下拉式選單時 SQL 注入保護是否仍然適用? 人們普遍認為,應始終對使用者輸入持懷疑態度,因為SQL注入的風險。然而,出現了一個問題:這種擔憂是否會擴展到唯一用戶輸入來自下拉式選單的場景? 下拉限制和安全性雖然下拉式選單提供了預定義選項,它們不保證防止使用者輸入的惡意資料。攻擊者可以使用瀏覽器開...
    程式設計 發佈於2024-11-08
  • 可視化貓的偏好
    可視化貓的偏好
    偶然看到一篇文章,名字叫《為什麼貓…? 》,分析了貓咪的一些喜好和行為。裡面的視覺設計非常吸引我。其特點是採用手繪風格和氣泡式佈局。此外,可愛的字體也令人賞心悅目。我非常喜歡貓。我有一隻貓,名叫瓜瓜(意思是可愛又愚蠢)。同樣,我也是前端開發人員。我開發了一個名為 AntV G6 的圖形視覺化框架。因...
    程式設計 發佈於2024-11-08
  • 在黑客馬拉松中使用 Kintone 的技巧
    在黑客馬拉松中使用 Kintone 的技巧
    Introduction When you're participating in a hackathon, efficiency and quick iteration are key to success. One tool that can help you manage d...
    程式設計 發佈於2024-11-08
  • Camp Code - 一種有趣且簡單的學習程式碼的方法
    Camp Code - 一種有趣且簡單的學習程式碼的方法
    ? ?未來的程式設計傳奇,齊聚一堂!營地代碼著火了! ?? 短短 3 天(對程式設計愛好者來說這是 72 小時?): • 超過 1,300 位冒險家加入了我們的程式設計任務? • 超過 300 名勇敢的探索者創建了早期訪問帳戶來測試我們的測試版? ️ 為什麼這麼熱鬧? ? 因為 Camp Cod...
    程式設計 發佈於2024-11-08
  • 隨時隨地的套件管理器(幾天後可用。)
    隨時隨地的套件管理器(幾天後可用。)
    https://github.com/DiegoDev2/Fleet 介紹 Fleet:開發人員的簡單但功能強大的套件管理器? 作為開發人員,我們經常花費大量時間設定環境並安裝不同的工具。我創建了 Fleet 來讓這個過程更容易、更有效率。 什麼是艦隊? Fleet...
    程式設計 發佈於2024-11-08
  • 項目 檢查參數有效性
    項目 檢查參數有效性
    章節:方法設計 重點:方法設計的可用性、穩健性和靈活性。 涵蓋範圍:參數和傳回值處理、方法簽章設計和文件。 第 49 項:檢查參數有效性 - 參數限制: 方法和建構子通常對參數值有限制(例如非負索引、非空引用)。 這些限制必須在方法開始時記錄並驗證。 - 驗證的重要性: 儘早偵測錯誤,以避免...
    程式設計 發佈於2024-11-08
  • 如何在不刪除和重新建立約束的情況下重命名 MySQL 中的外鍵列?
    如何在不刪除和重新建立約束的情況下重命名 MySQL 中的外鍵列?
    重新命名MySQL 中的外鍵列:逐步指南當嘗試重命名MySQL 中充當外鍵列的列時外鍵在另一個表中時,常會遇到錯誤150,表示外鍵約束問題。為了克服這個問題,您可能會遇到這樣的問題:我們能否避免刪除外鍵、重新命名列,然後重新建立外鍵的複雜任務? 標準方法根據MySQL文件和提供的答案,最安全、最直接...
    程式設計 發佈於2024-11-08
  • Go 中如何表示介面:(值、型別)對或方法表?
    Go 中如何表示介面:(值、型別)對或方法表?
    理解 Go 中的介面表示在 Go 中使用介面時,掌握其底層表示非常重要。兩個關鍵資源闡明了這個主題,但他們的觀點不同。 「反射定律」文章(http://blog.golang.org/laws-of-reflection) 介紹了介面的概念包含一個(值,類型)對,如r io.Reader 的範例所示...
    程式設計 發佈於2024-11-08

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

Copyright© 2022 湘ICP备2022001581号-3