Smoothstate.js . Исчезающая обратная анимация не запускается
Я знаю, что этот вопрос задавался в разных местах, но мне еще предстоит найти ответ, который подходит для моей ситуации.
Я использую smoothstate.js для запуска серии анимаций при загрузке страницы и (надеюсь) для отмены анимаций при выходе из страницы.
Отлично работает при загрузке страницы, но не повезло в обратном направлении. Прокрутка вверх тоже не работает.
Пожалуйста, посмотрите эту скрипку: https://jsfiddle.net/bridget_kilgallon/jxh2urgg/
JS:
;(function ($) {
'use strict';
var content = $('#main').smoothState({
// onStart runs as soon as link has been activated
onStart : {
// Set the duration of our animation
duration: 250,
// Alterations to the page
render: function () {
// Quickly toggles a class and restarts css animations
content.toggleAnimationClass('is-exiting');
}
}
}).data('smoothState'); // makes public methods available
})(jQuery);
;(function ($) {
'use strict';
var $body = $('html, body'), // Define jQuery collection
content = $('#main').smoothState({
onStart : {
duration: 250,
render: function () {
content.toggleAnimationClass('is-exiting');
// Scroll user to the top
$body.animate({ 'scrollTop': 0 });
}
}
}).data('smoothState');
})(jQuery);
SCSS:
/** Reverse "exit" animations */
.m-scene.is-exiting {
.scene-element {
animation-direction: alternate-reverse;
-webkit-animation-direction: alternate-reverse;
-moz-animation-direction: alternate-reverse;
}
}
3 ответа
toggleAnimationClass()
был объявлен устаревшим использование restartCSSAnimations()
вместо этого добавьте или удалите классы анимации в соответствующих обратных вызовах.
Например:
var smoothState = $page.smoothState({
onStart: {
duration: 250,
render: function (url, $container) {
// Add your CSS animation reversing class
$page.addClass('is-exiting');
// Restart your animation
smoothState.restartCSSAnimations();
// anything else
}
},
onEnd: {
duration: 0,
render: function (url, $container, $content) {
// Remove your CSS animation reversing class
$page.removeClass('is-exiting');
// Inject the new content
$container.html($content);
}
}
}).data('smoothState');
Столкнулся с той же проблемой. Важно прочитать код функции restartCSSAnimations.
Он только перезапускает анимации, привязанные к основному объекту контейнера. В моем случае у меня были анимации на детей, которые не стреляли.
Моим решением было добавить класс 'pt-reverse' к любому элементу, который нуждается в обратной анимации. Затем в onStart я добавил следующее вместо restartCSSAnimations:
els = $('.pt-reverse');
$.each(els,function(ix,el) {
var animation = $(el).css('animation-name');
$(el).css('animation-name','none');
$(el).height();
$(el).css('animation-name',animation);
});
// smoothState.restartCSSAnimations();
Это делает, по сути, то, что делает restartCSSAnimations, за исключением того, что более нацелены на конкретные элементы.
Теперь это работает гладко.
Проверьте продолжительность вашей анимации и убедитесь, что она длится столько же времени, сколько вы установили для пары ключ / значение продолжительности в JavaScript.