Код кнопки переключения темной темы не работает?

Мой код, показанный ниже, для кнопки переключения темной темы не работает; Код Visual Studio не сообщает мне, что у меня есть какие-либо ошибки. Может ли кто-нибудь помочь мне понять, в чем проблема?

document.getElementById('themeButton').addEventListener('click'),
  function() { /* Theme button script */
    document.body.classList.toggle('dark-theme');
  }
body {
  background-color: rgb(246, 246, 246);
  color: black;
  h1 {
    color: rgb(63, 66, 145);
    /* Header 1 features */
    font-size: 50px;
    padding-bottom: 8px;
    margin: 10px;
  }
  h2 {
    font-family: Arial, Helvetica, sans-serif;
    /* Header 2 features */
    margin: 10px;
  }
  p {
    font-family: Arial, Helvetica, sans-serif;
    /* Paragraph features */
    font-size: 20px;
    padding-bottom: 10px;
    margin: 10px;
  }
  /* Dark theme styles */
  .dark-theme {
    background-color: #A9a9a9;
    /* Dark gray background */
    color: #F5F5F5/* Light gray body text */
  }
  .dark-theme h1 {
    color: rgb(170, 172, 244)/* Light blue text for header 1 */
  }
}
<h1>Basic Website</h1>
<!-- Site text content -->
<hr>
<h2>Welcome to my basic webpage.</h2>
<p>This isn't my first time coding, but it's been so long that it might as well be.</p>

<img src = "treehouse.jpg" alt = "An elaborate treehouse.">
<!-- Image -->
<hr>

<button id = "themeButton">Change Theme Color</button>
<!-- Theme button -->

Фон кнопки должен измениться на темно-серый, а текст должен стать светло-серым, но при нажатии кнопка ничего не меняет.

🤔 А знаете ли вы, что...
JavaScript имеет множество библиотек и фреймворков, таких как jQuery, Angular, и Vue.js.


50
2

Ответы:

Решено

У вас здесь ошибка

document.getElementById('themeButton').addEventListener('click'), function() { /* Скрипт кнопки темы */ document.body.classList.toggle('темная тема'); }

Вы должны передать функцию в качестве второго аргумента addEventListener, вот так

document.getElementById('themeButton').addEventListener('click', function() { /* Theme button script */
    document.body.classList.toggle('dark-theme');
});

Вам также придется переместить правила .dark-theme CSS за пределы тела, потому что, если вы используете их, как в вашем примере, они могут влиять только на дочерние элементы тела, а не на само тело.

body {
    /* Main body styles */
}
/* Dark theme styles */
.dark-theme {
 
}

(Two examples ahead!)

Вам нужно ссылаться на себя body, используя & во вложенном CSS , поскольку вы фактически переключаете этот класс в элементе body, используя document.body.classList.toggle('dark-theme');

body {
  /* Default body styles */
  &.dark-theme {      /* alias for: body.dark-theme */
    /* Dark theme body styles */
  }
}

Затем для H1 вы можете использовать: H1 является потомком класса body темной темы, например:

h1 {
  /* Default h1 styles */
  .dark-theme & {     /* alias for: .dark-theme h1 */
    /* Dark theme h1 styles */
  }
}

и так же, как и выше h1 стили, вы можете стилизовать любой другой селектор.

Кроме того, в вашем JS была опечатка; все исправлено в следующем примере:

document.querySelector("#theme").addEventListener("click", () => { 
  document.body.classList.toggle("dark-theme");
});
body {
  background: #fff;
  color: #333;
  
  &.dark-theme {
    background: #333;
    color: #fff;
  }
}

a {
  color: #0bf;
  
  .dark-theme & {
    color: #fb0;
  }
}
<button type = "button" id = "theme">Toggle theme</button>

<h1>TITLE</h1>
<p>Lorem ipsum <a href = "#">dolor</a> sit amet.</p>

Честно говоря, я бы не стал создавать какие-либо кнопки для переключения чего-либо. Чем меньше пользовательского интерфейса, тем лучше, а сейчас 2024 год. Темные темы довольно распространены в дизайне пользовательского интерфейса. Вместо этого я бы сосредоточился на предпочитаемой пользователем теме ОС, используя @media предпочитает цветовую схему и некоторые свойства CSS:

:root {
  --accent: #0bf;
  --color: #333;
  --bg: #fff;
  
  @media (prefers-color-scheme: dark) {
    --accent: #0bf;
    --color: #fff;
    --bg: #333;
  }
}

body {
  background: var(--bg);
  color: var(--color);
}

a {
  color: var(--accent);
}
<h1>TITLE</h1>
<p>Lorem ipsum <a href = "#">dolor</a> sit amet.</p>