如何用 javascript 永久交换深色模式徽标?

How to permanently swap a darkmode logo with javascript?

所以我有以下代码来管理我的暗模式(请注意我没有写原始代码,我只是修改):

  if (toggleTheme) {
    toggleTheme.click(function () {
      darkMode();
    });
  };

  // Theme Switcher
  function darkMode() {
    const logo = document.getElementById('logo'); // I Added this line
    if (html.hasClass('dark-mode')) {
      html.removeClass('dark-mode');
      localStorage.removeItem("theme");
      $(document.documentElement).removeAttr("dark");
      logo.src = logo.dataset.logoLight; // I Added this line
    } else {
      html.addClass('dark-mode');
      localStorage.setItem("theme", "dark");
      $(document.documentElement).attr("dark", "");
      logo.src = logo.dataset.logoDark // I Added this line
    }
  }

这是相对的 HTML(注意,我正在使用 Hugo 进行构建,因此包括 Go 模板):

{{- $logo := (resources.Get site.Params.logo).Resize "270x webp q100" -}}
{{- $logoDark := (resources.Get "/images/logo-dark.png").Resize "270x webp q100" -}}
<img id="logo" class="logo__image" src="{{- $logo.RelPermalink -}}" data-logo-light="{{- $logo.RelPermalink -}}" data-logo-dark="{{- $logoDark.RelPermalink -}}" alt="{{ .Site.Title }}" height="{{- div $logo.Height 2 -}}" width="{{- div $logo.Width 2 -}}">

我只将上面提到的三行添加到 JavaScript。

这完全符合我的要求。当有人将按钮切换为深色模式并且徽标翻转为深色模式版本时。

太好了。

除非他们点击新页面,否则原始徽标就位。

不确定如何存储、检查和检索适当的徽标,因为我不太擅长 JavaScript(我只是把我需要的东西拼凑起来)。

你会怎么做?

我想你总是可以存储一个标志变量来检查页面是否切换到 dark-mode,我告诉你:

// Theme Switcher
function darkMode(){    
    if (html.hasClass('dark-mode')){
        html.removeClass('dark-mode');
        localStorage.removeItem("theme");
        $(document.documentElement).removeAttr("dark");
        localStorage.setItem('dark_mode', 'false');
        darkModeLogo();
    }else{
        html.addClass('dark-mode');
        localStorage.setItem("theme", "dark");
        $(document.documentElement).attr("dark", "");
        localStorage.setItem('dark_mode', 'true');
        darkModeLogo();
    }
}

//runs everytime the js file is loaded
function darkModeLogo(){
    const logo = document.getElementById('logo'); // I Added this line
    const DARK_MODE = localStorage.getItem('dark_mode');
    if(eval(DARK_MODE)){
        logo.src = logo.dataset.logoLight; // I Added this line
    }else{
        logo.src = logo.dataset.logoDark // I Added this line
    }
}
darkModeLogo();

有几种方法可以添加您缺少的功能,但考虑到您当前的实现,最直接的方法可能是使用 localStorage 中的 theme 值。

您的代码已经在使用 localStorage 来存储当前主题。您缺少的部分是一些 JavaScript 检查 localStorage 中的 theme 值,然后适当地设置徽标路径。您可以使用该存储值来确定加载任何页面时的主题,方法是在每个页面的 <head> 中放置一些 JavaScript,或者将其添加到您现有的 JavaScript 文件中暗模式切换逻辑是:

// Define a function that will check localStorage and set the logo path
function checkThemeAndSetLogo() {
   const logo = document.getElementById('logo');
   const currentTheme = localStorage.getItem("theme"); // get the theme value from localStorage
   if (currentTheme === "dark") {
      logo.src = logo.dataset.logoDark;
   } else {
      logo.src = logo.dataset.logoLight;
   }
}

// Call the function so that the logo is updated appropriately
checkThemeAndSetLogo(); 

如果您对深色模式的进一步阅读和其他选项感兴趣,我推荐 A Complete Guide to Dark Mode on the Web