javascript - 通过在窗口就绪时使用 javascript 强制主体更改为背景,防止页面使用主题切换闪烁继承的主体 bg 颜色

标签 javascript jquery html css

我正在尝试使用 javascript 中的本地存储进行主题切换。

我的问题: 当从主题更改为深色到白色然后单击新页面时。主题会很快变暗,因为基本主题 body bg 是黑色的。但是,我已经尝试删除两个背景并在 javascript 中实现它们,但其中一个或另一个仍然会在浅色主题上出现黑色闪烁,或者白色闪烁或深色主题。

我的主题将我的网站从深色切换为白色。但是,当您刷新页面或将页面更改为白色时,它会快速闪烁 body 从黑色主题继承的黑色 bg 颜色,然后再坚持白色主题。我正在努力做到这一点,当您在主题和页面之间转换时,可以无缝转换,而背景不会在受人尊敬的主题颜色上闪烁黑色或白色。

目前,我有这样的代码:

function checkBG() {
  //REDUCE FLICKER ON PAGE CHANGE

      if(lightmodeON = true) {

        console.log('loading white bg');
      }

      if(lightmodeON = false) {

        console.log('loading black bg');
      }


  if(window.matchMedia('(prefers-color-scheme: dark)').matches && localStorage.themepref == 2 ) {
   darkmode();
   console.log("OS Setting DARK MODE");
  }

    if (window.matchMedia("(prefers-color-scheme: light)").matches && localStorage.themepref == 1 ) {
     lightmode();
     console.log("OS Setting LIGHT MODE");
   }

   if(window.matchMedia('(prefers-color-scheme: dark)').matches && localStorage.themepref == "undefined" ) {
    darkmode();
    console.log("OS Setting DARK MODE");
   }

   if (window.matchMedia("(prefers-color-scheme: light)").matches && localStorage.themepref == "undefined" ) {
    lightmode();
    console.log("OS Setting LIGHT MODE");
  }

};



$(window).ready(function($) {
  checkBG();

  $(window).scrollTop( $("#top").offset().top );
  $(document).scrollTop(0);


  if (typeof (Storage) !=="undefined") {
    if (localStorage.themepref == 1 ) {
      lightmode();
    }
    else {
      darkmode();
      localStorage.themepref = 2;
    }
  }

在亮模式和暗模式下,我设置了 body-bg 颜色。

但是,这并不能足够快地捕获 DOM 或浏览器,并且每次刷新页面或单击页面时白色都会闪烁黑色,因为主题最初是黑色的。我该如何解决这个问题。

谢谢。

最佳答案

一个解决方案是在 head 的末尾设置 script,而不是使用 $(window).ready 等待页面加载。然后它将在渲染 body 之前设置 background 样式。

另一个细节。由于 script 运行时 body 不存在,您可以使用 lightmode()darkmode()head 的末尾创建一个 style tag 包含 background 的属性,如下所示:

// you make your checkings, and call lightmode() or darkmode()

function applyBackgroundTheme(color) {
    var css = "body { background: " + color + "; }",
    head = document.head || document.getElementsByTagName('head')[0],
    style = document.createElement('style');
    head.appendChild(style);

      style.type = 'text/css';
      if (style.styleSheet){
        style.styleSheet.cssText = css;
      } else {
        style.appendChild(document.createTextNode(css));
      }
    }

lightmode() {
  applyBackgroundTheme("white") // color for light mode
}
darkmode() {
  applyBackgroundTheme("black") // color for light mode
}

希望对你有所帮助。

关于javascript - 通过在窗口就绪时使用 javascript 强制主体更改为背景,防止页面使用主题切换闪烁继承的主体 bg 颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57484932/

相关文章:

javascript - 初学者 : Ajax tutorial is not working

javascript - 在禁用 ng 的情况下搜索 JSON 对象(AngularJS)

javascript - 使用 JavaScript/JQuery 全屏播放 Wistia 视频

jquery - 我如何在 "data"属性中使用 href 链接 - 或者用 jQuery 重写它?

javascript - Wordpress ~ 如何在一个页面上显示多个 Google Chart?

jQuery:计算表中部分的列总计

javascript - 悬停时在图像上显示链接

html - 为什么 css 标签在 ie 和 firefox 中看起来不同

javascript - 我正在尝试通过单击从列表中删除项目,我错过了什么?

javascript - 正则表达式分组和上下文