使用css3的SVG投影

bsr*_*bsr 327 css html5 svg css3 svg-filters

是否可以使用css3为svg元素设置投影,例如

box-shadow: -5px -5px 5px #888;
-webkit-box-shadow: -5px -5px 5px #888;
Run Code Online (Sandbox Code Playgroud)

我看到了一些关于使用滤镜效果创建阴影的评论.有一个单独使用css的例子.下面是一个工作代码,其中正确应用了cusor样式,但没有阴影效果.请帮我用最少的代码获得阴影效果.

svg .shadow { 
  cursor:crosshair; 
  -moz-box-shadow: -5px -5px 5px #888;
  -webkit-box-shadow: -5px -5px 5px #888;
  box-shadow: -5px -5px 5px #888; 
}	
Run Code Online (Sandbox Code Playgroud)

hit*_*uct 496

使用新的 CSS filter属性.

受Webkit浏览器支持,Firefox 34+和Edge.

您可以使用支持FF <34,IE6 +的此polyfill.

你会像这样使用它:

/* Use -webkit- only if supporting: Chrome < 54, iOS < 9.3, Android < 4.4.4 */

.shadow {
  -webkit-filter: drop-shadow( 3px 3px 2px rgba(0, 0, 0, .7));
  filter: drop-shadow( 3px 3px 2px rgba(0, 0, 0, .7));
  /* Similar syntax to box-shadow */
}
Run Code Online (Sandbox Code Playgroud)
<img src="https://upload.wikimedia.org/wikipedia/commons/c/ce/Star_wars2.svg" alt="" class="shadow" width="200">

<!-- Or -->

<svg class="shadow" ...>
    <rect x="10" y="10" width="200" height="100" fill="#bada55" />
</svg>
Run Code Online (Sandbox Code Playgroud)

这种方法的不同之处box-shadow在于它考虑了不透明度,并且不将阴影效果应用于框,而是应用于svg元素本身的角.

请注意:此方法仅在将类放在<svg>元素上时才有效.你可以不是一个内联SVG元素上使用这个功能,比如<rect>.

<!-- This will NOT work! -->
<svg><rect class="shadow" ... /></svg>
Run Code Online (Sandbox Code Playgroud)

阅读有关html5rocks上的css过滤器的更多信息.

  • 这似乎适用于图像或整个svg,但适用于svg内的选择.[小提琴](http://jsfiddle.net/MhhAx/1/) (46认同)
  • 似乎不适用于<rect>或<circle>? (19认同)
  • @AndyRay就像一个魅力... http://jsbin.com/peviso/edit?html,css,js,output.您将该类放在<svg>标记上. (13认同)
  • 这不适用于以任何方式将阴影应用于svg元素.**不要使用它.**失败的例子:http://jsbin.com/bepurahuwa/1/edit?html,css,js,output (11认同)
  • @hitautodestruct是的,它确实像那样工作.当您需要对元素应用过滤器而不是其他人时,会出现**真正的**问题. (3认同)
  • 我想@AndyRay和hitautodestruct都是正确的,因为正如[在此指出](http://stackoverflow.com/questions/34460182/how-to-apply-drop-shadow-filter-via-css-to-svg-特定元素路径),这看起来像Chrome渲染问题:Firefox正在正确渲染SVG特定元素的过滤器. (2认同)

Eri*_*röm 320

这是使用'filter'属性将dropshadow应用到某个svg 的示例.如果你想控制阴影的不透明度,请看一下这个例子.该slope属性控制为阴影提供多少不透明度.

示例中的相关位:

<filter id="dropshadow" height="130%">
  <feGaussianBlur in="SourceAlpha" stdDeviation="3"/> <!-- stdDeviation is how much to blur -->
  <feOffset dx="2" dy="2" result="offsetblur"/> <!-- how much to offset -->
  <feComponentTransfer>
    <feFuncA type="linear" slope="0.5"/> <!-- slope is the opacity of the shadow -->
  </feComponentTransfer>
  <feMerge> 
    <feMergeNode/> <!-- this contains the offset blurred image -->
    <feMergeNode in="SourceGraphic"/> <!-- this contains the element that the filter is applied to -->
  </feMerge>
</filter>
<circle r="10" style="filter:url(#dropshadow)"/>
Run Code Online (Sandbox Code Playgroud)

Box-shadow被定义为在CSS框上工作(读取:矩形),而svg比矩形更具表现力.阅读SVG入门,了解更多关于SVG过滤器的功能.

  • @HughGuiney:是的,当然.以下是一种做法的例子,http://xn--dahlstrm-t4a.net/svg/filters/arrow-with-dropshadow-lighter.svg.只需更改`slope`属性即可调整您想要的不透明度. (5认同)
  • 有关如何在D3.js中实现此方法的示例:http://bl.ocks.org/cpbotha/5200394 (3认同)
  • @Costa参见例如http://stackoverflow.com/questions/7965196/svg-color-of-the-shadow (3认同)
  • 有没有办法控制阴影的不透明度? (2认同)

小智 40

使用drop-shadow()CSS函数和rgba颜色值,可以轻松地向svg-element中添加一个阴影效果。通过使用rgba颜色值,您可以更改阴影的不透明度。

img.light-shadow{
  filter: drop-shadow(0px 3px 3px rgba(0, 0, 0, 0.4));
}

img.dark-shadow{
  filter: drop-shadow(0px 3px 3px rgba(0, 0, 0, 1));
}
Run Code Online (Sandbox Code Playgroud)
<img class="light-shadow" src="https://cdn.sstatic.net/Sites/stackoverflow/company/img/logos/so/so-logo.svg" />
<img class="dark-shadow" src="https://cdn.sstatic.net/Sites/stackoverflow/company/img/logos/so/so-logo.svg" />
Run Code Online (Sandbox Code Playgroud)

  • @Foxhoundn 这绝对是现代的解决方案,应该被接受作为答案。 (8认同)
  • 这很好用,可能应该是现代公认的答案 (4认同)
  • 天啊,如果这只适用于 SVG 中的组和形状该多好啊! (2认同)

nik*_*ong 13

我发现的最简单的方法是使用feDropShadow。我永远不会回过头来使用那些我不理解的难以置信的过滤器标签名称。

<filter id="shadow" x="0" y="0" width="200%" height="200%">
  <feDropShadow dx="40" dy="40" stdDeviation="35" flood-color="#ff0000" flood-opacity="1" />
</filter>
Run Code Online (Sandbox Code Playgroud)

  • 不知道为什么要低估;仍然是在单个SVG元素上应用阴影的最佳答案。 (4认同)
  • 我读了一些书,现在我明白了您的回答,您肯定会赞成。这个答案不够欣赏。但是,多一点解释将是有益的。例如,此示例:https://developer.mozilla.org/en-US/docs/Web/SVG/Element/feDropShadow#SVG (2认同)
  • 为此,您需要将 `filter:url(#shadow)` 添加到您想要有阴影的元素(`#shadow` 是 `filter` 标签的 id)。例如 `&lt;path d="..." style="filter:url(#shadow)"/&gt;`。也许您应该将其添加到您的答案中。 (2认同)