不准确颜色主题闪现 (FART)

Avatar of Chris Coyier
Chris Coyier

DigitalOcean 提供适用于您旅程各个阶段的云产品。 立即开始使用 200 美元的免费积分!

在网站上实施暗黑模式主题时,需要考虑很多因素。 我们有 一个完整的指南。 有一些 非常聪明的快速解决方案,但也有不少相当棘手的事情需要完成。 其中一件棘手的事情是,它不是暗黑模式与亮色模式之间的“切换”,而是真正需要支持的 *三种* 模式:**暗黑**、**亮色** 和 *使用系统偏好设置*。 这类似于许多应用程序中的音频首选项,允许您非常具体地选择所需的音频输入或输出,或者默认使用系统偏好设置。

CSS 和 JavaScript 可以通过 prefers-color-scheme API 处理系统偏好设置的角度,但是如果用户偏好设置已更改,并且该偏好设置现在与用户偏好设置不同,则您将处于“不准确颜色主题闪现”或 FART 的领域。 好吧好吧,这是一个调侃的缩写词,但它可能是一个非常令人反感的视觉问题,所以我保留了它。 它与 FOUT (无样式文本闪现) 用于字体加载的方式类似。

存储用户偏好设置意味着类似于 Cookie、localStorage 或某种数据库。 如果访问该数据意味着运行 JavaScript,例如 localStorage.getItem('color-mode-preference');,那么您就处于 FART 领域,因为您的 JavaScript 很可能在页面首次渲染 *之后* 运行,除非您不必要地延迟页面渲染。

用户偏好设置是“暗黑”模式,但系统偏好设置是“亮色”模式(或未设置),因此当页面刷新时,您会看到 FART。

您可以在页面渲染之前使用服务器端语言访问 Cookie,这意味着您可以使用它输出类似于 <html class="user-setting-dark-mode"> 的内容并相应地进行样式设置,这巧妙地避免了 FART,但这意味着一个网站,即使可以访问服务器端语言(例如 Jamstack 网站就无法访问)。

以上所有这些都是为了说明我对 Rob Morieson 关于暗黑模式的文章 的赞赏,因为它没有回避这个重要问题。 它非常具体地介绍了在 Next.js 中执行此操作的方法,并使用 localStorage,但由于 Next.js 是 JavaScript 渲染的,因此您可以强制它将检查用户保存的偏好设置作为它执行的第一件事。 这意味着它会在第一次渲染时正确显示(没有闪现)。 但是您确实需要关闭服务器端渲染才能使它工作,这虽然是一个棘手的权衡。

我不相信除了服务器端语言或强制延迟页面渲染之外,还有其他好的方法可以避免 FART。