Sto usando V3 della popolare libreria d3 e fondamentalmente voglio avere tre transizioni, seguite l'una dall'altra: La prima transizione dovrebbe essere applicata alla selezione dell'uscita, la seconda all'aggiornamento selezione e la terza alla selezione di invio. Dovrebbero essere concatenati in modo tale che quando una delle selezioni è vuota, la relativa transizione venga saltata. Cioè quando non c'è una selezione di uscita, la selezione dell'aggiornamento dovrebbe iniziare immediatamente. Finora, ho creato questo codice (usando la funzione delay
).d3: Come concatenare correttamente le transizioni su selezioni diverse
// DATA JOIN
var items = d3.select('#data').selectAll('.item');
items = items.data(data, function(d){
return d.twitter_screenname;
});
// EXIT
items.exit().transition().duration(TRANSITION_DURATION).style('opacity', 0).remove();
// UPDATE
// Divs bewegen
items.transition().duration(TRANSITION_DURATION).delay(TRANSITION_DURATION * 1)
.style('left', function(d, i) {
return positions[i].left + "px";
}).style('top', function(d, i) {
return positions[i].top + "px";
});
// ENTER
// Divs hinzufügen
var div = items.enter().append('div')
.attr('class', 'item')
.style('left', function(d, i) {
return positions[i].left + "px";
}).style('top', function(d, i) {
return positions[i].top + "px";
});
div.style('opacity', 0)
.transition().duration(TRANSITION_DURATION).delay(TRANSITION_DURATION * 2)
.style('opacity', 1);
Innanzitutto non permette di "saltare" transizioni e secondariamente Credo ci sia un modo migliore di delay
. Ho guardato allo http://bl.ocks.org/mbostock/3903818 ma non ho davvero capito cosa sta succedendo.
Inoltre, in qualche modo la scrittura items.exit().transition().duration(TRANSITION_DURATION).remove()
non funziona con lo items
, probabilmente perché non sono elementi SVG ma div
s.
Correggetemi se ho torto, ma penso che ci sia un piccolo errore nel codice usando 'delay()' -Method. Quando non c'è transizione di aggiornamento (cioè nessun elemento cambia luogo), 'items.enter(). Empty()' equivale ancora a 'false', quindi elemens exit, quindi, per' duration' millisecondi non accade nulla, e quindi la transizione di invio inizia. Ma se non avviene alcuna transizione di aggiornamento visivo, voglio che la transizione di uscita sia seguita * immediatamente * dalla transizione di invio. Così salverò la transizione di aggiornamento come segue: – wnstnsmth
'var updatedItems = div.transition() . Durata (durata) .delay (! Div.exit(). Empty() * durata)' e cambia '.delay ((! div.exit(). empty() +! div.enter(). empty()) * duration) 'in' .delay ((! div.exit(). empty() +! updatedItems.empty()) * durata) '. In questo modo funziona come richiesto. – wnstnsmth