获取当前小时并动态设置 CSS 变量,是实现前端自动换肤最直接的手段。核心思路很清晰:用 new Date().getHours() 拿到 0–23 的整数,然后按区间映射到“日间”或“夜间”主题,再通过 document.documentElement.style.setProperty() 把预
获取当前小时并动态设置 CSS 变量,是实现前端自动换肤最直接的手段。核心思路很清晰:用 new Date().getHours() 拿到 0–23 的整数,然后按区间映射到“日间”或“夜间”主题,再通过 document.documentElement.style.setProperty() 把预设的颜色变量注入到 :root 上。千万别直接去改 CSS 文件里的 :root 文本——那样做既慢又难维护。

长期稳定更新的攒劲资源: >>>点此立即查看<<<
关键点在于几个容易被忽略的细节。首先是时区问题:getHours() 返回的是本地时间,如果服务端渲染或者用户跨时区,最好统一用 getUTCHours() 来对齐。其次是执行频率——没必要每秒轮询,页面加载时跑一次就够了,想更精细一点可以监听 visibilitychange 和 focus 事件做轻量重检。最后,建议把主题切换逻辑封装成一个函数,比如 setThemeByHour(),以后扩展节气、天气等维度时直接加参数就行。
getHours() 返回本地时间,如果服务端渲染或跨时区用户需要统一用 UTC(getUTCHours())visibilitychange + focus 做轻量重检setThemeByHour(),便于后续扩展节气、天气等维度变量命名这个坑,踩过的人都知道。最好不要用 --bg-color 这种泛名,容易被覆盖,也容易误解。更推荐按“语义+状态”分层,比如 --theme-bg-primary、--theme-text-secondary,再配合一个开关变量 --theme-mode: "day" | "night" 来标识当前主题。
:root 中声明默认值(哪怕只是占位),否则未匹配时段会导致变量为 unset,样式断裂#000,推荐 #121212 或 #1e1e1e 减少视觉疲劳localStorage.getItem('theme'),有值则跳过自动逻辑这个问题在社区里反复出现,原因其实就那么几个。最常见的是变量名拼写错误或作用域错位——比如在 JS 里写了 --text-color,CSS 里却引用 var(--text-colour)(英式拼写),或者某个 class 内部重复声明了同名变量把根级设置覆盖了。
的 script 里直接执行(此时 document.documentElement 已存在,但部分浏览器可能 style 对象未就绪)var() 引用加肯定要加,但得控制好范围。只对颜色类变量加过渡,比如 background-color 和 color,时间控制在 200ms 以内。千万不要写 all 0.2s——字体大小、阴影、transform 这些突变会导致重排重绘,卡顿感很明显。
:root 上直接写 transition,应写在具体选择器上,比如 body, .card, .btnfilter: brightness(0.9) 变量,并同步过渡prefers-color-scheme: dark 可能与你的小时逻辑冲突,建议 JS 中检测 window.matchMedia('(prefers-color-scheme: dark)').matches,优先级高于时间判断(尊重系统偏好)实际换肤的边界往往不在技术实现,而在用户感知:凌晨 5:59 日间色突然切到夜间,和用户刚睁眼看到刺眼白屏,是两回事。留 30 分钟缓冲区间(比如 5:30–6:30 淡入日间),比严格按整点切换要自然得多。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述