You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何解决页面加载时浅色模式闪深色背景的问题

解决深色/浅色模式切换时的页面闪烁问题

问题根源

你碰到的这个闪烁问题,本质是渲染时机的问题:当前的代码要等jQuery加载完成、DOM就绪后,才去读取localStorage并修改body的类。但浏览器在这之前已经按照默认的深色样式渲染了页面,所以会出现短暂的深色闪屏,再切换到浅色模式的尴尬情况。

核心解决方案:提前在页面渲染前设置模式

要彻底解决闪烁,我们得把模式判断的逻辑移到<head>标签里,用原生JavaScript实现——不需要等jQuery加载,在浏览器开始渲染页面内容之前就把正确的模式类加上。这样页面从一开始就会以正确的模式渲染,完全不会有闪烁。

步骤1:在<head>中添加前置判断代码

把这段代码放在你的<head>里,样式表之后、页面内容之前:

<script>
  // 读取本地存储的模式,默认设为深色(对应blackout类)
  const currentMode = localStorage.getItem('blackout') ?? '1';
  // 确保本地存储有值,避免后续判断出错
  localStorage.setItem('blackout', currentMode);
  // 给html标签设置模式类(也可以用body,html范围更广更方便)
  document.documentElement.classList.toggle('blackout', currentMode === '1');
</script>

步骤2:简化原有的jQuery切换逻辑

原来的初始化代码可以删掉了(因为<head>里已经处理了初始模式),只保留点击切换的逻辑就行,还能简化一下:

$(function() {
  $('#boToggle').on('click', function(){
    // 切换模式状态
    const isDark = localStorage.getItem('blackout') === '1';
    const newMode = isDark ? '0' : '1';
    
    // 更新本地存储和页面类
    localStorage.setItem('blackout', newMode);
    $('body').toggleClass('blackout', !isDark);
  });
});

额外优化小技巧

  • 把模式类挂在<html>标签上比<body>更灵活,后续写CSS的时候可以用:root或者html.blackout来全局控制样式,比如:
html {
  --bg-color: #fff;
  --text-color: #333;
}
html.blackout {
  --bg-color: #1a1a1a;
  --text-color: #eee;
}
body {
  background-color: var(--bg-color);
  color: var(--text-color);
  transition: background-color 0.3s, color 0.3s;
}
  • 如果想让模式切换有平滑过渡效果,可以给body或html加上transition属性,让样式变化更自然。

这样修改后,不管用户切换到哪种模式,刷新页面时都会直接渲染正确的样式,完全不会出现闪烁啦!

内容的提问来源于stack exchange,提问作者Charmaine Simpson

火山引擎 最新活动