-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathscript.js
145 lines (103 loc) · 4.4 KB
/
script.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
136
137
138
139
140
141
142
143
144
145
/**
* Exemple 1 : on lance l'animation après le chargement de la page
*/
window.addEventListener('load', function () {
document.querySelector('#player-1').play()
})
/******************************************************************************/
/**
* Exemple 2 : on lance l'animation quand le player entre dans le viewport
*/
// Étape 1 : on enregistre la position du player au resize
// ça génère un repaint donc autant éviter de l'appeler
// à chaque événement scroll
window.addEventListener('resize', function () {
var player = document.querySelector('#player-2')
var bounding = player.getBoundingClientRect()
// On calcule le point à partir duquel l'élément rentre dans le viewport
// = La position y de l'élément dans la page (bounding.top)
// + la valeur scroll Y de la fenêtre (les valeurs de getBoundingClientRect() varient en fonction du scroll)
// - la hauteur du viewport pour que le point de départ soit situé en bas et pas en haut
var start = bounding.top + window.scrollY - window.innerHeight
// On calcule le point à partir duquel l'élément sort du viewport
// = la position de départ
// + la hauteur de l'élement
// + la hauteur du viewport
var end = start + player.clientHeight + window.innerHeight
// On enregistre ces valeurs dans les attributs de l'élément pour les utiliser plus tard
player.setAttribute('data-start', start)
player.setAttribute('data-end', end)
})
// Étape 2 : au scroll on vérifie si l'élément est dans ou hors du viewport
window.addEventListener('scroll', function (e) {
var player = document.querySelector('#player-2')
var start = Number(player.getAttribute('data-start'))
var end = Number(player.getAttribute('data-end'))
if (window.scrollY > start && window.scrollY < end) {
player.play()
} else {
player.stop()
}
})
/******************************************************************************/
/**
* Exemple 3 : on fait avancer l'animation au scroll en fonction de sa position dans le viewport
*/
// Étape 1 : même chose que pour l'exemple 2
window.addEventListener('resize', function () {
var player = document.querySelector('#player-3')
var bounding = player.getBoundingClientRect()
var start = bounding.top + window.scrollY - window.innerHeight
var end = start + player.clientHeight + window.innerHeight
player.setAttribute('data-start', start)
player.setAttribute('data-end', end)
})
// Étape 2 : au scroll on vérifie la position de l'élément dans le viewport.
// Quand il rentre en bas du viewport l'animation est à 0%,
// quand il sort en haut du viewport l'animation est à 100%
window.addEventListener('scroll', function (e) {
var player = document.querySelector('#player-3')
var start = Number(player.getAttribute('data-start'))
var end = Number(player.getAttribute('data-end'))
if (window.scrollY < start) {
// Le player est plus bas dans la page, l'animation est à 0%
var progress = 0
} else if (window.scrollY > end) {
// Le player est plus haut dans la page, l'animation est à 100%
progress = 1
} else {
// Le player est dans le viewport, on calcule l'avancement
progress = (window.scrollY - start) / (end - start)
}
// On positionne l'animation avec la valeur progress
player.seek(Math.round(progress * 100) + '%')
})
/******************************************************************************/
/**
* Exemple 4 : on lance/arrête l'animation quand on clique dessus
*/
window.addEventListener('load', function () {
document.querySelector('#player-4').addEventListener('click', e => {
var player = e.currentTarget
player.togglePlay()
})
})
/******************************************************************************/
/**
* Exemple 5 : on fait avancer l'animation en fonction de la position du curseur dans le viewport
*/
window.addEventListener('mousemove', function (e) {
var player = document.querySelector('#player-5')
// On calcule la position du curseur en x en %
var progress = e.clientX / window.innerWidth
// On positionne l'animation avec la valeur progress
player.seek(Math.round(progress * 100) + '%')
})
/******************************************************************************/
/**
* Global
*/
// On force un resize après le chargement de la page pour que les éléments soient bien initialisés
window.addEventListener('load', function () {
window.dispatchEvent(new Event('resize'))
})