Для начала несколько рекомендаций:
1. Следует отказаться от стилизации элементов по ID селектору, потому что это считается плохой практикой.
2. Для простой функции переключения класса у элемента, не нужно столько кода.
Почему transition не срабатывает при скрытии элемента?
- transition: opacity 0.3s;
+ transition: opacity 0.3s, visibility 0.3s;
При комбинированном использовании свойств
opacity и
visibility, следует указывать оба свойства в
transition, желательно с одинаковым временем перехода от одного состояния к другому.
CSS и JS можно сократить и привести к нормальному виду.
CSS:
.block {
width: 250px;
height: 250px;
background: #eee;
opacity: 0;
visibility: hidden;
transition: opacity 0.3s, visibility 0.3s;
}
.block-active {
opacity: 1;
visibility: visible;
}
JS:
function show() {
const element = document.getElementById("block");
element.classList.toggle("block-active");
}
Или:
function show() {
const element = document.getElementById("block");
switch (Boolean(element.classList.contains("block-active"))) {
case false:
return element.classList.add("block-active");
case true:
return element.classList.remove("block-active");
}
}