Stroke-dasharray 在多条路径上补间
Stroke-dasharray tween on multiple paths
我正在地图上投影多条线路径,并希望在它们上使用 stroke-dash interpolation 来显示路径移动。
我想在所有路径上使用相同的 Tween 函数,但似乎 Tween 为每个路径返回相同的值。所有的线条似乎都很好;只有 Tween 导致了一些问题。
它导致了这个问题,其中路径显示 stroke-dashes:
它应该如下所示:
我的线条是使用以下标准流程为传单 x/y 转换投影的:
var svg = d3.select(map.getPanes().overlayPane).append("svg");
var g = svg.append("g").attr("class", "leaflet-zoom-hide");
var transform = d3.geo.transform({
point: projectPoint
});
var d3path = d3.geo.path().projection(transform);
var toLine = d3.svg.line()
.interpolate("linear")
.x(function(d,i) {
return applyLatLngToLayer(d).x
})
.y(function(d,i) {
return applyLatLngToLayer(d).y
});
g.selectAll(".lineConnect").remove();
var linePath = g.selectAll(".lineConnect")
.data(series)
.enter()
.append("path")
.attr("class", "lineConnect")
linePath.attr("d", toLine)
在这里您可以看到调用 Tween 的函数:
function transition() {
linePath.transition()
.duration(700).attrTween("stroke-dasharray", tweenDash);
}
function tweenDash() {
return function(t) {
var l = linePath.node().getTotalLength();
interpolate = d3.interpolateString("0," + l, l + "," + l);
return interpolate(t);
}
}
您的代码假设您在选择中只有一个元素 (linePath.node()
) -- 您只获得第一个元素的长度。例如,您可以使用 .each()
使其适用于每一行:
function transition() {
d3.select(this).transition()
.duration(700).attrTween("stroke-dasharray", tweenDash);
}
function tweenDash() {
var that = this;
return function(t) {
var l = that.getTotalLength();
interpolate = d3.interpolateString("0," + l, l + "," + l);
return interpolate(t);
}
}
linePath.each(transition);
我正在地图上投影多条线路径,并希望在它们上使用 stroke-dash interpolation 来显示路径移动。
我想在所有路径上使用相同的 Tween 函数,但似乎 Tween 为每个路径返回相同的值。所有的线条似乎都很好;只有 Tween 导致了一些问题。
它导致了这个问题,其中路径显示 stroke-dashes:
它应该如下所示:
我的线条是使用以下标准流程为传单 x/y 转换投影的:
var svg = d3.select(map.getPanes().overlayPane).append("svg");
var g = svg.append("g").attr("class", "leaflet-zoom-hide");
var transform = d3.geo.transform({
point: projectPoint
});
var d3path = d3.geo.path().projection(transform);
var toLine = d3.svg.line()
.interpolate("linear")
.x(function(d,i) {
return applyLatLngToLayer(d).x
})
.y(function(d,i) {
return applyLatLngToLayer(d).y
});
g.selectAll(".lineConnect").remove();
var linePath = g.selectAll(".lineConnect")
.data(series)
.enter()
.append("path")
.attr("class", "lineConnect")
linePath.attr("d", toLine)
在这里您可以看到调用 Tween 的函数:
function transition() {
linePath.transition()
.duration(700).attrTween("stroke-dasharray", tweenDash);
}
function tweenDash() {
return function(t) {
var l = linePath.node().getTotalLength();
interpolate = d3.interpolateString("0," + l, l + "," + l);
return interpolate(t);
}
}
您的代码假设您在选择中只有一个元素 (linePath.node()
) -- 您只获得第一个元素的长度。例如,您可以使用 .each()
使其适用于每一行:
function transition() {
d3.select(this).transition()
.duration(700).attrTween("stroke-dasharray", tweenDash);
}
function tweenDash() {
var that = this;
return function(t) {
var l = that.getTotalLength();
interpolate = d3.interpolateString("0," + l, l + "," + l);
return interpolate(t);
}
}
linePath.each(transition);