Изменение свойства отображения CSS с помощью JS EventListener

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

.content-container {
    display: flex;
    justify-content: center;
    align-items: center;
    height: 40.06rem;
    min-width: 58rem;
    background: #ffffff;
    box-shadow: 0px 15px 60px rgba(0, 0, 0, 0.25);
    border-radius: 36px;
  }

Вот мой JS-код:

//Селекторы DOM

const button = document.getElementById("subscribe-button");
const mainPage = document.getElementsByClassName("content-container")[0];

//Прослушиватели событий

button.addEventListener("click", function (e) {
  if (mainPage.style.display === "flex") {
    mainPage.style.display = "none";
  }
});

Я добавил прослушиватель событий JS к кнопке на своей странице и ожидал, что нажатие кнопки изменит свойство отображения с «flex» на «none» и в результате соответствующий элемент больше не будет отображаться.

Однако, когда я нажимаю кнопку, ничего не происходит.

Если я изменю свою логику JS на следующий код, я смогу заставить ее работать:

button.addEventListener("click", function (e) {
  if (mainPage.style.display === "none") {
    mainPage.style.display = "flex";
  } else {
    mainPage.style.display = "none";
  }
});

Если я правильно понимаю, JS видит значение свойства display по умолчанию как «none», но в этом случае я явно определил «display: flex» в своем CSS, так почему же первый блок кода не работает, а второй работает правильно? Кроме того, если необходим второй блок кода (как кажется), есть ли более краткий способ написать это? Похоже, что первый блок оператора if ничего не делает, потому что всю работу выполняет блок else.

mainPage.style.display примет встроенный стиль элемента. Не все, что применяется к нему с помощью определенного вами правила CSS. Вам нужно обновить таблицу стилей или только встроенный стиль?
VLAZ 03.07.2024 17:52
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
1
55
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Если я правильно понимаю, JS видит значение свойства display по умолчанию как «none».

Это не так: если вы определяете элемент в таблице стилей CSS, свойство отображения по умолчанию зависит от того, что это за элемент, например, p — это block, span — это inline и т. д.

Когда вы выполняете проверку if на наличие mainPage.style.display === "flex", которая mainPage.style.display проверяет наличие встроенного стиля в элементе html. Он не проверяет таблицу стилей CSS. Итак, ваш блок if не работает в первом опубликованном вами блоке кода, и поэтому стиль не изменяется. Во втором блоке кода вашего примера. else выполняет свою работу, потому что ваш if mainPage.style.display === "none" снова не работает. Чтобы на самом деле проверить стиль отображения этого элемента (который установлен в файле CSS), вам нужно сделать следующее:

if (window.getComputedStyle(mainPage).display === "flex") {
  mainPage.style.display = "none"
}

Вы также можете помочь в отладке, зарегистрировав в консоли свой элемент mainPage и прокрутив вниз, чтобы увидеть, что свойство display представляет собой "" пустую строку. Вот почему ваши первоначальные if проверки терпят неудачу.

Это именно то, что я искал, спасибо!!

R Todd M 04.07.2024 20:50

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

Brent 05.07.2024 17:04

Когда вы нажимаете кнопку, я бы рекомендовал добавить еще один класс в div. Например, .content-container---not-visible, а затем добавьте стили в div в css.

.content-container---not-visible {
    display: none;
}

лично мне так проще сделать

Вы можете добавить имя класса, используя это element.classList.add("content-container---not-visible");

Это хорошая идея, которую я недавно усвоил. В данном случае мне было интересно понять, почему логика работает именно так. Спасибо за ответ!

R Todd M 04.07.2024 20:49

Другие вопросы по теме