Javascript 是否有可能将一个可以用d3(jquery)移动的图像切割成某种形状

Javascript 是否有可能将一个可以用d3(jquery)移动的图像切割成某种形状,javascript,css,svg,d3.js,svg-filters,Javascript,Css,Svg,D3.js,Svg Filters,我正在创建一个气泡图,问题是我希望在气泡内添加一些图像 我正在使用以下代码: 我想要一个更大的圆(大约20px的半径),我想要一个填充圆的图像和一个黑色的笔划(圆) 到现在为止,我有一个过滤器,里面有一个过滤圆的feImage。问题是图像移动正确,但仍然是正方形 我尝试添加一个内部有一个圆的,但是当我应用剪辑时,svg剪辑的区域是固定的(我可以看到图像在它后面移动) 我怎样才能解决这个问题 这是d3代码的结果,然后与filter=“url(#Myriel)”一起使用 现在我正在使用它,但不起

我正在创建一个气泡图,问题是我希望在气泡内添加一些图像

我正在使用以下代码:

我想要一个更大的圆(大约20px的半径),我想要一个填充圆的图像和一个黑色的笔划(圆)

到现在为止,我有一个过滤器,里面有一个过滤圆的feImage。问题是图像移动正确,但仍然是正方形

我尝试添加一个内部有一个圆的,但是当我应用剪辑时,svg剪辑的区域是固定的(我可以看到图像在它后面移动)

我怎样才能解决这个问题


这是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;
    });

我也做了同样的决定。希望这对你有所帮助。

你可以完成同样的任务