下面给你整理一个 纯 HTML + JavaScript + CSS 实现亮色(Light Mode)和暗色(Dark Mode)切换功能的完整示例,包含最佳实践、localStorage 保存用户偏好,以及动画过渡效果。


1️⃣ HTML 结构

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>亮暗模式切换</title>
  <link rel="stylesheet" href="style.css">
</head>
<body>
  <header>
    <h1>亮暗模式切换示例</h1>
    <button id="toggle-theme">切换模式</button>
  </header>

  <main>
    <p>这是一个示例文本,体验亮色和暗色模式的切换效果。</p>
  </main>

  <script src="script.js"></script>
</body>
</html>


2️⃣ CSS 样式(亮色 & 暗色)

/* style.css */

/* 默认亮色模式 */
:root {
  --bg-color: #ffffff;
  --text-color: #000000;
  --header-bg: #f0f0f0;
  --btn-bg: #000000;
  --btn-color: #ffffff;
  --transition-time: 0.3s;
}

body {
  background-color: var(--bg-color);
  color: var(--text-color);
  font-family: Arial, sans-serif;
  transition: background-color var(--transition-time), color var(--transition-time);
}

header {
  background-color: var(--header-bg);
  padding: 1rem;
  display: flex;
  justify-content: space-between;
  align-items: center;
  transition: background-color var(--transition-time);
}

button {
  background-color: var(--btn-bg);
  color: var(--btn-color);
  border: none;
  padding: 0.5rem 1rem;
  cursor: pointer;
  border-radius: 4px;
  transition: background-color var(--transition-time), color var(--transition-time);
}

/* 暗色模式 */
body.dark-mode {
  --bg-color: #121212;
  --text-color: #e0e0e0;
  --header-bg: #1f1f1f;
  --btn-bg: #e0e0e0;
  --btn-color: #121212;
}

✅ 特点:

  • 使用 CSS 变量--bg-color--text-color 等)轻松切换主题
  • 使用 transition 实现平滑动画
  • body.dark-mode 控制暗色模式

3️⃣ JavaScript 功能实现

// script.js

const toggleBtn = document.getElementById('toggle-theme');
const body = document.body;

// 初始化:读取 localStorage
const currentTheme = localStorage.getItem('theme');
if (currentTheme === 'dark') {
  body.classList.add('dark-mode');
}

// 切换模式
toggleBtn.addEventListener('click', () => {
  body.classList.toggle('dark-mode');

  // 保存用户偏好
  if (body.classList.contains('dark-mode')) {
    localStorage.setItem('theme', 'dark');
  } else {
    localStorage.setItem('theme', 'light');
  }
});

✅ 功能点:

  1. 点击按钮切换亮暗模式
  2. 使用 classList.toggle 切换 dark-mode
  3. 使用 localStorage 保存用户选择,下次访问页面自动加载偏好
  4. CSS 变量和 transition 实现平滑切换

4️⃣ 可选扩展功能

  1. 自动跟随系统主题
if (!localStorage.getItem('theme')) {
  const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
  if (prefersDark) body.classList.add('dark-mode');
}

  1. 切换按钮图标
<button id="toggle-theme">🌙</button>

toggleBtn.addEventListener('click', () => {
  body.classList.toggle('dark-mode');
  toggleBtn.textContent = body.classList.contains('dark-mode') ? '☀️' : '🌙';
});

  1. 更多主题
  • 可以定义更多 CSS 变量,如 --link-color--card-bg
  • 通过 body.classList 切换不同主题

5️⃣ 最终效果

  • 初始页面为亮色(白底黑字)
  • 点击按钮平滑切换暗色(深色背景,浅色文字)
  • 用户刷新页面后仍保持选择模式
  • 可扩展为多种主题、系统自动匹配