Запускать и исчезать CSS-анимацию с помощью JavaScript - работает только в одном направлении?

0

Я пытаюсь создать меню, которое исчезает и исчезает при нажатии. Это код:

HTML

<div id="trigger">CLICK</div>

<ul data-status="shown" id="navi">
  <li><a href="#">Link</a></li>
  <li><a href="#">Link</a></li>
</ul>

CSS

@keyframes fade {
    0% { opacity: 0; }
    100% { opacity: 1; display: block; }
}

ul {
  background: grey;
}

ul[data-status="shown"] {
   opacity: 1;
   animation: fade 2s;
}

ul[data-status="hidden"] {
    opacity: 0;
    animation: fade 2s;
    animation-direction: reverse;
}

ul[data-status="removed"] {
    display: none;
}

JavaScript

function myMenu () {
    var trigger = document.getElementById( 'trigger' ),
        menu = document.getElementById( 'navi' ),
        state = menu.getAttribute( 'data-status' );

    if ( state == 'shown' ) {
        menu.removeAttribute( 'data-status' );
        menu.setAttribute( 'data-status', 'removed' );
        state = menu.getAttribute( 'data-status' );
    }

    var toggle = function () {
        if ( state == 'shown' ) {
            menu.removeAttribute( 'data-status' );
            menu.setAttribute( 'data-status', 'hidden' );
            setTimeout( function() {
                menu.removeAttribute( 'data-status' );
                menu.setAttribute( 'data-status', 'removed' );
                state = menu.getAttribute( 'data-status' );
            }, 2000 );
        }

        if ( state == 'removed' ) {
            menu.removeAttribute( 'data-status' );
            menu.setAttribute( 'data-status', 'shown' );
            state = menu.getAttribute( 'data-status' );
        }
    };

    trigger.addEventListener( 'click', toggle, false );

}

myMenu();

Пример: http://jsbin.com/avUWUnO/1/edit

Затухание работает так, как ожидалось, но исчезновение на самом деле отсутствует, меню просто исчезает. Или, может быть, это потому, что я нажимаю слишком быстро? Тогда есть какая-то странная задержка там, ошибка, вероятно, там, где я использую setTimeout, но я не могу определить, что там не так.

Статус заблокирован, анимация CSS срабатывает, а через две секунды после завершения анимации меню удаляется. Почему это работает не так, как ожидалось?

  • 0
    Jacedc верен, но на заметку, вы должны добавить какое-то время ожидания для JavaScript или превратить его в полноценный CSS, используя label и скрытый input
  • 0
    @Zeaklous Извините, я не знаю, что вы имеете в виду, какой должна быть ценность этого скрытого поля?
Показать ещё 1 комментарий
Теги:
animation

1 ответ

1

Вам не хватает префиксов поставщиков в свойствах css. Я изменил все и все селектор animation и keyframe и добавил -webkit- (хром и сафари), и он сработал.

Префиксы поставщика - это -webkit- (сафари и хром <27, я думаю), -o- opera <17, IE10 является первым браузером для префиксов поставщиков, поэтому вам не нужно беспокоиться об этом, а -moz- Fire Fox. Обязательно укажите как префиксную версию, так и версию без префикса.

Так, например, я только изменил -webkit-:

@-webkit-keyframes fade {
  0% { opacity: 0; }
  100% { opacity: 1; display: block; }
}

@keyframes fade {
  0% { opacity: 0; }
  100% { opacity: 1; display: block; }
}

ul {
  background: grey;
}

ul[data-status="shown"] {
 opacity: 1;
 -webkit-animation: fade 2s;
 animation: fade 2s;
}

ul[data-status="hidden"] {
  opacity: 0;
  -webkit-animation: fade 2s;
  -webkit-animation-direction: reverse;
  animation: fade 2s;
  animation-direction: reverse;
}

ul[data-status="removed"] {
  display: none;
}

Но вы также можете добавить остальные префиксы.

JSBin (спасибо Zeaklous за это.)

  • 0
    Конечно, вы правы, эти префиксы отсутствуют, но я протестировал их в Firefox 24, который не нуждается в каких-либо префиксах и там только корректный режим работает правильно.
  • 0
    Это работает в FF, если вы добавите обратно исходные свойства jsbin.com/avUWUnO/7/edit @Jacedc, не стесняйтесь обновить свой ответ с ним
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню