javascript - 使用 webStorage 通过 Toggling Class 应用 CSS
问题描述
我有一个带有 2 个按钮的网站,用于在 [默认] 深色和浅色主题之间切换。我正在使用:root
指令和 CSS 变量来执行此操作,如下所示:
HTML:
<body>
<div>
Here is some text
</div>
<br/>
<button type="button" onclick="lightToggle()">Light Theme</button>
<button type="button" onclick="darkToggle()">Dark Theme</button>
</body>
CSS:
:root {
--bg-color-1: #011627;
}
.light {
--bg-color-1: #fbfbfb;
}
body {
background-color: var(--bg-color-1);
}
JS:
function lightToggle() {
var element = document.body;
element.classList.add("light");
}
function darkToggle() {
var element = document.body;
element.classList.remove("light");
}
这适用于单页。现在,我希望在导航到同一域中的另一个网页时保持主题不变。我不想使用cookies,也不想在客户端存储持久数据,所以我认为sessionStorage
最适合这个。我已经添加setItem
了我的 HTML 和 JS,但是在light
使用这个sessionStorage
值切换类时遇到了困难(而且我什至不确定这是使用 webStorage 时的最佳实践吗?)。这是我开始的地方:
HTML:
<script>
sessionStorage.setItem("theme", "dark");
</script>
<body>
<div>
Here is some text
</div>
<br />
<button type="button" onclick="lightToggle()">Light Theme</button>
<button type="button" onclick="darkToggle()">Dark Theme</button>
</body>
CSS(未更改):
:root {
--bg-color-1: #011627;
}
.light {
--bg-color-1: #fbfbfb;
}
body {
background-color: var(--bg-color-1);
}
JS:
function lightToggle() {
var element = document.body;
element.classList.add("light");
sessionStorage.setItem("theme", "light");
}
function darkToggle() {
var element = document.body;
element.classList.remove("light");
sessionStorage.setItem("theme", "dark");
}
使用 webStorage 将 aclass
应用于 HTML的最佳实践是body
什么?
解决方案
一切都很好,除了嵌入在 html 中的脚本。它总是会用“暗”值覆盖您选择的主题。因此,只需更改此脚本以读取会话存储中的当前值并应用适当的类。
<script>
var theme = sessionStorage.getItem("theme");
var element = document.body;
if(theme && theme === 'light'){
element.classList.add("light");
}
else{
element.classList.remove("light");
}
</script>
推荐阅读
- google-cloud-platform - 由于权限错误,Dataflow 无法将数据写入 BigQuery
- angular - Angular 8:Webpack - 三个.js 加载两次
- java - 如何通过不同的运算符比较变量和字符串
- python-3.x - 无法将 Python 脚本转换为 .exe
- javascript - 使用 JavaScript 保存 blob 始终会保存一个空文件
- javascript - JavaScript 双击卡片
- amazon-web-services - 使用 Sqoop 将表从 AWS RDS 移动到 AWS EMR 的问题
- python - 为什么“conda upgrade”在克隆环境中表现不同?
- windows - 是否有可与 UWP 联系人选取器一起使用的不可变 ID?
- arrays - 将 JS JSON 数组解析为 Kotlin 数组