在 jekyll 中实现深色主题
Implementing a dark theme in jekyll
我正在尝试向我的 Jekyll 站点添加一个简单的 light/dark 模式切换。
我现在设置的方式是 body 有一个 dark
class,在切换时切换到 light
class,并且主题保留在 localStorage
中,并在用户转到新页面时加载。 SCSS 仅具有 select 或 .dark
和 .light
将显示相应的配色方案。
这种方法的问题是我的默认主题是 dark
,所以如果主题设置为 light
,那么 classes 会有非常清晰的 0.2 秒闪烁当我加载新页面时,从 dark
切换到 light
。
我尝试通过将 body 的 visibilty
设置为 hidden
然后在完成切换后再次将其设置为 visible
来解决问题,但是不幸的是,这种方法引入了另一个恼人的问题 flash/lag,并且没有什么好的方法可以阻止它在每次加载页面时闪烁。
我想到但不知道是否可行或如何实施的一些潜在解决方案是:
让 Jekyll 以某种方式从 localStorage
读取并基于此更改呈现的 HTML 的 class(可能是最好的解决方案,但也可能是不可能的)
Jekyll 以某种方式从 SCSS 生成了两个单独的样式表并使用 JS 来select正确的
非常感谢任何关于如何做这些事情的见解或潜在的替代解决方案,谢谢!
你想要什么,根据第3点,
Implement some kind of fade in/fade out when changing the visibility from hidden to visible
是--
每当 CSS 属性 更改时显示缓入效果的示例用法:
body {
transition: background 1s ease-in, color 1s ease-in;
}
.dark {
color: white;
background: black;
}
<body>
<p> Lorem Ipsum dolor sit amet... </p>
<button onclick="document.body.classList.toggle('dark')">Change Theme</button>
</body>
所以分解一下:
- 由于您使用的是静态站点生成器,因此只有在一小段 Javascript 执行以确定和设置主题后,您才能应用深色或浅色主题。
- 这会在 Javascript 执行时产生一些 delay/flash 的内容。
我认为使用静态站点生成器意味着从 localStorage 读取并应用主题 class 和 Javascript 是一个非常好的方法。正如我所见,有两种可能的方法可以最大程度地减少闪烁问题,并且不涉及将体系结构从 Jekyll 站点更改为其他站点。
在加载页面内容时更快地执行 Javascript:
因为唯一需要加载的 DOM 元素是 <html>
元素本身,您可以对其应用主题 class,您可以将 'critical' Javascript 在一个小脚本标签里面 <head>
。即只是 'theme-switching' 行代码。
它应该在内容加载之前立即执行。
使用CSS 过渡来最小化闪光本身:
您可以在 <html>
元素没有主题 class 时隐藏页面内容,并在应用后淡入淡出,如下所示:
html {
opacity: 0;
transition: opacity 1s;
}
html.light, html.dark {
opacity: 1;
}
我在我的本地尝试过它工作正常,虽然我没有使用任何 js 或 jekyll 简单转换。让 js 做 class 切换,别无其他。让 css 负责过渡。使用一个样式表。
.theme {
&.dark {
background: #000;
color: #fff;
}
&.light {
background: #fff;
color: #000;
}
transition:background-color 200ms ease-in-out, color 200ms ease-in-out;
}
<body class="body theme dark"> <!-- just switch dark to light class-->
<h1 class="sticky">Thank you</h1>
<div class="row" id="bindlinkTempl"></div>
<script src="js/dist/app.js"></script>
</body>
不需要javascript,使用prefers-color-scheme
媒体查询:
@media (prefers-color-scheme: dark) {
// Styles for dark mode here
body { background-color: #222 }
...
}
https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-color-scheme
我正在尝试向我的 Jekyll 站点添加一个简单的 light/dark 模式切换。
我现在设置的方式是 body 有一个 dark
class,在切换时切换到 light
class,并且主题保留在 localStorage
中,并在用户转到新页面时加载。 SCSS 仅具有 select 或 .dark
和 .light
将显示相应的配色方案。
这种方法的问题是我的默认主题是 dark
,所以如果主题设置为 light
,那么 classes 会有非常清晰的 0.2 秒闪烁当我加载新页面时,从 dark
切换到 light
。
我尝试通过将 body 的 visibilty
设置为 hidden
然后在完成切换后再次将其设置为 visible
来解决问题,但是不幸的是,这种方法引入了另一个恼人的问题 flash/lag,并且没有什么好的方法可以阻止它在每次加载页面时闪烁。
我想到但不知道是否可行或如何实施的一些潜在解决方案是:
让 Jekyll 以某种方式从
localStorage
读取并基于此更改呈现的 HTML 的 class(可能是最好的解决方案,但也可能是不可能的)Jekyll 以某种方式从 SCSS 生成了两个单独的样式表并使用 JS 来select正确的
非常感谢任何关于如何做这些事情的见解或潜在的替代解决方案,谢谢!
你想要什么,根据第3点,
Implement some kind of fade in/fade out when changing the visibility from hidden to visible
是--
每当 CSS 属性 更改时显示缓入效果的示例用法:
body {
transition: background 1s ease-in, color 1s ease-in;
}
.dark {
color: white;
background: black;
}
<body>
<p> Lorem Ipsum dolor sit amet... </p>
<button onclick="document.body.classList.toggle('dark')">Change Theme</button>
</body>
所以分解一下:
- 由于您使用的是静态站点生成器,因此只有在一小段 Javascript 执行以确定和设置主题后,您才能应用深色或浅色主题。
- 这会在 Javascript 执行时产生一些 delay/flash 的内容。
我认为使用静态站点生成器意味着从 localStorage 读取并应用主题 class 和 Javascript 是一个非常好的方法。正如我所见,有两种可能的方法可以最大程度地减少闪烁问题,并且不涉及将体系结构从 Jekyll 站点更改为其他站点。
在加载页面内容时更快地执行 Javascript:
因为唯一需要加载的 DOM 元素是 <html>
元素本身,您可以对其应用主题 class,您可以将 'critical' Javascript 在一个小脚本标签里面 <head>
。即只是 'theme-switching' 行代码。
它应该在内容加载之前立即执行。
使用CSS 过渡来最小化闪光本身:
您可以在 <html>
元素没有主题 class 时隐藏页面内容,并在应用后淡入淡出,如下所示:
html {
opacity: 0;
transition: opacity 1s;
}
html.light, html.dark {
opacity: 1;
}
我在我的本地尝试过它工作正常,虽然我没有使用任何 js 或 jekyll 简单转换。让 js 做 class 切换,别无其他。让 css 负责过渡。使用一个样式表。
.theme {
&.dark {
background: #000;
color: #fff;
}
&.light {
background: #fff;
color: #000;
}
transition:background-color 200ms ease-in-out, color 200ms ease-in-out;
}
<body class="body theme dark"> <!-- just switch dark to light class-->
<h1 class="sticky">Thank you</h1>
<div class="row" id="bindlinkTempl"></div>
<script src="js/dist/app.js"></script>
</body>
不需要javascript,使用prefers-color-scheme
媒体查询:
@media (prefers-color-scheme: dark) {
// Styles for dark mode here
body { background-color: #222 }
...
}
https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-color-scheme