”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 如何使用 CSS 和 JavaScript 将网站切换到深色模式

如何使用 CSS 和 JavaScript 将网站切换到深色模式

发布于2024-08-31
浏览:290

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如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何在不支持的浏览器中实现“背景滤镜”效果?
    如何在不支持的浏览器中实现“背景滤镜”效果?
    CSS:为不可用的背景过滤器提供替代方案CSS 中的背景过滤器功能在大多数现代浏览器中仍然无法访问。虽然我们预计其未来的支持,但发现替代解决方案势在必行。实现类似效果的一种方法是采用具有微妙透明度的背景。下面的 CSS 代码演示了这种方法:/* Slightly transparent fallba...
    编程 发布于2024-11-08
  • Python 的 len() 函数对于不同的数据结构有多高效?
    Python 的 len() 函数对于不同的数据结构有多高效?
    理解Python内置数据结构中len()函数的成本Python中内置len()函数是确定各种数据结构长度的重要工具。它的效率至关重要,尤其是在处理大型数据集时。本文深入研究了 len() 对于不同内置数据类型(例如列表、元组、字符串和字典)的计算成本。O(1) 跨内置类型的复杂性关键要点是 len(...
    编程 发布于2024-11-08
  • 如何在 Python 中访问 Windows 剪贴板文本?
    如何在 Python 中访问 Windows 剪贴板文本?
    在 Python 中访问 Windows 剪贴板文本从 Windows 剪贴板检索文本是编程中的常见任务。本文探讨了如何使用 Python 的 win32clipboard 模块来实现此目的。pywin32 和 win32clipboardwin32clipboard 模块是 pywin32 的一部...
    编程 发布于2024-11-08
  • 如何修复 CentOS 5 上由于文件权限问题导致的 Nginx 403 Forbidden 错误?
    如何修复 CentOS 5 上由于文件权限问题导致的 Nginx 403 Forbidden 错误?
    Nginx 403 Forbidden:文件访问权限故障排除当在 Nginx 中遇到令人沮丧的“403禁止”错误时,确定根本原因可以是一个挑战。此错误通常表示对文件或目录的访问被拒绝。在该特定场景中,用户在 CentOS 5 上使用 PHP-FPM 配置了 Nginx,但无法提供指定源目录中的任何文...
    编程 发布于2024-11-08
  • React 中的函数和类组件与 TypeScript
    React 中的函数和类组件与 TypeScript
    在使用 TypeScript 的 React 中,我们可以使用两种主要方法来创建组件:功能组件和类组件。两种方法都允许使用 props 和 state,但使用的范例略有不同。 TypeScript 通过提供静态类型进一步增强了开发安全性,这使我们能够精确定义 props 和 state 的形状。 ...
    编程 发布于2024-11-08
  • 如何使用 Clang 检查编译器生成的 C++ 模板实例化代码?
    如何使用 Clang 检查编译器生成的 C++ 模板实例化代码?
    检查 C 语言中编译器生成的模板实例化 在 C 语言中,模板函数和类允许通过定义通用功能来重用代码专门针对不同类型。要了解编译器为模板实例化生成的代码,了解这些实例化的函数或类会很有帮助。Clang 的 AST 打印功能一个工具提供这种可见性的是 Clang 的抽象语法树 (AST) 打印功能,Cl...
    编程 发布于2024-11-08
  • 我从使用 Vue.js 构建计算器中学到了什么
    我从使用 Vue.js 构建计算器中学到了什么
    对于我的第四个项目,我使用 Vue.js 开发了一个 计算器 应用程序。对于理解如何处理用户输入、显示动态结果以及使用 JavaScript 执行计算来说,这是一次宝贵的经验。以下是我在构建此应用程序时学到的主要经验教训的细分。 1. 处理用户输入并更新显示 计算器需要接受用户输入(...
    编程 发布于2024-11-08
  • 在 Kubernetes 上设置 JFrog Artifactory 并连接 Spring Boot 应用程序
    在 Kubernetes 上设置 JFrog Artifactory 并连接 Spring Boot 应用程序
    本文档提供有关在 Kubernetes 集群中设置 JFrog Artifactory 的指南。它作为开发人员在本地计算机上运行的 Kubernetes 环境上安装和配置 JFrog 的基本教程。 设置本地环境来构建DevOps资源 我使用 Docker 容器为多个应用程序设置工作环...
    编程 发布于2024-11-08
  • Angular 与 React:4 中你应该选择哪一个?
    Angular 与 React:4 中你应该选择哪一个?
    前端开发者总是面临一个大问题:Angular 还是 React? 两个框架都很强大,但哪一个真正适合你的开发需求? ? 在这个全面的比较中,我详细分析了每个项目的主要差异、优势和劣势,帮助您为下一个项目做出正确的选择。无论您是初学者还是经验丰富的专业人士,本文都会为您提供做出明智决定所需的见解。 ?...
    编程 发布于2024-11-08
  • 如何将 Props 传递给 React Router 中的处理程序组件?
    如何将 Props 传递给 React Router 中的处理程序组件?
    使用 React Router 将 Props 传递给处理程序组件在利用 React Router 的 React.js 应用程序中,您可能会遇到需要将 props 传递给特定处理程序组件的场景。考虑以下应用程序结构:var Dashboard = require('./Dashboard'); v...
    编程 发布于2024-11-08
  • 通过 Maroto 在 Golang 中生成 PDF 来进行长期操作
    通过 Maroto 在 Golang 中生成 PDF 来进行长期操作
    Written by Subha Chanda✏️ Go, also known as Golang, is a statically typed, compiled programming language designed by Google. It combines the performan...
    编程 发布于2024-11-08
  • 操作系统开发(真相)
    操作系统开发(真相)
    Table of Contents Introduction 1. The Bootloader: Kicking Things Off 2. Entering the Kernel: Where the Magic Happens 3. Choosing Your Languag...
    编程 发布于2024-11-08
  • 按值传递或引用传递:“想要速度?按值传递”何时是真的?
    按值传递或引用传递:“想要速度?按值传递”何时是真的?
    “想要速度?按价值传递” - 探索性能影响Scott Meyers 的声明“想要速度?按价值传递”提出了问题关于按值传递对象与按引用传递对象的性能优势。在这种情况下,按值传递涉及复制操作,而按引用传递则避免了不必要的复制。考虑以下结构体 X 和 Y 的示例:struct X { std::str...
    编程 发布于2024-11-08
  • 什么是打字稿?
    什么是打字稿?
    TypeScript 是 JavaScript 的超集,为语言添加了可选的静态类型。它为大型 JavaScript 项目提供了更好的工具、改进的代码组织和增强的可扩展性。 TypeScript 代码最终被编译为纯 JavaScript,然后可以在任何 JavaScript 运行时环境中执行。 学习...
    编程 发布于2024-11-08
  • 第一次使用 Git 远程工作
    第一次使用 Git 远程工作
    介绍 本周,我加深了对 Git 的理解,特别是使用 Git 遥控器。作为先决条件,在处理远程时熟悉 Git 合并至关重要。上周,我分享了我第一次使用 Git merge 的经验并讨论了一些最佳实践。本周,我在开发新功能时应用了这些知识,不是在我自己的存储库中,而是在合作者的存储库(...
    编程 发布于2024-11-08

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3