Skip to content

Commit a87bc52

Browse files
committed
- Re-implemented the css3TransitionHandler() code in terms of the keyframe animation implementation. Some timer tweaks were necessary to catch the case where there is no transition (change in value) for the "to" or "from" page.
- Re-worked the CSS target selectors for slide, slideup, slidedown, pop, and fade to make sure things animated properly in both the forward and reverse directions. - Added .ui-page.in rule to make sure the page we are transitioning to is visible at the exact moment the transition is setup. This used to be handled by setting the ui-active-page class on the "to" page before firing the transition, but that was causing some flashing before/after the transition happened.
1 parent 322e7c9 commit a87bc52

File tree

3 files changed

+105
-95
lines changed

3 files changed

+105
-95
lines changed

js/jquery.mobile.navigation.js

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -538,9 +538,7 @@
538538

539539
//transition handler dictionary for 3rd party transitions
540540
$.mobile.transitionHandlers = {
541-
none: $.mobile.defaultTransitionHandler,
542-
slide: $.mobile.noneTransitionHandler,
543-
flip: $.mobile.noneTransitionHandler
541+
none: $.mobile.defaultTransitionHandler
544542
};
545543

546544
//enable cross-domain page support

js/jquery.mobile.transition.js

Lines changed: 46 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -9,87 +9,66 @@
99

