どうも!かけちまるです!
SVGの背景色をグラデーションにし、一定時間で色が変化していくアニメーションを実装します。
パスが繋がっている図形なら簡単に思えるかもしれません。
しかし、次のような図形同士が離れている文字のSVGはどうでしょうか?
このようなパスが繋がっていなくても全体にグラデーションのアニメーションをかける方法も解説します。
この記事では、
がわかります。
まずは、パスが繋がっている図形のグラデーションからやってみましょう。
完成形は次のようになります。
実装手順としては、
SVGを直書きする
タグの追加やCSSでスタイルを指定したりするのでSVGをHTMLに直書きします。
不要な記述は削除しておくと編集しやすくなります。
例えば、xml
タグやsvg
タグに指定してあるxmlns
属性、style
タグ内のCSSは別ファイルに移すとか
HTMLコピー<svg viewBox="0 0 95.11 90.45"> <polygon points="47.55 75 18.16 90.45 23.78 57.73 0 34.55 32.86 29.77 47.55 0 62.25 29.77 95.11 34.55 71.33 57.73 76.94 90.45 47.55 75"/> </svg>
linearGradient
タグを追加する
グラデーションにするためにlinearGradient
タグを追加します。svg
タグ内の始めに追加すると良いでしょう。
※defs
タグは可読性を加味して追加しています。推奨のようですがなくても大丈夫です。
HTMLコピー<svg viewBox="0 0 95.11 90.45"> <defs> <linearGradient id="gradient"> </linearGradient> </defs> <polygon points="47.55 75 18.16 90.45 23.78 57.73 0 34.55 32.86 29.77 47.55 0 62.25 29.77 95.11 34.55 71.33 57.73 76.94 90.45 47.55 75"/> </svg>
stop
タグをlinearGradient
タグの子要素として追加
stop
タグを追加します。
今回は2つ追加するので2色のグラデーションになります。
HTMLコピー<svg viewBox="0 0 95.11 90.45"> <defs> <linearGradient id="gradient"> <stop id="stop1" offset="0%"/> <stop id="stop2" offset="100%"/> </linearGradient> </defs> <polygon points="47.55 75 18.16 90.45 23.78 57.73 0 34.55 32.86 29.77 47.55 0 62.25 29.77 95.11 34.55 71.33 57.73 76.94 90.45 47.55 75"/> </svg>
まだ黒い星型だと思いますが大丈夫です。
CSSでアニメーションをかける
次のCSSでSVGにグラデーションのアニメーションをかけることができます。
polygon
(星のパス)にfill: url(#gradient);
を指定し、塗りをlinearGradient
タグにする#stop1
と#stop2
それぞれに色を変化させるアニメーションをかけるCSSコピーsvg{ width: 30%; } polygon{ fill: url(#gradient); } #stop1{ animation: stop1 5s ease-in-out infinite alternate; } #stop2{ animation: stop2 5s ease-in-out infinite alternate; } @keyframes stop1{ /* 紫から緑へ */ 0% {stop-color: #7A5FFF;} 100% {stop-color: #01FF89;} } @keyframes stop2{ /* 緑から紫へ */ 0% {stop-color: #01FF89;} 100% {stop-color: #7A5FFF;} }
完成
これでパスが繋がっている図形のグラデーションの実装は完了です。
最終的なHTML・CSSはこちらです。
HTMLコピー<svg viewBox="0 0 95.11 90.45"> <defs> <linearGradient id="gradient"> <stop id="stop1" offset="0%"/> <stop id="stop2" offset="100%"/> </linearGradient> </defs> <polygon points="47.55 75 18.16 90.45 23.78 57.73 0 34.55 32.86 29.77 47.55 0 62.25 29.77 95.11 34.55 71.33 57.73 76.94 90.45 47.55 75"/> </svg>
CSSコピーsvg{ width: 30%; } polygon{ fill: url(#gradient); } #stop1{ animation: stop1 5s ease-in-out infinite alternate; } #stop2{ animation: stop2 5s ease-in-out infinite alternate; } @keyframes stop1{ /* 紫から緑へ */ 0% {stop-color: #7A5FFF;} 100% {stop-color: #01FF89;} } @keyframes stop2{ /* 緑から紫へ */ 0% {stop-color: #01FF89;} 100% {stop-color: #7A5FFF;} }
切り替え位置を変更するには上記でstop
タグに指定していたoffset
属性の値を変えることで切り替え位置を変更することができます。
HTMLコピー<svg viewBox="0 0 95.11 90.45"> <defs> <linearGradient id="gradient"> <!-- <stop id="stop1" offset="0%"/> --> <stop id="stop1" offset="30%"/> <stop id="stop2" offset="100%"/> </linearGradient> </defs> <polygon class="cls-1" points="47.55 75 18.16 90.45 23.78 57.73 0 34.55 32.86 29.77 47.55 0 62.25 29.77 95.11 34.55 71.33 57.73 76.94 90.45 47.55 75"/> </svg>
グラデーションの角度を変更したい場合linearGradient
タグにgradientTransform="rotate(45)"
のように指定すると変更できます。gradientTransform="rotate(45)"
だとグラデーションが45度になります。
HTMLコピー<svg viewBox="0 0 95.11 90.45"> <defs> <!-- <linearGradient id="gradient"> --> <linearGradient id="gradient" gradientTransform="rotate(45)"> <stop id="stop1" offset="0%"/> <stop id="stop2" offset="100%"/> </linearGradient> </defs> <polygon class="cls-1" points="47.55 75 18.16 90.45 23.78 57.73 0 34.55 32.86 29.77 47.55 0 62.25 29.77 95.11 34.55 71.33 57.73 76.94 90.45 47.55 75"/> </svg>
次のサンプルのようにパスは繋がっていない文字にグラデーションのアニメーションをかける方法です。
SVGにグラデーションアニメーションをかける方法でアニメーションを実装できた人には簡単です。
linearGradient
タグにgradientUnits
属性の値にuserSpaceOnUse
を指定することで全体にグラデーションをかけることができます。
具体的には以下のように指定します。
HTMLコピー<linearGradient gradientUnits="userSpaceOnUse"></linearGradient>
おわり
フィードバックを送信
記事についてのフィードバックはTwitterかお問い合わせフォームから受け付けております。