Ответ 1
Конечно. Вот два способа.
Сначала вы можете использовать явный delay, который вы затем вычисляете с помощью selection.empty. пропустить пустые переходы. (Это лишь незначительная модификация того, что у вас уже есть.)
var div = d3.select("body").selectAll("div")
.data(["enter", "update"], function(d) { return d || this.textContent; });
// 2. update
div.transition()
.duration(duration)
.delay(!div.exit().empty() * duration)
.style("background", "orange");
// 3. enter
div.enter().append("div")
.text(function(d) { return d; })
.style("opacity", 0)
.transition()
.duration(duration)
.delay((!div.exit().empty() + !div.enter().empty()) * duration)
.style("background", "green")
.style("opacity", 1);
// 1. exit
div.exit()
.style("background", "red")
.transition()
.duration(duration)
.style("opacity", 0)
.remove();
http://bl.ocks.org/mbostock/5779682
Одна сложная вещь заключается в том, что вам нужно создать переход на элементах обновления, прежде чем создавать переход по входящим элементам; thats, потому что enter.append объединяет элементы ввода в выборку обновлений, и вы хотите сохранить их отдельно; подробнее см. Пример перехода только для обновления.
В качестве альтернативы вы можете использовать переход. переход в цепные переходы и transition.each, чтобы применить эти цепные переходы к существующим выборам. В контексте transition.each selection.transition наследует существующий переход, а не создает новый.
var div = d3.select("body").selectAll("div")
.data(["enter", "update"], function(d) { return d || this.textContent; });
// 1. exit
var exitTransition = d3.transition().duration(750).each(function() {
div.exit()
.style("background", "red")
.transition()
.style("opacity", 0)
.remove();
});
// 2. update
var updateTransition = exitTransition.transition().each(function() {
div.transition()
.style("background", "orange");
});
// 3. enter
var enterTransition = updateTransition.transition().each(function() {
div.enter().append("div")
.text(function(d) { return d; })
.style("opacity", 0)
.transition()
.style("background", "green")
.style("opacity", 1);
});
http://bl.ocks.org/mbostock/5779690
Я полагаю, что последнее немного более идиоматично, хотя и использует переход. Для применения переходов к выборам (а не для получения переходов с параметрами по умолчанию) не является широко известной функцией.