Переход простого текста приведет только к тому, что конечное значение будет отображаться в начале перехода (после любой задержки):
Для каждого выбранного элемента, для текстового содержимого устанавливается указанное целевое значение при переходеначинается..... Текст по умолчанию не интерполируется, потому что это обычно нежелательно.( документы ).
Вот пример этого на работе:
var svg = d3.select("body")
.append("svg");
var text = svg.append("text")
.attr("x", 50)
.attr("y", 50)
.text(1);
text.transition()
.text(1000)
.duration(1000)
.delay(1000);
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.10.0/d3.min.js"></script>
Однако вы можете интерполировать текст, наиболее каноническим методом будет использование transition.tween()
( документация ).Хотя вы можете использовать .attrTween или даже d3-таймер.Есть также несколько других вариантов, но они не так просты.
Подросток принимает два аргумента.Первый аргумент - это имя изменяемого свойства.Второй аргумент - это значение анимации, которое возвращает функцию в виде:
return function(t) { interpolator(t); })
, где t
- это число от 0 до 1, представляющее ход перехода (0 = начало, 1 = конец)и интерполятор - это некоторая функция для интерполяции значения перехода для любой точки перехода.С d3 это может быть d3-интерполятор.
var svg = d3.select("body")
.append("svg");
var text = svg.append("text")
.attr("x", 50)
.attr("y", 50)
.text(1);
text.transition()
.tween("text", function() {
var selection = d3.select(this); // selection of node being transitioned
var start = d3.select(this).text(); // start value prior to transition
var end = 1000; // specified end value
var interpolator = d3.interpolateNumber(start,end); // d3 interpolator
return function(t) { selection.text(Math.round(interpolator(t))); }; // return value
})
.duration(10000);
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.11.0/d3.min.js"></script>
Я только что использовал округление, чтобы сохранить форматированное число, в противном случае десятичные точки становятся довольно неприятными.Вы всегда можете применить фактическое форматирование.