transition-ios.ts 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. import { Animation } from '../animations/animation';
  2. import { isPresent } from '../util/util';
  3. import { PageTransition } from './page-transition';
  4. const DURATION = 500;
  5. const EASING = 'cubic-bezier(0.36,0.66,0.04,1)';
  6. const OPACITY = 'opacity';
  7. const TRANSFORM = 'transform';
  8. const TRANSLATEX = 'translateX';
  9. const CENTER = '0%';
  10. const OFF_OPACITY = 0.8;
  11. const SHOW_BACK_BTN_CSS = 'show-back-button';
  12. export class IOSTransition extends PageTransition {
  13. init() {
  14. super.init();
  15. const plt = this.plt;
  16. const OFF_RIGHT = plt.isRTL ? '-99.5%' : '99.5%';
  17. const OFF_LEFT = plt.isRTL ? '33%' : '-33%';
  18. const enteringView = this.enteringView;
  19. const leavingView = this.leavingView;
  20. const opts = this.opts;
  21. this.duration(isPresent(opts.duration) ? opts.duration : DURATION);
  22. this.easing(isPresent(opts.easing) ? opts.easing : EASING);
  23. const backDirection = (opts.direction === 'back');
  24. const enteringHasNavbar = (enteringView && enteringView.hasNavbar());
  25. const leavingHasNavbar = (leavingView && leavingView.hasNavbar());
  26. if (enteringView) {
  27. // get the native element for the entering page
  28. const enteringPageEle: Element = enteringView.pageRef().nativeElement;
  29. // entering content
  30. const enteringContent = new Animation(plt, enteringView.contentRef());
  31. enteringContent.element(enteringPageEle.querySelectorAll('ion-header > *:not(ion-navbar),ion-footer > *'));
  32. this.add(enteringContent);
  33. if (backDirection) {
  34. // entering content, back direction
  35. enteringContent
  36. .fromTo(TRANSLATEX, OFF_LEFT, CENTER, true)
  37. .fromTo(OPACITY, OFF_OPACITY, 1, true);
  38. } else {
  39. // entering content, forward direction
  40. enteringContent
  41. .beforeClearStyles([OPACITY])
  42. .fromTo(TRANSLATEX, OFF_RIGHT, CENTER, true);
  43. }
  44. if (enteringHasNavbar) {
  45. // entering page has a navbar
  46. const enteringNavbarEle = enteringPageEle.querySelector('ion-navbar');
  47. const enteringNavBar = new Animation(plt, enteringNavbarEle);
  48. this.add(enteringNavBar);
  49. const enteringTitle = new Animation(plt, enteringNavbarEle.querySelector('ion-title'));
  50. const enteringNavbarItems = new Animation(plt, enteringNavbarEle.querySelectorAll('ion-buttons,[menuToggle]'));
  51. const enteringNavbarBg = new Animation(plt, enteringNavbarEle.querySelector('.toolbar-background'));
  52. const enteringBackButton = new Animation(plt, enteringNavbarEle.querySelector('.back-button'));
  53. enteringNavBar
  54. .add(enteringTitle)
  55. .add(enteringNavbarItems)
  56. .add(enteringNavbarBg)
  57. .add(enteringBackButton);
  58. enteringTitle.fromTo(OPACITY, 0.01, 1, true);
  59. enteringNavbarItems.fromTo(OPACITY, 0.01, 1, true);
  60. // set properties depending on direction
  61. if (backDirection) {
  62. // entering navbar, back direction
  63. enteringTitle.fromTo(TRANSLATEX, OFF_LEFT, CENTER, true);
  64. if (enteringView.enableBack()) {
  65. // back direction, entering page has a back button
  66. enteringBackButton
  67. .beforeAddClass(SHOW_BACK_BTN_CSS)
  68. .fromTo(OPACITY, 0.01, 1, true);
  69. }
  70. } else {
  71. // entering navbar, forward direction
  72. enteringTitle.fromTo(TRANSLATEX, OFF_RIGHT, CENTER, true);
  73. enteringNavbarBg
  74. .beforeClearStyles([OPACITY])
  75. .fromTo(TRANSLATEX, OFF_RIGHT, CENTER, true);
  76. if (enteringView.enableBack()) {
  77. // forward direction, entering page has a back button
  78. enteringBackButton
  79. .beforeAddClass(SHOW_BACK_BTN_CSS)
  80. .fromTo(OPACITY, 0.01, 1, true);
  81. const enteringBackBtnText = new Animation(plt, enteringNavbarEle.querySelector('.back-button-text'));
  82. enteringBackBtnText.fromTo(TRANSLATEX, (plt.isRTL ? '-100px' : '100px'), '0px');
  83. enteringNavBar.add(enteringBackBtnText);
  84. } else {
  85. enteringBackButton.beforeRemoveClass(SHOW_BACK_BTN_CSS);
  86. }
  87. }
  88. }
  89. }
  90. // setup leaving view
  91. if (leavingView && leavingView.pageRef()) {
  92. // leaving content
  93. const leavingPageEle: Element = leavingView.pageRef().nativeElement;
  94. const leavingContent = new Animation(plt, leavingView.contentRef());
  95. leavingContent.element(leavingPageEle.querySelectorAll('ion-header > *:not(ion-navbar),ion-footer > *'));
  96. this.add(leavingContent);
  97. if (backDirection) {
  98. // leaving content, back direction
  99. leavingContent
  100. .beforeClearStyles([OPACITY])
  101. .fromTo(TRANSLATEX, CENTER, (plt.isRTL ? '-100%' : '100%'));
  102. } else {
  103. // leaving content, forward direction
  104. leavingContent
  105. .fromTo(TRANSLATEX, CENTER, OFF_LEFT)
  106. .fromTo(OPACITY, 1, OFF_OPACITY)
  107. .afterClearStyles([TRANSFORM, OPACITY]);
  108. }
  109. if (leavingHasNavbar) {
  110. // leaving page has a navbar
  111. const leavingNavbarEle: Element = leavingPageEle.querySelector('ion-navbar');
  112. const leavingNavBar = new Animation(plt, leavingNavbarEle);
  113. const leavingTitle = new Animation(plt, leavingNavbarEle.querySelector('ion-title'));
  114. const leavingNavbarItems = new Animation(plt, leavingNavbarEle.querySelectorAll('ion-buttons,[menuToggle]'));
  115. const leavingNavbarBg = new Animation(plt, leavingNavbarEle.querySelector('.toolbar-background'));
  116. const leavingBackButton = new Animation(plt, leavingNavbarEle.querySelector('.back-button'));
  117. leavingNavBar
  118. .add(leavingTitle)
  119. .add(leavingNavbarItems)
  120. .add(leavingBackButton)
  121. .add(leavingNavbarBg);
  122. this.add(leavingNavBar);
  123. // fade out leaving navbar items
  124. leavingBackButton.fromTo(OPACITY, 0.99, 0);
  125. leavingTitle.fromTo(OPACITY, 0.99, 0);
  126. leavingNavbarItems.fromTo(OPACITY, 0.99, 0);
  127. if (backDirection) {
  128. // leaving navbar, back direction
  129. leavingTitle.fromTo(TRANSLATEX, CENTER, (plt.isRTL ? '-100%' : '100%'));
  130. // leaving navbar, back direction, and there's no entering navbar
  131. // should just slide out, no fading out
  132. leavingNavbarBg
  133. .beforeClearStyles([OPACITY])
  134. .fromTo(TRANSLATEX, CENTER, (plt.isRTL ? '-100%' : '100%'));
  135. let leavingBackBtnText = new Animation(plt, leavingNavbarEle.querySelector('.back-button-text'));
  136. leavingBackBtnText.fromTo(TRANSLATEX, CENTER, (plt.isRTL ? -300 : 300) + 'px');
  137. leavingNavBar.add(leavingBackBtnText);
  138. } else {
  139. // leaving navbar, forward direction
  140. leavingTitle
  141. .fromTo(TRANSLATEX, CENTER, OFF_LEFT)
  142. .afterClearStyles([TRANSFORM]);
  143. leavingBackButton.afterClearStyles([OPACITY]);
  144. leavingTitle.afterClearStyles([OPACITY]);
  145. leavingNavbarItems.afterClearStyles([OPACITY]);
  146. }
  147. }
  148. }
  149. }
  150. }