应直接用 localStorage.setItem('theme', 'dark') 存字符串,页面加载时立即读取并设 document.documentElement.className,切换时实时写入;注意 iOS 隐私模式等场景需 try/catch 捕获 SecurityError,并 fallback 到 prefers-color-scheme。
怎么用 localStorage 保存用户选的主题(比如 dark / light)
直接存字符串就行,但得注意时机和触发逻辑。页面刚加载时就读取,切换主题时立刻写入,别等
或用户关页——那会丢数据。
用
写入,值必须是字符串,
、
、对象都得先
读取用
,返回
表示没存过,别直接当布尔值用
别在 CSS 文件里读 localStorage —— 它是 JS API,只能在 JS 中读,然后动态切
或改
切换主题时如何避免闪屏(FOUC)
闪屏本质是:HTML 渲染完、CSS 生效了,JS 才运行并改主题。解决方案不是“等 JS”,而是“让初始渲染就带对的主题”。
服务端不参与的话,就在
里加一段内联 JS,用
立即设
不要把主题 class 加在
上——
更早生效,CSS 里用
或
更稳
如果用了 CSS 自定义属性(
),确保初始值写在 :root 里,再用
覆盖,而不是靠 JS 逐个 setStyle
localStorage 存失败的常见原因
不是所有环境都能写,尤其 iOS Safari 隐私模式、某些 WebView、或设置了
的站点会静默拒绝。
使用HTML,CSS,JavaScript开发Android应用程序 英文文字pdf版附源文件
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
下载
调用
前先 try/catch,捕获
和
iOS Safari 隐私模式下
是只读空对象,
返回
,
抛
—— 别假设它一定可用
存太多键或单个值超 5–10MB(实际阈值因浏览器而异)会失败;主题偏好这种小数据没问题,但别顺手把整个 CSS 字符串塞进去
CSS class 名要不要和 localStorage key 对齐
没必要强绑定,但保持一致能降低维护成本。关键是别让 class 名含歧义,比如
和
混用。
立即学习
“
前端免费学习笔记(深入)
”;
推荐统一用
/
这类短名,存到 localStorage 也用同样字符串,JS 里直接拼
避免用
或
这类带前缀的 class——除非你整套 CSS 都按 BEM 写,否则容易漏匹配
如果支持系统级偏好(
),记得 fallback 逻辑:localStorage 有值就用它,没有才读
主题切换本身简单,难的是边界情况:隐私模式下静默失效、服务端渲染与客户端不一致、多标签页间不同步。这些地方不处理,用户点十次“切暗色”都看不到变化。
onbeforeunloadlocalStorage.setItem('theme', 'dark')true1JSON.stringify()localStorage.getItem('theme')nullclassdocument.documentElement.setAttribute()localStorage.getItem('theme')document.documentElement.className:roothtml.dark--bg-colorhtml.dark :rootStrict-Origin-IsolationlocalStorage.setItem()QuotaExceededErrorSecurityErrorlocalStoragegetItemnullsetItemSecurityErrordark-modedarkdarklightdocument.documentElement.className = themeis-darktheme--darkprefers-color-schemematchMedia('(prefers-color-scheme: dark)')