Невозможно медленно увеличивать трассы с помощью D3
Используя графическую библиотеку d3, я не могу заставить трассы медленно рисовать, чтобы их можно было увидеть.
Этот сайт имеет прекрасный пример в разделе "Линейный график (Unrolling)", но для этого раздела не указан код. Может кто-нибудь, пожалуйста, помогите мне с строками кода D3, которые могли бы сделать это?
Когда я пытаюсь задержать задержку() или длительность(), например, в следующем фрагменте кода, путь все равно обращается сразу, а весь код SVG после этого сегмента не отображается.
var mpath = svg.append ('path');
mpath.attr ('d', 'M35 48 L22 48 L22 35 L22 22 L35 22 L35 35 L48 35 L48 48')
.attr ('fill', 'none')
.attr ('stroke', 'blue')
.duration (1000);
Ответы
Ответ 1
Я считаю, что "способ D3" - это настраиваемая функция твинов. Здесь вы можете увидеть рабочую реализацию: http://jsfiddle.net/nrabinowitz/XytnD/
Это предполагает, что для расчета пути у вас есть генератор с именем line
с d3.svg.line
:
// add element and transition in
var path = svg.append('path')
.attr('class', 'line')
.attr('d', line(data[0]))
.transition()
.duration(1000)
.attrTween('d', pathTween);
function pathTween() {
var interpolate = d3.scale.quantile()
.domain([0,1])
.range(d3.range(1, data.length + 1));
return function(t) {
return line(data.slice(0, interpolate(t)));
};
}
Здесь функция pathTween
возвращает интерполятор, который принимает заданный срез строки, определяемый тем, насколько далеко мы проходим через переход, и соответственно обновляет путь.
Однако стоит заметить, что я подозреваю, что вы получите лучшую производительность и более плавную анимацию, взяв простой маршрут: поместите белый прямоугольник (если ваш фон прост) или clipPath
(если ваш фон сложный ) над линией и переместите ее вправо, чтобы открыть линию внизу.
Ответ 2
Обычный шаблон, когда анимация строк в svg устанавливает stroke-dasharray
длины пути, а затем анимирует stroke-dashoffset
:
var totalLength = path.node().getTotalLength();
path
.attr("stroke-dasharray", totalLength + " " + totalLength)
.attr("stroke-dashoffset", totalLength)
.transition()
.duration(2000)
.ease("linear")
.attr("stroke-dashoffset", 0);
Здесь вы можете увидеть демо:
http://bl.ocks.org/4063326
Ответ 3
На основании сообщения, на которое вы ссылаетесь, я придумал следующий пример:
var i = 0,
svg = d3.select("#main");
String.prototype.repeat = function(times) {
return (new Array(times + 1)).join(this);
}
segments = [{x:35, y: 48}, {x: 22, y: 48}, {x: 22, y: 35}, {x: 34, y:35}, {x: 34, y:60}];
line = "M"+segments[0].x + " " + segments[0].y
new_line = line + (" L" + segments[0].x + " " + segments[0].y).repeat(segments.length);
var mpath = svg.append ('path').attr ('d',new_line )
.attr ('fill', 'none')
.attr ('stroke', 'blue')
for (i=0; i<segments.length; i++)
{
new_segment = " " + "L"+segments[i].x + " " + segments[i].y
new_line = line + new_segment.repeat(segments.length-i)
mpath.transition().attr('d',new_line).duration(1000).delay(i*1000);
line = line + new_segment
}
Это немного уродливо, но работает. Вы можете увидеть его на jsFiddle