-
Notifications
You must be signed in to change notification settings - Fork 2
/
jquery.revealer.js
123 lines (104 loc) · 2.92 KB
/
jquery.revealer.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
/*!
* Revealer 3.0.0
*
* Copyright 2021, Pixel Union - http://pixelunion.net
* Released under the MIT license
*/
(function($){
// check for trend event (make sure jquery.trend is included)
if (typeof $.event.special.trend !== "object") {
console.warn("Please make sure jquery.trend is included! Otherwise revealer won't work.");
}
// Simple requestAnimationFrame polyfill
var raf = window.requestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.webkitRequestAnimationFrame ||
function(fn) { window.setTimeout(fn, 1000/60); }
// Public API
var methods = {
isVisible: function(el) {
return !!el.data("revealer-visible");
},
show: function(el, force) {
// Check state
if (methods.isVisible(el)) {
el.removeClass("animating animating-in");
el.off("revealer-animating revealer-show");
return;
}
// Remove previous event listeners
el.data("revealer-visible", true);
el.off("trend");
if (force) {
el.addClass("visible");
raf(function(){
el.trigger("revealer-animating");
el.trigger("revealer-show");
});
return;
}
raf(function(){
// Start animation state transition
el.addClass("animating animating-in");
el.trigger("revealer-animating");
raf(function(){
el.addClass("visible");
el.one("trend", function(){
el.removeClass("animating animating-in");
el.trigger("revealer-show");
});
});
});
},
hide: function(el, force) {
// Check state
if (!methods.isVisible(el)) {
el.removeClass("animating animating-out visible");
el.off("revealer-animating revealer-hide");
return;
}
// Remove previous event listeners
el.data("revealer-visible", false);
el.off("trend");
if (force) {
el.removeClass("visible");
raf(function(){
el.trigger("revealer-animating");
el.trigger("revealer-hide");
});
return;
}
raf(function(){
el.addClass("animating animating-out");
el.trigger("revealer-animating");
raf(function(){
el.removeClass("visible");
el.one("trend", function(){
el.removeClass("animating animating-in animating-out");
el.trigger("revealer-hide");
});
});
});
},
toggle: function(el, force) {
if (methods.isVisible(el)) {
methods.hide(el, force);
} else {
methods.show(el, force);
}
}
};
// jQuery plugin
$.fn.revealer = function(method, force) {
// Get action
var action = methods[method || "toggle"];
if (!action) return this;
// Run action
if (method === "isVisible") {
return action(this);
}
return this.each(function(){
action($(this), force);
});
};
})(jQuery);