Мне бы хотелось иметь затенение для графика, который я делаю с использованием 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)")
Вам не нужно создавать целую кучу дубликатов в двух слоях.
Все, что вам нужно сделать, это обернуть все свои шестиугольники в группу <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>
В общем имеется код для добавления значений из json в div блоки
Кто знает, как сделать так, чтобы один раз строка в блоке переносилась, а всё что не влезло во вторую скрывалось за многоточие? Я с таким не сталкивался