【问题标题】:SVG Drop Shadow LayeringSVG 投影分层
【发布时间】:2018-01-15 10:18:08
【问题描述】:

我想为我正在使用 d3 和 SVG 制作的绘图设置阴影,但我遇到了阴影与相邻元素重叠的问题。请参阅下图了解它当前的外观。请注意,中间的六边形似乎具有不同的高度,因为阴影正在其中一些顶部渲染。我想做的是设置阴影,使其仅在背景上呈现,而不是在其他相邻的六角形之上。

这是当前如何定义阴影的代码:

      var filter = defs.append("filter")
        .attr("id", "drop-shadow")
        .attr("height", "130%");

    // SourceAlpha refers to opacity of graphic that this filter will be applied to
    // convolve that with a Gaussian with standard deviation 3 and store result
    // in blur
    filter.append("feGaussianBlur")
        .attr("in", "SourceAlpha")
        .attr("stdDeviation", 1)
        .attr("result", "blur");

    // translate output of Gaussian blur to the right and downwards with 2px
    // store result in offsetBlur
    filter.append("feOffset")
        .attr("in", "blur")
        .attr("dx", 1)
        .attr("dy", 1)
        .attr("result", "offsetBlur");

    // overlay original SourceGraphic over translated blurred opacity by using
    // feMerge filter. Order of specifying inputs is important!
    var feMerge = filter.append("feMerge");

    feMerge.append("feMergeNode")
        .attr("in", "offsetBlur")
    feMerge.append("feMergeNode")
        .attr("in", "SourceGraphic");

然后将这些样式应用于六边形:

d3.select(this).style("filter", "url(#drop-shadow)")

【问题讨论】:

    标签: javascript css d3.js svg


    【解决方案1】:

    我想出了一个临时解决方案。本质上,它涉及在不同的层上创建两组六边形:

    1. 一组在底层,没有填充/描边,但有阴影
    2. 顶层的一组具有所有填充/笔触,但没有阴影

    由于 #2 高于 #1,阴影不会出现在任何可见六边形的顶部...

    【讨论】:

      【解决方案2】:

      您无需在两层中创建一大堆副本。您需要做的就是将所有六边形包装在一个组中 (<g>) 并对其应用过滤器。

      <svg>
        <defs>
          <filter id="drop-shadow" width="150%" height="150%">
            <feGaussianBlur in="SourceAlpha" stdDeviation="3" result="blur"/>
            <feOffset in="blur" dx="2" dy="2" result="offsetBlur"/>
            <feMerge>
              <feMergeNode in="offsetBlur"/>
              <feMergeNode in="SourceGraphic"/>
            </feMerge>
          </filter>
        </defs>
      
        <rect x="75" y="75" width="50" height="50" fill="cyan"
              filter="url(#drop-shadow)"/>
        <rect x="75" y="25" width="50" height="50" fill="gold"
              filter="url(#drop-shadow)"/>
        <rect x="25" y="75" width="50" height="50" fill="lime"
              filter="url(#drop-shadow)"/>
        <rect x="25" y="25" width="50" height="50" fill="red"
              filter="url(#drop-shadow)"/>
      
        <g filter="url(#drop-shadow)" transform="translate(150,0)">
          <rect x="75" y="75" width="50" height="50" fill="cyan"/>
          <rect x="75" y="25" width="50" height="50" fill="gold"/>
          <rect x="25" y="75" width="50" height="50" fill="lime"/>
          <rect x="25" y="25" width="50" height="50" fill="red"/>
        </g>
      </svg>

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-30
        • 2019-03-25
        • 2015-08-09
        • 2010-12-03
        • 1970-01-01
        相关资源
        最近更新 更多