You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用JavaScript根据用户时间自动切换浅色/深色主题?

根据用户时间自动切换浅色/深色主题

我们可以在原有手动切换的基础上,添加时间自动判断逻辑,同时保留用户手动选择的优先级(即用户手动切换后,优先使用用户设置的主题;未手动设置时,才根据时间自动切换)。以下是修改后的完整实现:

1. 核心逻辑说明

  • 自定义深色模式的时间段(示例为18:00 - 次日6:00,可按需调整)
  • 页面初始化时,优先读取用户手动保存的主题;无保存记录时,根据当前时间自动设置
  • 可选定时检查机制:每小时自动校验时间,更新主题(仅当用户未手动设置时生效)
  • 保留原手动切换功能,用户切换后将覆盖自动设置逻辑

2. 修改后的JavaScript代码

// 设定主题的核心函数(保留原有逻辑)
function setTheme(themeName) {
  localStorage.setItem('theme', themeName);
  document.documentElement.className = themeName;
}

// 根据当前时间判断应使用的主题
function getThemeByTime() {
  const currentHour = new Date().getHours();
  // 自定义深色模式时间段:18点到次日6点
  return currentHour >= 18 || currentHour < 6 ? 'theme-dark' : 'theme-light';
}

// 手动切换主题函数(保留原有逻辑)
function toggleTheme() {
  if (localStorage.getItem('theme') === 'theme-dark') {
    setTheme('theme-light');
  } else {
    setTheme('theme-dark');
  }
}

// 页面初始化时设置主题
(function () {
  const savedTheme = localStorage.getItem('theme');
  if (savedTheme) {
    // 优先使用用户手动保存的主题
    setTheme(savedTheme);
    document.getElementById('dark-light-mode').checked = savedTheme === 'theme-light';
  } else {
    // 无保存记录时,根据时间自动设置
    const autoTheme = getThemeByTime();
    setTheme(autoTheme);
    document.getElementById('dark-light-mode').checked = autoTheme === 'theme-light';
  }
})();

// 定时检查时间,自动更新主题(仅当用户未手动设置时)
function autoUpdateTheme() {
  const savedTheme = localStorage.getItem('theme');
  if (!savedTheme) {
    const currentTheme = document.documentElement.className;
    const targetTheme = getThemeByTime();
    if (currentTheme !== targetTheme) {
      setTheme(targetTheme);
      document.getElementById('dark-light-mode').checked = targetTheme === 'theme-light';
    }
  }
}
// 每小时执行一次检查(3600000毫秒 = 1小时)
setInterval(autoUpdateTheme, 3600000);

3. HTML控件(无需修改)

<label id="switch" class="switch">
  <input type="checkbox" onchange="toggleTheme()" id="dark-light-mode">
  <span class="slider round"></span>
</label>

关键细节调整

  • 深色模式时间段可修改getThemeByTime函数中的时间阈值,比如改成currentHour >= 20 || currentHour < 7
  • 定时检查间隔可自行调整,比如每30分钟检查一次(将3600000改为1800000)
  • 用户手动切换主题后,localStorage会保存选择记录,后续页面加载将优先使用该记录,直到用户再次切换或清除本地存储

内容的提问来源于stack exchange,提问作者roXen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 23:15:52