1010
(function( $, window, undefined ) {
1111

12-
/**
13-
* Runs a transition on the element specified by the animation classes passed as first argument
14-
* (cp. jquery.mobile.transitions.css) and calls a callback once they're done.
15-
*
16-
* If the callback event has not been triggered after <timeout> milliseconds, the callback is
17-
* called "manually". The optional third argument allows you to define a custom timeout or
18-
* disable it completely (by passing 0 or false).
19-
*/
20-
$.fn.jqmTransition = function( classes ) {
21-
console.log("jqmTransition( '"+classes+"')" );
22-
var $this = $( this ),
23-
fallbackTimeout = null,
24-
handler = function() {
25-
if ( fallbackTimeout ) {
26-
clearTimeout( fallbackTimeout );
12+
function css3TransitionHandler( name, reverse, $to, $from ) {
13+
14+
var deferred = new $.Deferred(),
15+
reverseClass = reverse ? " reverse" : "",
16+
viewportClass = "ui-mobile-viewport-transitioning viewport-" + name,
17+
$both = $to.add( $from ),
18+
doneTimer = 0;
19+
var doneFunc = function() {
20+
if ( doneTimer ) {
21+
clearTimeout( doneTimer );
22+
doneTimer = 0;
23+
}
24+
25+
if ( $from ) {
26+
$from.removeClass( $.mobile.activePageClass );
2727
}
28-
$this.removeClass( "animate " + classes );
28+
29+
$to.addClass( $.mobile.activePageClass );
30+
31+
$both.removeClass( "out in reverse animate " + name );
32+
33+
$to.parent().removeClass( viewportClass );
34+
35+
deferred.resolve( name, reverse, $to, $from );
2936
};
3037

31-
if ( $.support.cssTransitions ) {
32-
// add animate class to start animation
33-
$this.addClass( classes );
34-
setTimeout(function() {
35-
$this.addClass( "animate" );
36-
}, 25 );
37-
}
38-
return $this;
39-
};
40-
41-
function makeCss3TransitionHandler(isTwoMovingParts) {
42-
return function( name, reverse, $to, $from ) {
43-
var deferred = new $.Deferred(),
44-
reverseClass = reverse ? " reverse" : "",
45-
viewportClass = "ui-mobile-viewport-transitioning viewport-" + name,
46-
doneFunc = function() {
47-
console.log( name + reverseClass + ": doneFunc()" );
48-
$to.add( $from ).removeClass( "out in reverse " + name );
49-
if ( $from ) {
50-
$from.removeClass( $.mobile.activePageClass );
51-
}
52-
$to.parent().removeClass( viewportClass );
53-
54-
deferred.resolve( name, reverse, $to, $from );
55-
};
56-
57-
if ( !reverse ) {
58-
$to.transitionComplete( doneFunc );
59-
} else {
60-
$from.transitionComplete( doneFunc );
61-
}
38+
// Set up a callback on the to element so we know when it
39+
// is done transitioning. Some transitions don't actually
40+
// animate the to element, so we also fire a timer to manually
41+
// trigger our done callback .
6242

63-
$to.parent().addClass( viewportClass );
64-
if ( $from ) {
65-
$from.jqmTransition( name + " out" + reverseClass);
66-
}
67-
$to.addClass( $.mobile.activePageClass );
43+
$to.transitionComplete( doneFunc );
6844

69-
if ( isTwoMovingParts || !reverse ) {
70-
$to.jqmTransition( name + " in" + reverseClass);
45+
doneTimer = setTimeout(function() {
46+
if( $.support.cssTransitions ) {
47+
$to.unbind( "transitionend webkitTransitionEnd OTransitionEnd", doneFunc );
7148
}
49+
doneFunc();
50+
}, 1000);
51+
52+
$to.parent().addClass( viewportClass );
7253

73-
return deferred.promise();
54+
if ( $from ) {
55+
$from.addClass( name + " out" + reverseClass );
7456
}
57+
$to.addClass( name + " in" + reverseClass );
58+
59+
setTimeout(function(){
60+
$both.addClass("animate");
61+
}, 25);
62+
63+
return deferred.promise();
7564
}
7665

7766
// Make our transition handler public.
78-
$.mobile.css3TransitionHandler = makeCss3TransitionHandler();
67+
$.mobile.css3TransitionHandler = css3TransitionHandler;
7968

8069
// If the default transition handler is the 'none' handler, replace it with our handler.
8170
if ( $.mobile.defaultTransitionHandler === $.mobile.noneTransitionHandler ) {
82-
$.mobile.defaultTransitionHandler = $.mobile.css3TransitionHandler;
83-
}
84-
85-
// If the slide transition handler is the 'none' handler, replace it with our handler.
86-
if ( $.mobile.transitionHandlers.slide === $.mobile.noneTransitionHandler ) {
87-
$.mobile.transitionHandlers.slide = makeCss3TransitionHandler(true);
88-
}
89-
90-
// If the flip transition handler is the 'none' handler, replace it with our handler.
91-
if ( $.mobile.transitionHandlers.flip === $.mobile.noneTransitionHandler ) {
92-
$.mobile.transitionHandlers.flip = makeCss3TransitionHandler(true);
71+
$.mobile.defaultTransitionHandler = css3TransitionHandler;
9372
}
9473

9574
})( jQuery, this );

themes/default/jquery.mobile.transitions.css

Lines changed: 58 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,13 @@
2222
transition: 350ms ease-in-out;
2323
}
2424

25-
.in,
26-
.out.animate {
27-
z-index: 10;
28-
}
29-
30-
.out,
31-
.in.reverse.animate {
32-
z-index: 0;
25+
/* To avoid flashing, we need to make sure we toggle
26+
* the display/visibility of the page that is being
27+
* transitioned to at the same time we set its z-index.
28+
*/
29+
.ui-page.in {
30+
display: block;
31+
visibility: visible;
3332
}
3433

3534
.slide.animate,
@@ -41,6 +40,16 @@
4140
transition-property: transform;
4241
}
4342

43+
.slide.in,
44+
.slide.in.reverse {
45+
z-index: 10;
46+
}
47+
48+
.slide.out,
49+
.slide.out.reverse {
50+
z-index: 0;
51+
}
52+
4453
.slide.in,
4554
.slide.out.reverse.animate {
4655
-webkit-transform: translateX(100%);
@@ -51,8 +60,8 @@
5160

5261
.slide.in.animate,
5362
.slide.in.reverse.animate,
54-
.slide.out.reverse,
55-
.slide.out {
63+
.slide.out,
64+
.slide.out.reverse {
5665
-webkit-transform: translateX(0);
5766
-moz-transform: translateX(0);
5867
-o-transform: translateX(0);
@@ -64,10 +73,31 @@
6473
-webkit-transform: translateX(-100%);
6574
-moz-transform: translateX(-100%);
6675
-o-transform: translateX(-100%);
67-
transform: translateX(-100%);
76+
transform: translateX(-100%);
77+
}
78+
79+
.slidedown.in,
80+
.slidedown.out.reverse,
81+
.slideup.in,
82+
.slideup.out.reverse {
83+
z-index: 10;
6884
}
6985

7086
.slidedown.in.reverse,
87+
.slidedown.out,
88+
.slideup.in.reverse,
89+
.slideup.out {
90+
z-index: 0;
91+
}
92+
93+
.slidedown.in,
94+
.slidedown.out.reverse.animate {
95+
-webkit-transform: translateY(-100%);
96+
-moz-transform: translateY(-100%);
97+
-o-transform: translateY(-100%);
98+
transform: translateY(-100%);
99+
}
100+
71101
.slideup.in,
72102
.slideup.out.reverse.animate {
73103
-webkit-transform: translateY(100%);
@@ -77,26 +107,19 @@
77107
}
78108

79109
.slidedown.in.animate,
80-
.slidedown.in.reverse.animate,
110+
.slidedown.in.reverse,
81111
.slidedown.out,
112+
.slidedown.out.reverse,
82113
.slideup.in.animate,
83-
.slideup.in.reverse.animate,
84-
.slideup.out {
114+
.slideup.in.reverse,
115+
.slideup.out,
116+
.slideup.out.reverse {
85117
-webkit-transform: translateY(0);
86118
-moz-transform: translateY(0);
87119
-o-transform: translateY(0);
88120
transform: translateY(0);
89121
}
90122

91-
.slidedown.in,
92-
.slidedown.out.reverse.animate,
93-
.slideup.in.reverse {
94-
-webkit-transform: translateY(-100%);
95-
-moz-transform: translateY(-100%);
96-
-o-transform: translateY(-100%);
97-
transform: translateY(-100%);
98-
}
99-
100123
.fade.animate {
101124
-webkit-transition-property: opacity;
102125
-moz-transition-property: opacity;
@@ -162,6 +185,17 @@
162185
-webkit-transform: rotateY(-180deg) scale(.8);
163186
}
164187

188+
.pop.in,
189+
.pop.out.reverse {
190+
z-index: 10;
191+
}
192+
193+
.pop.in.reverse,
194+
.pop.out {
195+
z-index: 0;
196+
}
197+
198+
165199
.pop.animate {
166200
-webkit-transition-property: -webkit-transform, opacity;
167201
-moz-transition-property: -moz-transform, opacity;
@@ -183,17 +217,16 @@
183217
-o-transform: scale(.2);
184218
transform: scale(.2);
185219
opacity: 0;
186-
z-index: 10;
187220
}
188221

222+
.pop.in.reverse,
189223
.pop.in.animate,
190224
.pop.out.reverse{
191225
-webkit-transform: scale(1.0);
192226
-moz-transform: scale(1.0);
193227
-o-transform: scale(1.0);
194228
transform: scale(1.0);
195229
opacity: 1;
196-
z-index: 10;
197230
}
198231

199232
@-o-viewport {

0 commit comments

Comments
 (0)