-
-
Save jamesdeantv/7919de0f9d214f22b199b084c261fa4b to your computer and use it in GitHub Desktop.
Ionic 3 custom page transitions: "slide-up" and "fancy"
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import { Animation, PageTransition } from "ionic-angular"; | |
import { isPresent } from "ionic-angular/util/util"; | |
const EASINGS = { | |
outBack: 'cubic-bezier(0.175, 0.885, 0.32, 1.275)', | |
inOutCubic: 'cubic-bezier(0.645, 0.045, 0.355, 1)', | |
magnet: 'cubic-bezier(0.85, 0.06, 0.15, 0.94)' | |
} | |
const DURATION = 500; | |
export class FancyTransition extends PageTransition { | |
init() { | |
super.init(); | |
this.duration(isPresent(this.opts.duration) ? this.opts.duration : DURATION); | |
this.easing(isPresent(this.opts.easing) ? this.opts.easing : EASINGS.inOutCubic); | |
const enteringHasNavbar = (this.enteringView && this.enteringView.hasNavbar()); | |
if (this.enteringView) { | |
const enteringPageEle: Element = this.enteringView.pageRef().nativeElement; | |
const enteringContent = new Animation(this.plt, this.enteringView.contentRef()); | |
enteringContent.element(enteringPageEle.querySelectorAll('ion-header > *:not(ion-navbar),ion-footer > *')); | |
this.add(enteringContent); | |
enteringContent | |
.beforeClearStyles(['opacity']) | |
.fromTo('scale', 0.3, 1, true) | |
.fromTo('opacity', 0.01, 1, true); | |
if (enteringHasNavbar) { | |
const enteringNavbarEle = enteringPageEle.querySelector('ion-navbar'); | |
const enteringNavBar = new Animation(this.plt, enteringNavbarEle); | |
this.add(enteringNavBar); | |
enteringNavBar.fromTo('translateX', '100%', '0', true); | |
const enteringTitle = new Animation(this.plt, enteringNavbarEle.querySelector('ion-title')); | |
const enteringNavbarItems = new Animation(this.plt, enteringNavbarEle.querySelectorAll('ion-buttons,[menuToggle]')); | |
const enteringNavbarBg = new Animation(this.plt, enteringNavbarEle.querySelector('.toolbar-background')); | |
const enteringBackButton = new Animation(this.plt, enteringNavbarEle.querySelector('.back-button')); | |
enteringNavBar | |
.add(enteringTitle) | |
.add(enteringNavbarItems) | |
.add(enteringNavbarBg) | |
.add(enteringBackButton); | |
enteringTitle.fromTo('opacity', 0.01, 1, true); | |
enteringNavbarItems.fromTo('opacity', 0.01, 1, true); | |
enteringNavbarBg | |
.beforeClearStyles(['opacity']) | |
.fromTo('opacity', 0.01, 1, true); | |
if (this.enteringView.enableBack()) { | |
enteringBackButton | |
.beforeAddClass('show-back-button') | |
.fromTo('opacity', 0.01, 1, true); | |
const enteringBackBtnText = new Animation(this.plt, enteringNavbarEle.querySelector('.back-button-text')); | |
enteringBackBtnText.fromTo('opacity', 0.01, 1, true); | |
enteringNavBar.add(enteringBackBtnText); | |
} else { | |
enteringBackButton.beforeRemoveClass('show-back-button'); | |
} | |
} | |
} | |
if (this.leavingView && this.leavingView.pageRef()) { | |
const leavingContent = new Animation(this.plt, this.leavingView.pageRef()); | |
this.add(leavingContent); | |
leavingContent | |
.fromTo('filter', "grayscale(0)", "grayscale(90%)", true) | |
.afterClearStyles(['filter']); | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import { Animation } from "ionic-angular/animations/animation"; | |
import { isPresent } from "ionic-angular/util/util"; | |
import { PageTransition } from "ionic-angular/transitions/page-transition"; | |
const DURATION = 500; | |
export class SlideUpTransition extends PageTransition { | |
init() { | |
super.init(); | |
this.duration(isPresent(this.opts.duration) ? this.opts.duration : DURATION); | |
const backDirection = (this.opts.direction === 'back'); | |
if (this.enteringView) { | |
//animating new page | |
const enteringContent = new Animation(this.plt, this.enteringView.pageRef()); | |
this.add(enteringContent); | |
if (backDirection) { | |
enteringContent.fromTo("transform", "translateY(0)", "translateY(100%)", true); | |
} else { | |
enteringContent.fromTo("transform", "translateY(100%)", "translateY(0)", true); | |
} | |
if (this.enteringView.enableBack()) { | |
const enteringPage = this.enteringView.pageRef().nativeElement; | |
const enteringNavBar = new Animation(this.plt, this.enteringView.pageRef()); | |
this.add(enteringNavBar); | |
const enteringBackButton = new Animation(this.plt, enteringPage.querySelector('.back-button')); | |
enteringBackButton.beforeAddClass('show-back-button') | |
enteringNavBar.add(enteringBackButton); | |
} | |
} | |
if (this.leavingView && this.leavingView.pageRef()) { | |
//animating old page | |
const leavingContent = new Animation(this.plt, this.leavingView.pageRef()); | |
this.add(leavingContent); | |
if (backDirection) { | |
leavingContent.fromTo("filter", "grayscale(100%)", "grayscale(0)", true); | |
} else { | |
leavingContent | |
.fromTo("filter", "grayscale(0)", "grayscale(100%)", true) | |
.afterClearStyles(["filter"]); | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment