Ответ 1
Вы можете использовать svg-фильтры, здесь один пример, показывающий, как применить фильтр размытия.
Пример фильтра sshg dropshadow можно увидеть здесь . Объедините два примера, чтобы получить то, что вам нужно.
Я использую d3.js для создания простой диаграммы пончиков.
Я не могу добиться эффекта тени или эффекта теневой тени, чтобы добавить некоторую глубину в диаграмму. Я пробовал добавить css:
path {
-moz-box-shadow: 3px 3px 5px 6px #ccc;
-webkit-box-shadow: 3px 3px 5px 6px #ccc;
box-shadow: 3px 3px 5px 6px #ccc;
}
К тегам и тегам g, но безрезультатно. Кто-нибудь знает, возможно ли это с помощью CSS или знать какое-то словосочетание?
Действительно оцените помощь по такой основной проблеме. Matt
var data = [0, 35, 65];
var w = 400,
h = 400,
r = Math.min(w, h) / 2,
ir = r * 0.5,
color = d3.scale.category20(),
donut = d3.layout.pie().sort(null),
arc = d3.svg.arc().innerRadius(ir).outerRadius(r);
var svg = d3.select("body").append("svg:svg")
.attr("width", w)
.attr("height", h)
.append("svg:g")
.attr("transform", "translate(" + w / 2 + "," + h / 2 + ")");
var arcs = svg.selectAll("path")
.data(donut(data))
.enter().append("svg:path")
.attr("fill", function(d, i) { return color(i); })
.attr("d", arc);
Вы можете использовать svg-фильтры, здесь один пример, показывающий, как применить фильтр размытия.
Пример фильтра sshg dropshadow можно увидеть здесь . Объедините два примера, чтобы получить то, что вам нужно.
В случае, если кто-нибудь столкнется с этим.,
/* For the drop shadow filter... */
var defs = svg.append("defs");
var filter = defs.append("filter")
.attr("id", "dropshadow")
filter.append("feGaussianBlur")
.attr("in", "SourceAlpha")
.attr("stdDeviation", 4)
.attr("result", "blur");
filter.append("feOffset")
.attr("in", "blur")
.attr("dx", 2)
.attr("dy", 2)
.attr("result", "offsetBlur");
var feMerge = filter.append("feMerge");
feMerge.append("feMergeNode")
.attr("in", "offsetBlur")
feMerge.append("feMergeNode")
.attr("in", "SourceGraphic");
Затем присоедините этот фильтр к элементу svg, например, к строке или столбцу, или что-то еще, что щекочет ваше воображение.,
svg.append("path")
.datum(data)
.attr("class", "line")
.attr("d", line)
.attr("filter", "url(#dropshadow)");
Если вам нужно контролировать цвет тени, это сработало для меня:
var defs = svg.append("defs");
var filter = defs.append("filter")
.attr("id", "dropshadow")
filter.append("feGaussianBlur")
.attr("in", "SourceAlpha")
.attr("stdDeviation", 4)
.attr("result", "blur");
filter.append("feOffset")
.attr("in", "blur")
.attr("dx", 2)
.attr("dy", 2)
.attr("result", "offsetBlur")
filter.append("feFlood")
.attr("in", "offsetBlur")
.attr("flood-color", "#3d3d3d")
.attr("flood-opacity", "0.5")
.attr("result", "offsetColor");
filter.append("feComposite")
.attr("in", "offsetColor")
.attr("in2", "offsetBlur")
.attr("operator", "in")
.attr("result", "offsetBlur");
var feMerge = filter.append("feMerge");
feMerge.append("feMergeNode")
.attr("in", "offsetBlur")
feMerge.append("feMergeNode")
.attr("in", "SourceGraphic");
d3: из этого ответа: fooobar.com/questions/33603/...
Я сделал вам простой комментарий с d3.js SVG rect graphics с тенями теней, используя информацию @Erik Dahlström: http://bl.ocks.org/cpbotha/5200394:)
Согласно Google Material Design, тень должна приближаться к реальным условиям мира, поскольку люди обладают огромной способностью к восприятию. Таким образом, тень должна состоять из окружающего компонента и литого компонента. См. Спецификации Google здесь.
http://www.google.com/design/spec/what-is-material/environment.html#environment-light-shadow
Все вышеперечисленное - отличные примеры теней, но я не мог найти примеров составных, поэтому, хотя я бы поделился этим настраиваемым фильтром. Кажется, что конечный результат кажется более реалистичным.
var id = "md-shadow";
var deviation = 2;
var offset = 2;
var slope = 0.25;
var svg = d3.select("#yoursvg");
var defs = svg.select("defs");
// create filter and assign provided id
var filter = defs.append("filter")
.attr("height", "125%") // adjust this if shadow is clipped
.attr("id", id);
// ambient shadow into ambientBlur
// may be able to offset and reuse this for cast, unless modified
filter.append("feGaussianBlur")
.attr("in", "SourceAlpha")
.attr("stdDeviation", deviation)
.attr("result", "ambientBlur");
// cast shadow into castBlur
filter.append("feGaussianBlur")
.attr("in", "SourceAlpha")
.attr("stdDeviation", deviation)
.attr("result", "castBlur");
// offsetting cast shadow into offsetBlur
filter.append("feOffset")
.attr("in", "castBlur")
.attr("dx", offset - 1)
.attr("dy", offset)
.attr("result", "offsetBlur");
// combining ambient and cast shadows
filter.append("feComposite")
.attr("in", "ambientBlur")
.attr("in2", "offsetBlur")
.attr("result", "compositeShadow");
// applying alpha and transferring shadow
filter.append("feComponentTransfer")
.append("feFuncA")
.attr("type", "linear")
.attr("slope", slope);
// merging and outputting results
var feMerge = filter.append("feMerge");
feMerge.append('feMergeNode')
feMerge.append("feMergeNode")
.attr("in", "SourceGraphic");
Это может быть применено к объекту, например.
var r = element.append("rect")
.attr("class", "element-frame")
: // other settings
.style("filter", "url(#md-shadow)");