怎样在JavaScript中实现主题切换?

来源:IPIPP.com作者:头衔:全栈工程师
导读:本期聚焦于小伙伴创作的《怎样在JavaScript中实现主题切换?》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《怎样在JavaScript中实现主题切换?》有用,将其分享出去将是对创作者最好的鼓励。

主题切换是前端项目中很常见的功能,核心是通过JavaScript动态修改页面生效的样式规则,同时保存用户的偏好设置。下面我们一步步实现完整的主题切换功能。

怎样在JavaScript中实现主题切换?

第一步:定义CSS变量区分不同主题

首先我们需要在CSS根节点定义不同主题的变量,这里以浅色和深色两种主题为例:

/* 定义根节点的CSS变量,默认浅色主题 */
:root {
  --bg-color: #ffffff;
  --text-color: #333333;
  --primary-color: #1890ff;
}

/* 深色主题的类名,应用到html节点时生效 */
.dark-theme {
  --bg-color: #1f1f1f;
  --text-color: #e5e5e5;
  --primary-color: #177ddc;
}

/* 全局样式使用变量 */
body {
  background-color: var(--bg-color);
  color: var(--text-color);
  transition: background-color 0.3s, color 0.3s;
}

button {
  background-color: var(--primary-color);
  color: #ffffff;
  border: none;
  padding: 8px 16px;
  border-radius: 4px;
  cursor: pointer;
}

第二步:编写JavaScript切换逻辑

接下来编写切换主题的核心函数,主要包括切换主题类、更新存储、同步切换按钮状态三个部分:

// 获取html根节点
const htmlElement = document.documentElement;
// 获取主题切换按钮,假设按钮id为themeToggle
const themeToggleBtn = document.getElementById('themeToggle');

// 切换主题的函数
function toggleTheme() {
  // 判断当前是否是深色主题
  const isDark = htmlElement.classList.contains('dark-theme');
  if (isDark) {
    // 切换到浅色主题,移除深色类
    htmlElement.classList.remove('dark-theme');
    // 存储用户选择到localStorage
    localStorage.setItem('theme', 'light');
  } else {
    // 切换到深色主题,添加深色类
    htmlElement.classList.add('dark-theme');
    localStorage.setItem('theme', 'dark');
  }
  // 更新按钮显示文本
  updateToggleBtnText();
}

// 更新切换按钮的显示文本
function updateToggleBtnText() {
  const isDark = htmlElement.classList.contains('dark-theme');
  themeToggleBtn.textContent = isDark ? '切换到浅色主题' : '切换到深色主题';
}

// 给按钮绑定点击事件
themeToggleBtn.addEventListener('click', toggleTheme);

第三步:初始化时读取存储的主题

页面加载时需要先读取localStorage中存储的用户主题偏好,避免刷新后主题重置:

// 页面加载完成后初始化主题
document.addEventListener('DOMContentLoaded', () => {
  // 读取存储的主题,默认是light
  const savedTheme = localStorage.getItem('theme') || 'light';
  if (savedTheme === 'dark') {
    htmlElement.classList.add('dark-theme');
  } else {
    htmlElement.classList.remove('dark-theme');
  }
  // 初始化按钮文本
  updateToggleBtnText();
});

实际使用示例

下面是完整的HTML示例,可以直接复制到本地运行测试:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>JavaScript主题切换示例</title>
  <style>
    :root {
      --bg-color: #ffffff;
      --text-color: #333333;
      --primary-color: #1890ff;
    }
    .dark-theme {
      --bg-color: #1f1f1f;
      --text-color: #e5e5e5;
      --primary-color: #177ddc;
    }
    body {
      background-color: var(--bg-color);
      color: var(--text-color);
      transition: background-color 0.3s, color 0.3s;
      padding: 20px;
      font-family: sans-serif;
    }
    button {
      background-color: var(--primary-color);
      color: #ffffff;
      border: none;
      padding: 8px 16px;
      border-radius: 4px;
      cursor: pointer;
    }
  </style>
</head>
<body>
  <h2>主题切换示例</h2>
  <p>点击下面的按钮可以切换浅色和深色主题,刷新页面后主题会保持上次的选择。</p>
  <button id="themeToggle">切换到深色主题</button>
  <script>
    const htmlElement = document.documentElement;
    const themeToggleBtn = document.getElementById('themeToggle');
    
    function toggleTheme() {
      const isDark = htmlElement.classList.contains('dark-theme');
      if (isDark) {
        htmlElement.classList.remove('dark-theme');
        localStorage.setItem('theme', 'light');
      } else {
        htmlElement.classList.add('dark-theme');
        localStorage.setItem('theme', 'dark');
      }
      updateToggleBtnText();
    }
    
    function updateToggleBtnText() {
      const isDark = htmlElement.classList.contains('dark-theme');
      themeToggleBtn.textContent = isDark ? '切换到浅色主题' : '切换到深色主题';
    }
    
    document.addEventListener('DOMContentLoaded', () => {
      const savedTheme = localStorage.getItem('theme') || 'light';
      if (savedTheme === 'dark') {
        htmlElement.classList.add('dark-theme');
      } else {
        htmlElement.classList.remove('dark-theme');
      }
      updateToggleBtnText();
    });
    
    themeToggleBtn.addEventListener('click', toggleTheme);
  </script>
</body>
</html>

扩展说明

如果需要支持更多主题,只需要新增对应的CSS类,在切换函数中增加对应的判断逻辑即可。另外如果需要跟随系统的主题偏好自动切换,可以结合window.matchMedia('(prefers-color-scheme: dark)')来监听系统主题变化,实现更智能的主题适配。

JavaScript主题切换CSS变量localStorage前端交互修改时间:2026-05-29 23:36:51

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。