Javascript 是否有可能将一个可以用d3(jquery)移动的图像切割成某种形状
我正在创建一个气泡图,问题是我希望在气泡内添加一些图像 我正在使用以下代码: 我想要一个更大的圆(大约20px的半径),我想要一个填充圆的图像和一个黑色的笔划(圆) 到现在为止,我有一个过滤器,里面有一个过滤圆的feImage。问题是图像移动正确,但仍然是正方形 我尝试添加一个内部有一个圆的,但是当我应用剪辑时,svg剪辑的区域是固定的(我可以看到图像在它后面移动) 我怎样才能解决这个问题Javascript 是否有可能将一个可以用d3(jquery)移动的图像切割成某种形状,javascript,css,svg,d3.js,svg-filters,Javascript,Css,Svg,D3.js,Svg Filters,我正在创建一个气泡图,问题是我希望在气泡内添加一些图像 我正在使用以下代码: 我想要一个更大的圆(大约20px的半径),我想要一个填充圆的图像和一个黑色的笔划(圆) 到现在为止,我有一个过滤器,里面有一个过滤圆的feImage。问题是图像移动正确,但仍然是正方形 我尝试添加一个内部有一个圆的,但是当我应用剪辑时,svg剪辑的区域是固定的(我可以看到图像在它后面移动) 我怎样才能解决这个问题 这是d3代码的结果,然后与filter=“url(#Myriel)”一起使用 现在我正在使用它,但不起
这是d3代码的结果,然后与filter=“url(#Myriel)”一起使用
现在我正在使用它,但不起作用:
<filter id="Myriel" x="0%" y="0%" width="100%" height="100%">
<feImage xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="img/vangogh.jpg" result="img1">
</feImage>
<circle r="15" result="circ"></circle>
<feComposite operator="atop" in="img1" in2="circ"></feComposite>
</filter>
您可以使用feComposite原语和operator=“in”将图像剪裁到过滤器内的形状。谷歌的许多例子,或张贴您的过滤代码,我会为您添加它 更新: 好的,那么您的过滤器将无法工作,因为过滤器只能包含过滤器原语。您可以通过引用SourceGraphic在过滤器中使用形状,SourceGraphic将引入过滤器引用的元素,或者使用feImage通过引用引入另一个形状。后者在IE中有点缺陷,所以对于跨浏览器,我推荐前者。下面是执行此操作的过滤器 请注意,有很多方法可以将剪辑和大纲结合起来。这是通过使用“绿色屏幕”技术实现的——我们对剪辑使用红色填充,但最终使用颜色矩阵将其去除。实际上,我建议使用白色填充和feBlend,这会产生更好的视觉效果(IMHO)。两个结果如下 还要注意,我去掉了过滤器上的维度。浏览器通常不会在其过滤维度计算中包含笔划宽度,因此如果使用0%、100%,则会剪裁笔划
您可以使用feComposite原语和operator=“in”将图像剪裁到过滤器内的形状。谷歌的许多例子,或张贴您的过滤代码,我会为您添加它 更新: 好的,那么您的过滤器将无法工作,因为过滤器只能包含过滤器原语。您可以通过引用SourceGraphic在过滤器中使用形状,SourceGraphic将引入过滤器引用的元素,或者使用feImage通过引用引入另一个形状。后者在IE中有点缺陷,所以对于跨浏览器,我推荐前者。下面是执行此操作的过滤器 请注意,有很多方法可以将剪辑和大纲结合起来。这是通过使用“绿色屏幕”技术实现的——我们对剪辑使用红色填充,但最终使用颜色矩阵将其去除。实际上,我建议使用白色填充和feBlend,这会产生更好的视觉效果(IMHO)。两个结果如下 还要注意,我去掉了过滤器上的维度。浏览器通常不会在其过滤维度计算中包含笔划宽度,因此如果使用0%、100%,则会剪裁笔划
您可以使用feComposite原语和operator=“in”将图像剪裁到过滤器内的形状。谷歌的许多例子,或张贴您的过滤代码,我会为您添加它 更新: 好的,那么您的过滤器将无法工作,因为过滤器只能包含过滤器原语。您可以通过引用SourceGraphic在过滤器中使用形状,SourceGraphic将引入过滤器引用的元素,或者使用feImage通过引用引入另一个形状。后者在IE中有点缺陷,所以对于跨浏览器,我推荐前者。下面是执行此操作的过滤器 请注意,有很多方法可以将剪辑和大纲结合起来。这是通过使用“绿色屏幕”技术实现的——我们对剪辑使用红色填充,但最终使用颜色矩阵将其去除。实际上,我建议使用白色填充和feBlend,这会产生更好的视觉效果(IMHO)。两个结果如下 还要注意,我去掉了过滤器上的维度。浏览器通常不会在其过滤维度计算中包含笔划宽度,因此如果使用0%、100%,则会剪裁笔划
您可以使用feComposite原语和operator=“in”将图像剪裁到过滤器内的形状。谷歌的许多例子,或张贴您的过滤代码,我会为您添加它 更新: 好的,那么您的过滤器将无法工作,因为过滤器只能包含过滤器原语。您可以通过引用SourceGraphic在过滤器中使用形状,SourceGraphic将引入过滤器引用的元素,或者使用feImage通过引用引入另一个形状。后者在IE中有点缺陷,所以对于跨浏览器,我推荐前者。下面是执行此操作的过滤器 请注意,有很多方法可以将剪辑和大纲结合起来。这是通过使用“绿色屏幕”技术实现的——我们对剪辑使用红色填充,但最终使用颜色矩阵将其去除。实际上,我建议使用白色填充和feBlend,这会产生更好的视觉效果(IMHO)。两个结果如下 还要注意,我去掉了过滤器上的维度。浏览器通常不会在其过滤维度计算中包含笔划宽度,因此如果使用0%、100%,则会剪裁笔划
您可以使用svg
clippath
完成相同的任务
node.append("circle")
.attr("r", function(d) {
return d.radius + 2;
})
.style("fill", function(d) {
return color(1 / d.rating);
});
node.append("clipPath")
.attr('id', function(d, i) {
return "clip" + i
})
.append("circle")
.attr("class", "clip-path")
.attr("r", function(d) {
return d.radius;
})
.style("fill", function(d) {
return color(1 / d.rating);
});
node.append("svg:image")
.attr("class", "circle")
.attr("xlink:href", "https://c1.staticflickr.com/9/8086/8466271529_dc5c0a958f.jpg")
.attr("clip-path", function(d, i) {
return "url(#clip" + i + ")"
})
.attr("x", function(d) {
return -d.radius;
})
.attr("y", function(d) {
return -d.radius;
})
.attr("width", function(d) {
return d.radius * 2;
})
.attr("height", function(d) {
return d.radius * 2;
});
我也做了同样的决定。希望这有帮助。您可以使用svg
clippath
完成相同的任务
node.append("circle")
.attr("r", function(d) {
return d.radius + 2;
})
.style("fill", function(d) {
return color(1 / d.rating);
});
node.append("clipPath")
.attr('id', function(d, i) {
return "clip" + i
})
.append("circle")
.attr("class", "clip-path")
.attr("r", function(d) {
return d.radius;
})
.style("fill", function(d) {
return color(1 / d.rating);
});
node.append("svg:image")
.attr("class", "circle")
.attr("xlink:href", "https://c1.staticflickr.com/9/8086/8466271529_dc5c0a958f.jpg")
.attr("clip-path", function(d, i) {
return "url(#clip" + i + ")"
})
.attr("x", function(d) {
return -d.radius;
})
.attr("y", function(d) {
return -d.radius;
})
.attr("width", function(d) {
return d.radius * 2;
})
.attr("height", function(d) {
return d.radius * 2;
});
我也做了同样的决定。希望这对你有所帮助。你可以完成同样的任务