Animation d3 js中动画直线和圆的剪辑路径
如何沿路径剪裁动画直线和圆 例如,我也尝试过剪裁圆和点 我添加了以下代码:Animation d3 js中动画直线和圆的剪辑路径,animation,d3.js,line,geometry,clip-path,Animation,D3.js,Line,Geometry,Clip Path,如何沿路径剪裁动画直线和圆 例如,我也尝试过剪裁圆和点 我添加了以下代码: svg.append("defs") .append("clipPath") .attr("id", "clip") .append("rect") .attr("width", 960/2) .attr("height", 500/2); 并添加了定义圆和路径的以下部分 .attr('clip-pa
svg.append("defs")
.append("clipPath")
.attr("id", "clip")
.append("rect")
.attr("width", 960/2)
.attr("height", 500/2);
并添加了定义圆和路径的以下部分
.attr('clip-path', 'url(#clip)')
剪裁对路径的效果很好,但对圆和线的效果不同
我在这里
如何添加剪辑路径,使其仅在路径的可见/剪辑部分显示圆和线
注意:需要对沿多条路径移动的多个圆和线应用剪裁。这是因为您在圆上使用变换:圆的剪裁路径也被变换,这意味着它是相对于圆的。随着圆的移动,剪辑路径也随之移动。当圆相对于其变换居中于0,0时(变换随着圆的移动而变化,而不是居中属性),剪辑路径将其切割为四分之一圆(当它通过0,0时) 一种解决方案是使用cx和cy属性来定位圆。更快的选择是将路径、直线、圆和点附加到A
g
并剪裁g,剪裁过程中的所有子项:
var g = svg.append("g")
.attr("clip-path", "url(#clip)")
var path = g.append("path")
.data([points])
.attr("d", d3.svg.line()
.tension(0) // Catmull–Rom
.interpolate("cardinal-closed"));
g.selectAll(".point")
.data(points)
.enter()
.append("circle")
.attr("r", 4)
.attr("transform", function(d) { return "translate(" + d + ")"; });
circle = g.append("circle")
.attr("r", 13)
.attr("transform", "translate(" + points[0] + ")");
line = g.append("line")
.attr("y1", -50)
.attr("y2", 50)
.attr("class", "x-hover-line hover-line")
.attr("transform", "translate(" + points[0] + ")");
更新代码:
var点=[
[480, 200],
[580, 400],
[680, 100],
[780, 300],
[180, 300],
[280, 100],
[380, 400]
];
var svg=d3.选择(“正文”).追加(“svg”)
.attr(“宽度”,960)
.attr(“高度”,500);
svg.append(“defs”)
.append(“clipPath”)
.attr(“id”、“剪辑”)
.append(“rect”)
.attr(“宽度”,960/2)
.attr(“高度”,500/2);
var g=svg.append(“g”)
.attr(“剪辑路径”、“url(#剪辑)”)
var path=g.append(“路径”)
.数据([点])
.attr(“d”,d3.svg.line()
.张力(0)//Catmull–Rom
.插入(“基数闭合”);
g、 选择全部(“.point”)
.数据(点数)
.输入()
.附加(“圆圈”)
.attr(“r”,4)
.attr(“transform”,函数(d){return“translate”(+d+)”);});
圆圈=g.附加(“圆圈”)
.attr(“r”,13)
.attr(“转换”、“平移”(+点[0]+));
行=g.append(“行”)
.attr(“y1”,-50)
.attr(“y2”,50)
.attr(“类”、“x悬停线悬停线”)
.attr(“转换”、“平移”(+点[0]+));
过渡();
函数转换(){
圆。过渡()
.持续时间(10000)
.attrween(“转换”,translateLong(path.node())
.每个(“结束”,过渡);
行。转换()
.持续时间(10000)
.attrween(“转换”,translateLong(path.node())
.每个(“结束”,过渡);
}
//返回用于沿指定路径元素进行转换的属性。
函数translateLong(路径){
var l=path.getTotalLength();
返回函数(d,i,a){
返回函数(t){
var p=path.getPointAtLength(t*l);
返回“translate”(“+p.x+”,“+p.y+”);
};
};
}
路径{
填充:无;
行程:#000;
笔画宽度:3px;
}
圈{
填充:钢蓝;
冲程:#fff;
笔画宽度:3px;
}
.悬停线{
/*冲程:#6F257F*/
行程:#140917;
笔划宽度:2.5px;
/*笔划数组:3,3*/
}
.悬停文本{
字体大小:22px;
字体大小:粗体;
}
谢谢您的清晰解释。在我的图形的左下方有轴文本。所以,我使用了不同的父g,它工作得非常好。