SCSS暗模式切换背景颜色不起作用

SCSS darkmode switch background color not working

我开始使用 Hugo、SCSS 和 JS 为我的网站实现暗模式切换。

到目前为止,我为主题模式“light”和“dark”创建了一个映射,并在我的其他 scss 文件中使用了它们 @include

现在所有单独的颜色都可以通过切换器正常切换,除了我的背景颜色。到目前为止找不到任何解决方案,但也许我必须以某种方式干扰 Bootstraps JS?有什么想法吗?

SCSS

$primary-font: "Raleway", sans-serif;
$icon-font: "themify";
// Color Variables
$primary-color: #3787b3;
$black: #000;
$white: #fff;
$gray: #f4fcff;

$themes: (
  darkTheme: (
    'bg-color': #222222,
    'text-color': #ffffff,
    'text-color-dark': #c9c9c9,
    'text-color-light': #ffffff,
    'body-color': #3b3d42,
    'border-color': #4a4b50
  ),
  lightTheme: (
    'bg-color': #fff,
    'text-color': #666666,
    'text-color-dark': #222222,
    'text-color-light': #959595,
    'body-color': #fff,
    'border-color': #acb9c4
  )
);

@mixin theme() {
  @each $theme, $map in $themes {
    $theme-map: $map !global;
    .#{$theme} & {
      @content; 
    }
  }
  $theme-map: null !global;
}

@function theme-get($key) {
  @return map-get($theme-map, $key);
}
body {
  @include theme(){
    background-color: theme-get('bg-color');
  }
  overflow-x: hidden;
}

JS

    //theme-toggler
    const getTheme = window.localStorage && window.localStorage.getItem("theme");
    const themeToggle = document.querySelector(".theme-toggle");
    const isDark = getTheme === "dark";

    if (getTheme !== null) {
      document.body.classList.toggle("darkTheme", isDark);
    }

    themeToggle.addEventListener("click", () => {
      document.body.classList.toggle("darkTheme");
      window.localStorage &&
        window.localStorage.setItem(
          "theme",
          document.body.classList.contains("darkTheme") ? "dark" : "light"
        );
    });
    console.log()

HTML

<!DOCTYPE html>
<html lang="{{ with .Site.LanguageCode }}{{ . }}{{ else }}en-US{{ end }}">
    {{- partial "head.html" . -}}
    <body>
        {{- partial "preloader.html" . -}}
        {{- partial "header.html" . -}}
        {{- block "main" . }}{{- end }}
        {{- partial "footer.html" . -}}
    </body>
</html>

你的 js 切换目标是 body 标签,但是 CSS 被添加到 html。 如果您对 SCSS 进行两项更改,它应该可以工作:)

    @mixin theme() {
        @each $theme, $map in $themes {
            $theme-map: $map !global;

            //
            // 1. move the & (will be body) first 
            //
            &.#{$theme} {
                @content; 
            }
        }
        $theme-map: null !global;
    }

    //
    // 2. include the theme in the body selector
    // 
    body {
        @include theme(){
           background-color: theme-get('bg-color');
         }
    }

更新: !global 从现在开始应该避免 如果在根中定义,函数 $theme-get 不喜欢它可能会得到 null 作为映射。作为初学者不知道如何处理它。

@function theme-get($key) {
  @if ($theme-map != null) {
     @return map-get($theme-map, $key);
  }
  @return red;
}

不确定如何继续...