【发布时间】:2020-10-02 07:16:35
【问题描述】:
我正在尝试制作一个暗模式切换按钮,它可以在点击时在暗模式和亮模式之间切换,用户首选项也使用localStorage 存储。用户应手动按下按钮以切换到其他模式。如果用户选择的是深色模式,那么每个页面都将处于深色模式,并且在刷新时不会转为浅色模式。到目前为止一切看起来都很好,但真正的问题在于加载时间。页面的加载时间接近 1 秒,在此期间,即使用户选择深色模式,页面也似乎处于浅色模式。我不希望这种情况发生。如果用户的选择是黑暗的,我希望在黑暗模式下加载时间部分。
这是我当前的代码:
<script>
const body = document.querySelector('body');
function toggleDark() {
if (body.classList.contains('dark')) {
body.classList.remove('dark');
localStorage.setItem("theme", "light");
} else {
body.classList.add('dark');
localStorage.setItem("theme", "dark");
}
}
if (localStorage.getItem("theme") === "dark") {
body.classList.add('dark');
}
</script>
<style>
body {background-color: #ffffff}
body.dark {background-color: #000000; color: #ffffff}
</style>
<button class="dark-mode" id="btn-id" onclick="toggleDark()"></button>
【问题讨论】:
-
我的建议是不要仅仅依赖客户端。您应该能够在服务器端设置类。如果只有客户端能够添加类,那么您在加载期间总是有时间(当仍在加载/解释 Javascript 时)该类不存在。使用 cookie,以便您也可以在服务器端检查它们。
-
将您的
<script>添加为<body>内的第一行以帮助减少FOUC -
还要考虑prefers-color-scheme css 属性。对于黑暗模式的全面介绍,我建议阅读A Complete Guide to Dark Mode on the Web。
-
您可以在“html”标签中添加/删除类(您可以使用
document.documentElement.classList来执行此操作)...这样,您将类设置为dark的代码可以在head 元素,在 body 存在之前 - 你需要在 CSS 中将body.dark更改为html.dark body -
@JaromandaX 我的解决方案怎么样?太复杂了?它都是基于客户端和本地存储的
标签: javascript html jquery css