forked from jlmakes/scrollreveal
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathanimate.js
More file actions
82 lines (70 loc) · 2.31 KB
/
animate.js
File metadata and controls
82 lines (70 loc) · 2.31 KB
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
import { applyStyle } from '../functions/style'
import clean from '../methods/clean'
export default function animate(element, force = {}) {
const pristine = force.pristine || this.pristine
const delayed =
element.config.useDelay === 'always' ||
(element.config.useDelay === 'onload' && pristine) ||
(element.config.useDelay === 'once' && !element.seen)
const shouldReveal = element.visible && !element.revealed
const shouldReset = !element.visible && element.revealed && element.config.reset
if (force.reveal || shouldReveal) {
return triggerReveal.call(this, element, delayed)
}
if (force.reset || shouldReset) {
return triggerReset.call(this, element)
}
}
function triggerReveal(element, delayed) {
const styles = [
element.styles.inline.generated,
element.styles.opacity.computed,
element.styles.transform.generated.final
]
if (delayed) {
styles.push(element.styles.transition.generated.delayed)
} else {
styles.push(element.styles.transition.generated.instant)
}
element.revealed = element.seen = true
applyStyle(element.node, styles.filter((s) => s !== '').join(' '))
registerCallbacks.call(this, element, delayed)
}
function triggerReset(element) {
const styles = [
element.styles.inline.generated,
element.styles.opacity.generated,
element.styles.transform.generated.initial,
element.styles.transition.generated.instant
]
element.revealed = false
applyStyle(element.node, styles.filter((s) => s !== '').join(' '))
registerCallbacks.call(this, element)
}
function registerCallbacks(element, isDelayed) {
const duration = isDelayed
? element.config.duration + element.config.delay
: element.config.duration
const beforeCallback = element.revealed
? element.config.beforeReveal
: element.config.beforeReset
const afterCallback = element.revealed
? element.config.afterReveal
: element.config.afterReset
let elapsed = 0
if (element.callbackTimer) {
elapsed = Date.now() - element.callbackTimer.start
window.clearTimeout(element.callbackTimer.clock)
}
beforeCallback(element.node)
element.callbackTimer = {
start: Date.now(),
clock: window.setTimeout(() => {
afterCallback(element.node)
element.callbackTimer = null
if (element.revealed && !element.config.reset && element.config.cleanup) {
clean.call(this, element.node)
}
}, duration - elapsed)
}
}