diff --git a/js/controllers/autoanimate.js b/js/controllers/autoanimate.js index ff74eee8..60c02e51 100644 --- a/js/controllers/autoanimate.js +++ b/js/controllers/autoanimate.js @@ -27,8 +27,16 @@ export default class AutoAnimate { // Clean up after prior animations this.reset(); - // Ensure that both slides are auto-animate targets - if( fromSlide.hasAttribute( 'data-auto-animate' ) && toSlide.hasAttribute( 'data-auto-animate' ) ) { + let allSlides = this.Reveal.getSlides(); + let toSlideIndex = allSlides.indexOf( toSlide ); + let fromSlideIndex = allSlides.indexOf( fromSlide ); + + // Ensure that both slides are auto-animate targets with the same data-auto-animate-id value + // (including null if absent on both) and that data-auto-animate-restart isn't set on the + // physically latter slide (independent of slide direction) + if( fromSlide.hasAttribute( 'data-auto-animate' ) && toSlide.hasAttribute( 'data-auto-animate' ) + && fromSlide.getAttribute( 'data-auto-animate-id' ) === toSlide.getAttribute( 'data-auto-animate-id' ) + && !( toSlideIndex > fromSlideIndex ? toSlide : fromSlide ).hasAttribute( 'data-auto-animate-restart' ) ) { // Create a new auto-animate sheet this.autoAnimateStyleSheet = this.autoAnimateStyleSheet || createStyleSheet(); @@ -40,8 +48,7 @@ export default class AutoAnimate { toSlide.dataset.autoAnimate = 'pending'; // Flag the navigation direction, needed for fragment buildup - let allSlides = this.Reveal.getSlides(); - animationOptions.slideDirection = allSlides.indexOf( toSlide ) > allSlides.indexOf( fromSlide ) ? 'forward' : 'backward'; + animationOptions.slideDirection = toSlideIndex > fromSlideIndex ? 'forward' : 'backward'; // Inject our auto-animate styles for this transition let css = this.getAutoAnimatableElements( fromSlide, toSlide ).map( elements => { diff --git a/js/reveal.js b/js/reveal.js index 1aeb31d1..b0e5924e 100644 --- a/js/reveal.js +++ b/js/reveal.js @@ -1251,7 +1251,10 @@ export default function( revealElement, options ) { // Note 20-03-2020: // This needs to happen before we update slide visibility, // otherwise transitions will still run in Safari. - if( previousSlide.hasAttribute( 'data-auto-animate' ) && currentSlide.hasAttribute( 'data-auto-animate' ) ) { + if( previousSlide.hasAttribute( 'data-auto-animate' ) && currentSlide.hasAttribute( 'data-auto-animate' ) + && previousSlide.getAttribute( 'data-auto-animate-id' ) === currentSlide.getAttribute( 'data-auto-animate-id' ) + && !( ( indexh > indexhBefore || indexv > indexvBefore ) ? currentSlide : previousSlide ).hasAttribute( 'data-auto-animate-restart' ) ) { + autoAnimateTransition = true; dom.slides.classList.add( 'disable-slide-transitions' ); }