javascript - 使用过滤器和 d3.js 在 svg 中部分更改阴影不透明度

标签 javascript d3.js svg svg-filters

我如何使用滤镜和 d3.js 部分更改 svg 中的阴影不透明度?

这是我希望我的影子看起来像的样子: enter image description here

我的意思是在写入实体名称的矩形中投下的阴影。

到目前为止,这是我能够实现的目标:

var svg = d3.select("#drawRegion")
                .append("svg")
                .attr("width", "100%")
                .attr("height", "100%");
                
                
var defs = svg.append("defs");

var filter = defs.append("filter")
                 		.attr("id","coolShadow");

filter.append("feMorphology")
  .attr("in", "SourceGraphic")
  .attr("result", "upperLayer")
  .attr("operator", "dilate")
  .attr("radius", "2 2");

filter.append("feMorphology")
  .attr("in", "SourceAlpha")
  .attr("result", "enlargedAlpha")
  .attr("operator", "dilate")
  .attr("radius", "3 5");

filter.append("feGaussianBlur")
  .attr("in", "enlargedAlpha")
  .attr("result", "bluredAlpha")
  .attr("stdDeviation", "5");
  
filter.append("feOffset")
  .attr("in", "bluredAlpha")
  .attr("result", "lowerLayer")
  .attr("dy", "3");


var feMerge = filter.append("feMerge");
feMerge.append("feMergeNode")
  .attr("in","lowerLayer");
feMerge.append("feMergeNode")
  .attr("in","upperLayer");

svg.append("rect")
    .attr("rx", 2)
    .attr("ry", 2)
	.attr("x", "20%")
  .attr("y", "20%")
  .attr("width", "60%")
  .attr("height", "60%")
  .attr("fill", "white")
  .style("filter", "url(#coolShadow)");
  
  
  
  
  
  
  
  
#drawRegion {
    width: 100%;
    height: 100%;
    display: inline-block;
    position: fixed;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    margin: auto;
    position: relative;
}
<div id="drawRegion">

</div>
<script src="https://d3js.org/d3.v5.min.js"></script>

如您所见,阴影几乎准备就绪。我唯一不知道如何实现的是增加不透明度(现在它增加太多,我想降低它,但同时保留左、上和右边界的透明度)。

我尝试降低整体不透明度,但没有帮助:左、上和右边框的透明度也降低了,而我想让下边框部分更透明并保持其他边框原样。

我将不胜感激任何可以让我解决问题或完全不同的解决方案的更正。

最佳答案

实现您想要做的事情的最佳方法是拨回第二个 feMorphology 上的 y 半径和 feOffset 上的 y。有一些方法可以选择性地降低不透明度,但它们会导致阴影不连续——这可能是您不希望看到的。

(您还需要扩大过滤区域 - 我在这里为您做的)。

不过,我想知道您为什么要使用 feMorphology 来扩展源矩形?如果你想要一个更大的带有轻微圆 Angular 的矩形,你可以直接在 SVG 中绘制它——它会更高效。 feMorphology 是一个缓慢的操作。

var svg = d3.select("#drawRegion")
                .append("svg")
                .attr("width", "100%")
                .attr("height", "100%");
                
                
var defs = svg.append("defs");

var filter = defs.append("filter")
                 		.attr("id","coolShadow")
                 		.attr("y","-20%")
                 		.attr("height","140%");

filter.append("feMorphology")
  .attr("in", "SourceGraphic")
  .attr("result", "upperLayer")
  .attr("operator", "dilate")
  .attr("radius", "2 2");

filter.append("feMorphology")
  .attr("in", "SourceAlpha")
  .attr("result", "enlargedAlpha")
  .attr("operator", "dilate")
  .attr("radius", "3 3");

filter.append("feGaussianBlur")
  .attr("in", "enlargedAlpha")
  .attr("result", "bluredAlpha")
  .attr("stdDeviation", "5");
  
filter.append("feOffset")
  .attr("in", "bluredAlpha")
  .attr("result", "lowerLayer")
  .attr("dy", "2");

var feMerge = filter.append("feMerge");
feMerge.append("feMergeNode")
  .attr("in","lowerLayer");
feMerge.append("feMergeNode")
  .attr("in","upperLayer");

svg.append("rect")
    .attr("rx", 2)
    .attr("ry", 2)
	.attr("x", "20%")
  .attr("y", "20%")
  .attr("width", "60%")
  .attr("height", "60%")
  .attr("fill", "white")
  .style("filter", "url(#coolShadow)");
  
  
  
  
  
  
  
  
#drawRegion {
    width: 100%;
    height: 100%;
    display: inline-block;
    position: fixed;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    margin: auto;
    position: relative;
}
<div id="drawRegion">

</div>
<script src="https://d3js.org/d3.v5.min.js"></script>

关于javascript - 使用过滤器和 d3.js 在 svg 中部分更改阴影不透明度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50670538/

相关文章:

javascript - 如何使用正则表达式匹配字符串<div><span>regular</span><span>表达式</span></div>

javascript - 如何从对象数组中获取最大值以在 d3.scale.linear().domain() 中使用

javascript - d3.js v4.9 获取选定元素的计算宽度

qt - 带有 SVG 的 QIcon 显示为黑色

ios - iOS (iPad/iPhone) 上未保留 SVG 透明度

javascript - 检查同源政策是否适用

php - 在服务器端编辑 XML 文档

javascript - jQuery ui 选项卡选择所需的帮助。我可以取消该操作吗?

javascript - 如何覆盖 D3 函数中的 .value()

css - 为什么我的 SVG 文本在 Microsoft Edge 中没有垂直居中?