js不要!SVGのFilterで手書きアニメーションさせてみた

はやち


js不要!SVGのFilterで手書きアニメーションさせてみた

どうもですよ、はやちですよ・ω・
今回はSVGのFilterについてご紹介をしたく、手書きで書いたようなアニメーションを作ってみました。

▼目次

実装方法

Filter内でfeTurbulence(ノイズエフェクト)とfeDisplacementMap(空間を定義する)という原始Filterを使って歪ませた文字を作ります。

<filter id="squiggly-0">
      <feTurbulence 
      type="fractalNoise" //ノイズの関数
      id="turbulence" //キメの細かさ
      baseFrequency="0.02" //ノイズ関数に対するオクターブ
      numOctaves="3" //ノイズ関数に対するオクターブ
      result="noise" //設定する文字列
      seed="0" //乱数の種
      />
      <feDisplacementMap 
      id="displacement" //効果をかける処理
      in="SourceGraphic" //効果を表す所を設定
      in2="noise" scale="4" //ずらす位置
      />
</filter>

使用した原始Filterは以下のように設定することができます。

feTurbulence

ノイズを設定するFilterです。

type Turbulenceでゆらぎ関数FractalNoiseノイズの関数を指定できます。
baseFrequency ノイズの粗さを調整。
numOctaves ノイズ関数に対するオクターブ、大きくなるほどより複雑になる。
seed 乱数の種。
stitchTiles 継ぎ目の処理方法を設定できます。stitchで継ぎ目をつなぐ、noStitchでつながない。
result 他の効果とつなげるための名前の設定。

feDisplacementMap

元の要素を変形し様々な効果をつけることができます。

in 効果を設定します。
種類はSourceGraphic、SourceAlpha、BackgroundImage、 BackgroundAlpha、FillPaint、StrokePaintがあります。
in2 効果を反映させるところを設定します。
scale ずらす幅を設定。

Filterのこれらの設定がワンセット分で、scaleのパターン分のFilterを複数用意します。

/* アニメーションを反映させたいDOM */
<div class="target">
  <!--/省略-->
</div>

/* アニメーションの設定 */
<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
    <filter id="squiggly-0">
      <feTurbulence type="fractalNoise" id="turbulence" baseFrequency="0.02" numOctaves="3" result="noise" seed="0"/>
      <feDisplacementMap id="displacement" in="SourceGraphic" in2="noise" scale="4" />
    </filter>
    <filter id="squiggly-2">
      <feTurbulence type="fractalNoise" id="turbulence" baseFrequency="0.02" numOctaves="3" result="noise" seed="2"/>
<feDisplacementMap in="SourceGraphic" in2="noise" scale="4" />
    </filter>
    <filter id="squiggly-3">
      <feTurbulence type="fractalNoise" id="turbulence" baseFrequency="0.02" numOctaves="3" result="noise" seed="3"/>
<feDisplacementMap in="SourceGraphic" in2="noise" scale="6" />
    </filter>
    <filter id="squiggly-4">
      <feTurbulence type="fractalNoise" id="turbulence" baseFrequency="0.02" numOctaves="3" result="noise" seed="4"/>
<feDisplacementMap in="SourceGraphic" in2="noise" scale="4" />
    </filter>
</svg>

用意できたらcssのanimateでこれらのパターンをループ再生していきます。

keyframes squiggly-anim{
  0% {
    filter:url('#squiggly-0');
  }
  25% {
    filter:url('#squiggly-1');
  }
  50% {
    filter:url('#squiggly-2');
  }
  75% {
    filter:url('#squiggly-3');
  }
  100% {
    filter:url('#squiggly-4');
  }
}

.target{
  animation:squiggly-anim .34s linear infinite;
 }

出来上がったものがこちらになります( ˘ω˘)☞三☞シュッシュッ

まとめ

いかがでしょうか。

いつもの顔(´ʘ‿ʘ`)は画像でSVG Filterの文言部分はinputなので、どの要素に対してもアニメーションが反映されます。
テキストを変えてみておためしくださいまし。

はやち
この記事を書いた人
はやち

フロントエンドエンジニア

関連記事