-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathAnimationChain.js
135 lines (104 loc) · 3.8 KB
/
AnimationChain.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
(function ($) {
function animationChainImpl(animationElement) {
var steps = [];
var stepIndex = 0;
var fireNextStep = false;
var running = false;
var compatDelay = 1000;
// Execute the next item in the chain
var nextStep = function () {
setTimeout(function () {
if (steps.length == 0)
return;
if (stepIndex >= steps.length)
return;
steps[stepIndex]();
stepIndex++;
if (fireNextStep) {
fireNextStep = false;
nextStep();
}
}, 0);
};
// Sets the delay used by browsers that doesn't support transitions
this.setCompatibilityDelay = function (delay) {
compatDelay = delay;
};
// Executes the function passed in and passes the parameter object to it on execution.
this.execute = function (func, parmObject) {
steps.push(function () {
func(parmObject);
fireNextStep = true;
});
return this;
};
// Delays the chain execution by the spcified time in milliseconds.
this.delay = function (delay) {
steps.push(function () {
setTimeout(function () {
nextStep();
}, delay);
});
return this;
};
// Adds a class to the element and waits for the transition to complete. Set wait = false to not wait.
this.addClass = function (className, wait) {
steps.push(function () {
if (wait == false) {
fireNextStep = true;
} else {
bindTransitionEnd();
}
animationElement.addClass(className);
});
return this;
};
// Removes a class from the element and waits for the transition to complete. Set wait = false to not wait.
this.removeClass = function (className, wait) {
steps.push(function () {
if (wait == false) {
fireNextStep = true;
} else {
bindTransitionEnd();
}
animationElement.removeClass(className);
});
return this;
};
// Starts the animation chain.
this.start = function () {
if (!running) {
running = true;
nextStep();
}
};
var bindTransitionEnd = function () {
if (!Modernizr.csstransitions) {
setTimeout(function () {
nextStep();
}, compatDelay);
return;
}
animationElement.on(transitionedEventName, function () {
animationElement.off(transitionedEventName);
nextStep();
});
};
var getTransitionedEventName = function () {
var eventName = 'ontransitionend';
var el = $("<div />").get(0);
var isSupported = (eventName in el);
if (!isSupported) {
el.setAttribute(eventName, 'return;');
isSupported = typeof el[eventName] == 'function';
}
el = null;
return isSupported ? "transitionend" : "webkitTransitionEnd";
};
var transitionedEventName = getTransitionedEventName();
}
$.fn.animationChain = function () {
return new animationChainImpl(this);
};
$.animationChain = $.fn.animationChain;
})(jQuery);