我把51网的夜间模式拆给你看:其实一点都不玄学(别被误导)

很多人看到网站的“夜间模式”会以为后台有什么神秘的算法,或者是把页面全部重新渲染了一遍。真相通常没那么复杂。下面把常见实现思路、优缺点和实用的实现示例一一拆开讲清楚,帮助你既能理解别人的做法,也能为自己的网站实现一个靠谱的夜间模式。
一眼看懂:夜间模式其实是三件事
常见实现方式对比(优缺点)
51网可能的做法(观察与合理推测) 很多成熟站点会同时采用 CSS 变量与 prefers-color-scheme,并用 JavaScript 做记忆与手动切换:
实战:一个小而完整的实现思路(可直接拿去用) CSS(核心思想:用变量,.dark 覆盖) :root { --bg: #ffffff; --card: #f8f9fa; --text: #111116; --muted: #6b7280; --accent: #0066ff; }
/* 夜间模式覆盖 */ html.dark { --bg: #0f1720; --card: #111827; --text: #e6eef8; --muted: #9aa6b2; --accent: #4ea8ff; }
body { background: var(--bg); color: var(--text); transition: background .25s ease, color .25s ease; }
/* 示例控件 */ .header, .card { background: var(--card); color: var(--text); border-color: rgba(255,255,255,0.04); }
JS(初始化、切换与持久化) (function() { const KEY = 'site-theme'; // localStorage key const root = document.documentElement;
// 读取用户偏好或系统偏好 function getPreferredTheme() { const saved = localStorage.getItem(KEY); if (saved === 'dark' || saved === 'light') return saved; return window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'; }
// 应用主题 function applyTheme(theme) { if (theme === 'dark') root.classList.add('dark'); else root.classList.remove('dark'); }
// 切换函数(可绑定到开关按钮) window.toggleTheme = function() { const current = root.classList.contains('dark') ? 'dark' : 'light'; const next = current === 'dark' ? 'light' : 'dark'; applyTheme(next); localStorage.setItem(KEY, next); };
// 页面加载时应用 applyTheme(getPreferredTheme()); })();
图片、图标与第三方内容的处理
代码高亮与块级元素
无障碍与对比度
性能与用户体验小贴士
常见陷阱(别被误导)