JavaScript не отображает после анимации CSS3

У меня есть div с id = 'mainmenu'. Я добавляю переход CSS3 к нему с помощью JavaScript после нажатия кнопки (путем добавления "перехода" в #mainmenu и создания классов .fadein и .fadeout, которые будут добавлены в элемент div). Код:

<div id='mainmenu'></div>
<button id="btn1">Click me1</button>
<button id="btn2">Click me2</button>

#mainmenu {
    width:100px; 
    height:100px; 
    background:#eee; 
    -webkit-transition: opacity 1s; 
    -moz-transition: opacity 1s; 
    transition: opacity 1s; 
}

.fadeout {
    opacity:0;
}
.fadein {
    opacity:1;
}


var menu = document.getElementById('mainmenu'),
    btn1 = document.getElementById('btn1'),
    btn2 = document.getElementById('btn2');

btn1.addEventListener('click', function() {
    menu.className = 'fadeout';
}
btn2.addEventListener('click', function() {
    menu.className = 'fadein';
}

Проблема в том, что теперь я хочу добавить display none и заблокировать опцию fadeout и fadein. Поэтому после анимации fadeout анимация должна отображаться без отображения, а после блока отображения fadein:

btn1.addEventListener('click', function() {
    menu.className = 'fadeout';
    menu.style.display = 'none';
}
btn2.addEventListener('click', function() {
    menu.className = 'fadein';
    menu.style.display = 'block';
}

К сожалению, на экране нет ни одного кадра, а блок выполняется с анимацией, поэтому анимация не работает (элемент не отображает ни одного, без анимации непрозрачности). Сначала хочу анимацию с непрозрачностью, а после этого нет элемента/блока для элемента. Есть ли способ сделать это? Я могу использовать только чистый JavaScript (без jQuery и т.д.).

Ответ 1

Вам нужно использовать setTimeout() с menu.style.display = "none";, чтобы позволить fade выполнить это задание до запуска style.display.

btn1.addEventListener('click', function() {
    menu.className = 'fadeout';
    setTimeout(function() {
        $(menu).css('display', 'none');
    }, 1000);
}
btn2.addEventListener('click', function() {
    menu.className = 'fadein';
    setTimeout(function() {
        $(menu).css('display', 'block');
    }, 1000);
}

Ответ 2

Возможно, я ошибаюсь, но считаю, что вам нужно добавить триггер перехода, который отображает: block/display: none change.

см.: События перехода CSS3

Ответ 3

Я использую высоту 0 вместо отображения нет для некоторых случаев, но может или не может применяться к тому, что вам нужно. В любом случае здесь код:

1) Использование переходов (выглядит как jQuerys fadeOut):

.fadeOut{
  opacity : 0;
  height : 0;
  transition : opacity 800ms, height 0 800ms;
}

если вы хотите, вы также можете добавить ширину 0.

.fadeOut{
  opacity : 0;
  width : 0;
  height : 0;
  transition : opacity 800ms, height 0 800ms, width 0 800ms;
}

2) Использование анимаций (лучше работает, но переходы):

.fadeOut{
  animation : fadeout 800ms linear forwards;
}
@keyframes fadeout{
  99%{
    opacity : 0;
    height : initial;
  }
  100%{
    opacity : 0;
    height : 0;
  }
}

Ответ 4

Хотя это старый пост, для будущего посетителя вы можете использовать событие перехода. Вы можете использовать:

/*For when object has fully faded*/
menu.addEventListener("transitionend", function() {
  if (this.className == "fadeout") {
    this.style.display = "none";
  }
}.bind(menu));

/*Show before animation starts*/
menu.addEventListener("click", function() {
  this.style.display = "block";
}.bind(menu));

Ответ 5

Одна из возможностей - использовать transition-delay. Я не пробовал, но может быть достаточно:

.fadeout {
  opacity:0;
}
.fadein {
  opacity:1;
  display: block;
}
.afterFadeOut {
  transition-delay: 1s;
  display: none;
}

а затем измените свой класс на затухание:

menu.className = 'fadeout afterFadeOut';

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