Слои в Svg при применении Drop Shadow

84
19 июня 2019, 09:30

Мне бы хотелось иметь затенение для графика, который я делаю с использованием 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)")

Answer 1

Вам не нужно создавать целую кучу дубликатов в двух слоях.

Все, что вам нужно сделать, это обернуть все свои шестиугольники в группу <g> и применить к ним фильтр.

<g filter="url(#drop-shadow)" transform="translate(150,0)">

<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>

READ ALSO
Как добавить значения из json в одинаковые div?

Как добавить значения из json в одинаковые div?

В общем имеется код для добавления значений из json в div блоки

134
Как сделать перенос первой строки и сокрытие всего остального в блоке?

Как сделать перенос первой строки и сокрытие всего остального в блоке?

Кто знает, как сделать так, чтобы один раз строка в блоке переносилась, а всё что не влезло во вторую скрывалось за многоточие? Я с таким не сталкивался

101