ChatGPT解决这个技术问题 Extra ChatGPT

使用 css3 的 SVG 投影

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

box-shadow: -5px -5px 5px #888;
-webkit-box-shadow: -5px -5px 5px #888;

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

svg .shadow { 光标:十字准线; -moz-box-shadow: -5px -5px 5px #888; -webkit-box-shadow: -5px -5px 5px #888;盒子阴影:-5px -5px 5px #888; }


h
hitautodestruct

使用 new CSS filter 属性。

Supported by webkit browsers、Firefox 34+ 和 Edge

您可以使用支持 FF < 的 polyfill 34、IE6+。

你会像这样使用它:

/* 仅在支持时使用 -webkit-:Chrome < 54, iOS < 9.3, Android < 4.4.4 */ .shadow { -webkit-filter: drop-shadow( 3px 3px 2px rgba(0, 0, 0, .7 ));过滤器:阴影(3px 3px 2px rgba(0, 0, 0, .7)); /* 类似于 box-shadow 的语法 */ }

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

请注意:这种方法仅适用于将类单独放在 <svg> 元素上的情况。您可以<rect> 等内联 svg 元素上使用它。

<!-- This will NOT work! -->
<svg><rect class="shadow" ... /></svg>

html5rocks 上阅读有关 CSS 过滤器的更多信息。


这似乎适用于图像或整个 svg,但适用于 svg 内的选择。 the fiddle
这不适用于以任何方式将阴影应用于 svg 元素。 不要使用它。失败示例:jsbin.com/bepurahuwa/1/edit?html,css,js,output
@AndyRay 就像一个魅力... jsbin.com/peviso/edit?html,css,js,output。你把课程放在 <svg>标签。
@hitautodestruct 是的,它确实是这样工作的。当您需要将过滤器应用于一个元素而不是其他元素时,真正的问题就出现了。
我猜@AndyRay 和 hitautodestruct 都是正确的,因为作为 pointed out here,这看起来像是 Chrome 渲染问题:Firefox 正在正确渲染 SVG 特定元素上的过滤器。
N
Nacho Coloma

这是使用“过滤器”属性将阴影应用于某些 svg 的example。如果您想控制阴影的不透明度,请查看 this exampleslope 属性控制赋予阴影的不透明度。

示例中的相关位:

<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)"/>

Box-shadow 被定义为在 CSS 盒子(阅读:矩形)上工作,而 svg 比矩形更具表现力。阅读 SVG Primer,详细了解您可以使用 SVG 过滤器做什么。


有没有办法控制阴影的不透明度?
@HughGuiney:是的,当然。以下是一种实现方式的示例,xn--dahlstrm-t4a.net/svg/filters/…。只需改变 slope 属性来调整您想要的不透明度。
@LorenzoPolidori IE10 和 Safari 5.2 都支持 SVG 过滤器。
有关如何在 D3.js 中实现此方法的示例:bl.ocks.org/cpbotha/5200394
J
Jonny Ekholm

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

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


@Foxhoundn 这绝对是现代解决方案,应该被接受为答案。
Internet Explorer 11:失败(没有投影,但显示了原始 SVG 图像)。 Firefox(发布和 ESR):好的。谷歌浏览器:好的。边缘遗产:好的。
大坝,如果这仅适用于 SVG 中的组和形状!
n
nikk wong

我发现最简单的方法是使用 feDropShadow

<filter id="shadow" x="0" y="0" width="200%" height="200%">
  <feDropShadow dx="3" dy="3" stdDeviation="1" flood-color="#ff0000" flood-opacity="1" />
</filter>

在元素上:

<path d="..." filter="url(#shadow)"/>

我做了一些阅读,现在我理解了你的答案,你肯定会得到支持。这个答案没有得到足够的重视。但是,多一点解释会很好。例如此示例:developer.mozilla.org/en-US/docs/Web/SVG/Element/…
为此,您需要将 filter:url(#shadow) 添加到要具有阴影的元素(#shadowfilter 标记的 ID)。例如 <path d="..." style="filter:url(#shadow)"/>。也许您应该将其添加到您的答案中。
feDropShadow dx="40" dy="40" stdDeviation="35" 中使用较小的值,例如 3,3,1 而不是 40,40,35 可能会避免一些混乱。
F
F. Hauri - Give Up GitHub

带有白色阴影的黑色文本

另一种方式,我用于白色阴影(在文本上):为阴影创建一个克隆:

注意:这需要在 SVG 声明中使用 xmlns:xlink="http://www.w3.org/1999/xlink"

实际文本值位于 <defs> 部分,具有位置和样式,但没有 fill 定义。

文本被克隆了两次:第一次用于阴影,第二次用于文本本身。

< defs> 带有白色阴影的黑色文本 <使用风格="填充:白色;" filter="url(#Blur)" xlink:href="#Text" transform="translate(1.8,.9)"/>

较远的阴影,最大值为模糊偏差:

< defs> 带有白色阴影的黑色文本 <使用风格="填充:白色;" filter="url(#Blur)" xlink:href="#Text" transform="translate(7,5)"/>

您可以对常规 SVG 对象使用相同的方法。

具有相同要求:<defs> 部分没有填充定义

< defs> “矩阵(12.997776,0,0,-12.997776,306.99861,703.01559)">


不能只使用 flood-color 吗?
Blur 用于使阴影看起来有点模糊。查看我的第二个文本版本 More distant shadow...(刚刚添加)
N
NVRM

可能是一种演变,内联 CSS 过滤器似乎以某种方式很好地处理元素。

如前所述,在类或内联中的 svg 元素中声明阴影 css 过滤器不起作用。

但是,至少在 Firefox 中,具有以下魔法:

在 DOM 加载后使用 javascript 内联附加过滤器声明。

// 不起作用,使用常规的动态 css 样式: shadow0.oninput = () => { rect1.style.filter = "filter:drop-shadow(0 0 " + shadow0.value + "rem black);" } // 好的!内联样式,附加。 shadow1.oninput = () => { rect1.style += " ;filter:drop-shadow(0 0 " + shadow1.value + "rem black);" rect2.style += " ;filter:drop-shadow(0 0 " + shadow1.value + "rem black);" }

仅限火狐

不工作! |好的!

https://i.stack.imgur.com/3RLDH.gif


P
Pierre Paquette

如果您的 SVG 元素是 <text>,您可以毫无问题地使用 CSS 属性 text-shadow。语法是 text-shadow: color x-offset-px y-offset-px blur-px


B
Bhargav Rao

我不知道只有 CSS 的解决方案。

正如您所提到的,过滤器是在 SVG 中创建投影效果的规范方法。 SVG 规范包括一个这样的例子。


-webkit-filter: drop-shadow() 是肯定要走的路。请参阅@hitautodestruct 的答案。
@clayzermk1 如果您希望它仅在 webkit 中工作......那么是的。我们正在寻找更可靠的解决方案,我认为,我认为这也不再受支持。
@jbeard4 链接坏了,最好把内容贴在这里。
已提交指向 Removed: Filter Effects This chapter is no longer part of the SVG specification 的链接!!
这是一个非回答。

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