私は普及しているd3ライブラリのV3を使用していますが、基本的に3つのトランジションを続けておきます。最初のトランジションは終了セレクションに適用し、 3番目は入力選択になります。それらの選択肢の1つが空である場合、それぞれの遷移はスキップされるように連鎖されるべきです。私。出口選択がない場合、更新選択はすぐに開始されます。これまでのところ、このコードを用意しました(delay
関数を使用しています)。d3:さまざまな選択肢で適切にトランジションを連鎖させるには
// 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);
それが遷移し、第二に、私はdelay
より良い方法があると思いますが、「スキップ」することはできません。まず第一に。私はhttp://bl.ocks.org/mbostock/3903818を見ましたが、何が起こっているのか本当に理解していませんでした。
また、items.exit().transition().duration(TRANSITION_DURATION).remove()
を書いているだけでは、items
では機能しません。おそらくSVG要素ではなくdiv
です。
私が間違っている場合は私を修正してください。しかし、私はあなたのコードに 'delay()'メソッドを使って小さなエラーがあると思います。更新遷移がない場合(つまり要素が変更されない場合)、 'items.enter()。empty()'は 'false'に等しいので、elemensは終了し、' duration'ミリ秒は何も起こりません。開始する。しかし、視覚的な更新の遷移が起こっていない場合、私はenter transitionに続いてexit transition *に直ちに従います。このようにして、更新遷移を以下のように保存します: – wnstnsmth
'var updatedItems = div.transition() .duration(継続時間) .delay(!div.exit()。空()* duration)'と.delay( !()!div.exit()。empty()+!div.enter()。empty())* duration) '.delay((!div.exit()。empty()+!updatedItems.empty *期間) '。このようにして、必要に応じて動作します。 – wnstnsmth