Я пытаюсь добавить функциональность кнопке в проекте, над которым работаю... при нажатии кнопки я хочу, чтобы элемент больше не отображался на странице. Однако я не могу заставить этот процесс работать. Вот мой 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.
Если я правильно понимаю, 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
проверки терпят неудачу.
Это именно то, что я искал, спасибо!!
Пожалуйста. Пожалуйста, отметьте этот ответ как принятый, чтобы другие могли извлечь выгоду.
Когда вы нажимаете кнопку, я бы рекомендовал добавить еще один класс в div. Например, .content-container---not-visible
, а затем добавьте стили в div в css.
.content-container---not-visible {
display: none;
}
лично мне так проще сделать
Вы можете добавить имя класса, используя это
element.classList.add("content-container---not-visible");
Это хорошая идея, которую я недавно усвоил. В данном случае мне было интересно понять, почему логика работает именно так. Спасибо за ответ!
mainPage.style.display
примет встроенный стиль элемента. Не все, что применяется к нему с помощью определенного вами правила CSS. Вам нужно обновить таблицу стилей или только встроенный стиль?