【发布时间】:2021-09-13 10:25:47
【问题描述】:
我正在尝试为我的网站实现明暗模式。它应该基于prefers-color-scheme 加载,并且用户应该能够在这两个模块之间切换。
我写了这个:
<div id="theme-togle">
<input id="theme-toggle-dark" type="checkbox" />
<span id="checkmark-dark"></span>
<input id="theme-toggle-light" type="checkbox" />
<span id="checkmark-light"></span>
</div>
@mixin dark-theme {
--body-color: #313131;
--text-color: #FFFFFF;
--title-color: #000000;
--subtitle-color: #808080;
--logo-color: #FFFFFF;
--link-color: #FFFFFF;
--link-visited-color: #FFFFFF;
--quote-color: #FFFFFF;
--code-background-color:#787878;
--text-highlight-color: #D3D3D3;
--separator-color: #525252;
}
@mixin light-theme {
--body-color: #313131;
--text-color: #FFFFFF;
--title-color: #000000;
--subtitle-color: #808080;
--logo-color: #FFFFFF;
--link-color: #FFFFFF;
--link-visited-color: #FFFFFF;
--quote-color: #FFFFFF;
--code-background-color:#787878;
--text-highlight-color: #D3D3D3;
--separator-color: #525252;
}
:root{
@include light-theme;
}
#theme-toggle-dark {
display: none;
}
@media (prefers-color-scheme: dark){
@include dark-theme;
#theme-toggle-light {
display: none;
}
#theme-toggle-dark {
display: block;
}
}
@media (prefers-color-scheme: light){
:root{
@include light-theme;
}
.theme-toggle-dark {
display: none;
}
.theme-toggle-light {
display: block;
}
}
#theme-toggle-dark:checked + :root{
@include dark-theme;
}
#theme-toggle-light:checked + :root{
@include light-theme;
}
它可以根据prefers-color-scheme成功选择默认模式,但我无法使用复选框进行切换。
我怎样才能做到这一点?我正在寻找免费的 javascript 解决方案。
感谢您的帮助
【问题讨论】:
-
:root不是复选框的直接兄弟,因此您的选择器#theme-toggle-dark:checked + :root将不起作用。 -
@Terry 有办法写对吗?
-
你需要使用 JS。
-
阅读他正在使用的选择器:
... + *,这意味着他正在选择所有直接同级并将 CSS 变量应用到。你的方法不同。 -
目前除了 JS 没有其他办法。将来,如果
:has是 supported by the navigators 就像body:has(#theme-toggle-dark:checked) {@include dark-theme;} body:has(#theme-toggle-light:checked) {@include dark-theme;}一样,您将只能使用 CSS 来做到这一点
标签: html css sass color-scheme scss-mixins