Je suis en train d'utiliser la bibliothèque javascript scrollama pour écrire un article "scrollytelling" qui implique la transition des graphiques D3 dans et hors de la vue lorsque l'utilisateur fait défiler. Cela fonctionne principalement, mais les graphiques s'accumulent les uns sur les autres si je fais défiler trop rapidement.
Voici un jsfiddle basé sur cet exemple par l'auteur de scrollama. Dans mon exemple, les points colorés devraient apparaître un par un. Si vous faites défiler rapidement jusqu'à la fin, les points intermittents ne devraient pas apparaître. Les extraits suivants montrent comment j'ai configuré les transitions :
Je définis quelques fonctions qui créent mes "graphiques", puis je les appelle.
var makeCircle0 = function(){
g.append("circle")
.attr("cx", 50)
.attr("cy", 100)
.attr("r", 20)
.attr("fill", "red")
.attr("class", "redcircle")
g.selectAll(".redcircle")
.attr("opacity", 0)
}
makeCircle0();
// Faire la même chose pour makeCircle1, 2 et 3, également.
Ensuite, je crée des fonctions pour gérer les transitions. Celle-ci dit de faire apparaître le cercle rouge et de mettre les autres cercles à une opacité de 0. Je fais ça pour tous les cercles/étapes.
var showCircle0 = function(){
g.selectAll(".redcircle")
.transition()
.duration(1000)
.attr("opacity", 1)
g.selectAll(".yellowcircle").attr("opacity", 0)
g.selectAll(".greencircle").attr("opacity", 0)
g.selectAll(".bluecircle").attr("opacity", 0)
}
Cette section crée un tableau de mes fonctions de transition afin que je puisse les appeler à des étapes spécifiques de la page lorsque vous faites défiler. C'est similaire à la façon dont Jim Vallandingham a géré son défilement.
var activateFunctions = [];
activateFunctions[0] = showCircle0;
activateFunctions[1] = showCircle1;
activateFunctions[2] = showCircle2;
activateFunctions[3] = showCircle3;
Enfin, cela appelle la fonction désirée à la bonne étape de la page. Ce qui se produit... mais sans arrêter les autres transitions déclenchées à une étape précédente, ce qui entraîne l'apparition de plusieurs points à divers stades.
function handleStepEnter(response) {
step.classed('is-active', function (d, i) {
return i === response.index;
})
figure.call(activateFunctions[response.index])
}
Comment puis-je éviter cela ?