barba-transitions
Version:
An addon to BarbaJS which makes it really easy to use css transitions for page transitions.
91 lines (70 loc) • 2.66 kB
JavaScript
// Define barba properties
Barba.transitionLength = 500;
// Define transition
var Transition = Barba.BaseTransition.extend({
start: function() {
this.newContainerLoading.then(this.runTransition.bind(this));
},
runTransition: function() {
document.body.style.overflow = 'hidden';
////////////////////////////
// Setup
////////////////////////////
var transitionLength = parseInt(Barba.transitionLength),
transitionTimeout = 100,
transitionLengthSeconds = (transitionLength / 1000) + 's',
transitionSelector = 'data-transition';
////////////////////////////
// Set the animation time on all elements
var allAnimationElements = document.querySelectorAll('[' + transitionSelector + ']');
for (var i = 0; i < allAnimationElements.length; i++) {
element = allAnimationElements[i];
// Set styles
element.style.animationDuration = transitionLengthSeconds;
element.style.animationDelay = transitionLengthSeconds;
element.style.animationName = element.dataset.transition;
element.style.animationFillMode = 'forwards';
}
// Get all old elements with transitions
var oldElements = this.oldContainer.querySelectorAll('[' + transitionSelector + ']');
for (var i = 0; i < oldElements.length; i++) {
element = oldElements[i];
// Remove style tag
element.removeAttribute('style');
}
// Trigger out transitions
setTimeout(function(){
for (var i = 0; i < oldElements.length; i++) {
element = oldElements[i];
// Set styles
element.style.animationDuration = transitionLengthSeconds;
element.style.animationDelay = '0s';
element.style.animationName = element.dataset.transition;
element.style.animationFillMode = 'forwards';
element.style.animationDirection = 'alternate-reverse';
}
}, transitionTimeout);
var x = this;
function done(x) {
// Remove old container and add new one
x.oldContainer.style.visibility = 'hidden';
x.newContainer.style.visibility = 'visible';
// Remove style tag at the end of the animation
setTimeout(function(){
document.body.style.overflow = 'visible';
for (var i = 0; i < allAnimationElements.length; i++) {
element = allAnimationElements[i];
element.removeAttribute('style');
}
}, transitionLength);
// Scroll to top
document.body.scrollTop = 0;
// Done
x.done();
}
// Mark as done
setTimeout(function(){
done(x);
}, transitionLength + transitionTimeout);
}
});