如何用滤镜创建svg线?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用滤镜创建svg线?相关的知识,希望对你有一定的参考价值。

我想创建具有以下效果的线条。

line sample

以上是用以下方式创建的。

<svg id="svg_wrp" width="500" height="500">
    <defs>
         <filter id="crayon">
            <feTurbulence
                type="fractalNoise"
                baseFrequency="1.001"
                numOctaves="10"
                result="noise">
            </feTurbulence>
            <feDisplacementMap
                xChannelSelector="R"
                yChannelSelector="G"
                scale="50"
                in="SourceGraphic"
                result="newSource">
            </feDisplacementMap>
      <feGaussianBlur stdDeviation="1.1"/>
        </filter>
 </defs>
  <polyline    
  points="200,100 100,200"
  stroke="#000"
  stroke-width="10"
  fill="none"
  filter=url(#crayon) ></polyline>
</svg>

上图在Fiddle中

这种方法对我想做的很多事情都不适用。效果会根据线条的长度和方向而改变。

我能想到的唯一方法就是把所有的线都替换成多边形。然后就可以直接使用滤镜了。但这样我就必须创建一个复杂的多边形,并对每个角和曲线进行计算。

所以在我这样做之前,我想知道是否有办法用svg多线或其他方法来实现上述目的。

编辑:Michael Mullany的回答解决了只用垂直和水平线的问题,但我还是有一些线的效果不同的问题,请看下面的例子。注意左上角的效果降低了。有没有办法让所有线条的效果一致?

enter image description here

答案

默认的滤镜尺寸对水平线和垂直线不起作用,因为它们有一个零面积的边界框。你需要将你的滤镜单位改为。

<filter id="crayon" filterUnits="userSpaceOnUse" x="0" y="0" width="500" height="500">

否则这个滤镜就可以了。

更新:有一些baseFrequency的值会导致异常的moire-like伪影--显然1.001是这种情况下的其中之一。如果你把baseFrequency调整到0.98,问题就会消失。

以上是关于如何用滤镜创建svg线?的主要内容,如果未能解决你的问题,请参考以下文章

如何用SVG制作面积图(没有JS)

如何用柔性线连接div [重复]

如何用svg在网页中画一条带箭头的连接线

如何用svg代码排版微信?

如何使用 SVG 滤镜创建透明渐变蒙版

如何用JS控制svg的背景色?