![見出し画像](https://assets.st-note.com/production/uploads/images/68063668/rectangle_large_type_2_860775809ea5714cdfa438502fec205c.png?width=1200)
【保存版】SVG徹底解説!アニメーション・フルオンチェーンNFTを作ろう!
こんにちは、CryptoGamesの高橋です。
クリスペの会社で働いています。
本日は、アニメーション・フルオンチェーンNFTを作成するためにSVGについて学んでいきます。
なお、こちらの記事は無料で公開していますので、ご自由にご利用いただけます。
また、記事の作成にあたり、次の2つの記事を大いに参考にしました。
また、フルオンチェーンNFTの作成については、こちらの記事をご参照ください。
0 SVGとは?
svgとはXY座標で描画されたファイルです。
例えばこんな画像です。
![スクリーンショット 2021-12-19 9.30.40](https://assets.st-note.com/production/uploads/images/68046718/picture_pc_0df729dd35946231cb7dd9fd85bdc2c5.png?width=1200)
一見、pngファイルと同じようですが、実はこの中身は下のようなコードで書かれています。
<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 200'>
<path stroke="black" stroke-width="1" fill="none" d="M 0 0 L25 50" />
</svg>
![スクリーンショット 2021-12-19 9.33.23](https://assets.st-note.com/production/uploads/images/68046805/picture_pc_f8ac73e32ac717785c786d94f47f5d01.png?width=1200)
では、具体的にどのように描かれているのかを見てみましょう。ぜひ、ご自身でも「.svg」のsvgファイルを作ってみてください。
1 pathタグについて
図形を描く時には「path」タグを用います。「d=」以降で、どんな図形を描くのかを指定していきます。
なお、四角形、丸などの決まった形には別のタグを使う方が便利です。
![スクリーンショット 2021-12-19 9.37.27](https://assets.st-note.com/production/uploads/images/68047109/picture_pc_60319fefe7f3ca98e87994a3f8cc02a6.png?width=1200)
ちなみに、上のように
① stroke > 線の色
② stroke-width > 線の太さ
③ fill > 塗りつぶしの色
を表します。
2 M(大文字)について(スタート位置)
大文字のMはスタートの位置を表します。
![スクリーンショット 2021-12-19 9.41.59](https://assets.st-note.com/production/uploads/images/68047266/picture_pc_c8e4b1d04310809cd0e56df9167b8853.png?width=1200)
つまり、この位置が(0,0)であることがわかりました。
![スクリーンショット 2021-12-19 9.43.50](https://assets.st-note.com/production/uploads/images/68047358/picture_pc_db0e10783cc3f6a63be2cdf711c5ee34.png?width=1200)
3 L(大文字)について(直線を引く)
大文字のLは直線を引くという意味です。
![スクリーンショット 2021-12-19 9.46.33](https://assets.st-note.com/production/uploads/images/68047538/picture_pc_a4037b89d563b67991e97744cc489299.png?width=1200)
つまり、こんな感じだったのですね。
![スクリーンショット 2021-12-19 9.49.41](https://assets.st-note.com/production/uploads/images/68047753/picture_pc_679d72952943472103a79490543f7dd1.png?width=1200)
4 l(小文字)について(直線を引く)
では、この下のように小文字のlにした場合、どうなるでしょうか。
![スクリーンショット 2021-12-19 9.54.45](https://assets.st-note.com/production/uploads/images/68048069/picture_pc_f4d5f9b7830fb4882a1d9c42ce7b73c1.png?width=1200)
大文字 ⇨ 絶対参照
小文字 ⇨ 相対参照
になります。難しそうですが、言っていることは簡単です。
① L(50,0)
⇨(50,0)の場所に向かって線を引く
② l(50,0)
⇨今の場所から (50,0)の場所に向かって線を引く
![スクリーンショット 2021-12-19 10.02.30](https://assets.st-note.com/production/uploads/images/68048311/picture_pc_ff8b35ab4dc878dd39a6be6cb312bf58.png?width=1200)
こんな風になりました。予想はあっていましたか??
5 m(小文字)について(スタート位置)
下についてはどのようになりますでしょうか。
![スクリーンショット 2021-12-19 10.03.09](https://assets.st-note.com/production/uploads/images/68048418/picture_pc_c40ab451a1e86d4f0173b45ff9635a02.png?width=1200)
やはり小文字は相対参照なので、今の位置から(10,0)の位置がスタート位置になります。
![スクリーンショット 2021-12-19 10.06.08](https://assets.st-note.com/production/uploads/images/68048559/picture_pc_79de28e0797c9cc77ae7af8392d3bce9.png?width=1200)
6 Vについて(垂直線を引く)
大文字と小文字の関係については他も同じです。
ここからはわかりやすいように基本小文字でやっていきます。
![スクリーンショット 2021-12-19 10.09.54](https://assets.st-note.com/production/uploads/images/68048838/picture_pc_cf0b3d41784d79dc38179b98f4b9df5a.png?width=1200)
垂直に引くので、下のようになりました。
![スクリーンショット 2021-12-19 10.11.09](https://assets.st-note.com/production/uploads/images/68048875/picture_pc_a9ffc3aa1cdddbc8d819ddb2d3ab53c5.png?width=1200)
7 Hについて(水平線を引く)
Hは水平に引きます。
なお、こんな感じでマイナスの指定も可能です。
![スクリーンショット 2021-12-19 10.13.02](https://assets.st-note.com/production/uploads/images/68049117/picture_pc_89d48a33861aa59292bac099c3273fe1.png?width=1200)
こんな感じで引けました。
![スクリーンショット 2021-12-19 10.15.36](https://assets.st-note.com/production/uploads/images/68049205/picture_pc_5bdac06b20329b15d0d44ad5c2b6c959.png?width=1200)
8 Zについて(スタート位置に結ぶ)
zは直近のスタート位置(M,m)に直線で結びつけます。
![スクリーンショット 2021-12-19 10.18.46](https://assets.st-note.com/production/uploads/images/68049417/picture_pc_3cb62a95a0d65dddf09b5ef6eddff500.png?width=1200)
こんな感じですね。
![スクリーンショット 2021-12-19 10.20.55](https://assets.st-note.com/production/uploads/images/68049488/picture_pc_b886a6c38db1a79ddb8c1f7320b8954c.png?width=1200)
9 fillについて(塗りつぶし)
図形が囲まれたので、第一章で出てきたfillについても見ていきましょう。
こんな風に指定すると
![スクリーンショット 2021-12-19 10.24.31](https://assets.st-note.com/production/uploads/images/68049719/picture_pc_2241aaabcbd2a1bc8ad48a37dedcf3a7.png?width=1200)
こんな風に、囲まれた部分が赤くなりました。
![スクリーンショット 2021-12-19 10.25.55](https://assets.st-note.com/production/uploads/images/68049753/picture_pc_27d0c9ee7ab822ded914fb51c5f5feab.png?width=1200)
10 stroke,stroke-widthについて
せっかくなのでstroke,stroke-widthも見てみましょう。
下のように設定してみました。
![スクリーンショット 2021-12-19 10.28.08](https://assets.st-note.com/production/uploads/images/68049897/picture_pc_d5a9d7e5926018126c8a2bb1e0ac229b.png?width=1200)
こんな感じになりました。予想通りでしたでしょうか?
![スクリーンショット 2021-12-19 10.30.00](https://assets.st-note.com/production/uploads/images/68049955/picture_pc_60ee0e9c9744faae8374f9f55c03d52a.png?width=1200)
11 Qについて(曲線をひく)(2次ベジェ曲線)
少し見にくくなってきましたので、先ほどまでのコードを消しました。
![スクリーンショット 2021-12-19 10.33.59](https://assets.st-note.com/production/uploads/images/68050402/picture_pc_d530efc22928e88e0b348c219052e161.png?width=1200)
Qは曲線を引きます。
ポイントは座標が二つ必要ということです。
例 Q 50 0 50 50
しかも上のように、空白でしか区切られていないのでわかりにくいです。
上の場合、スタート位置はMの(0,0)であり、それに対する二つの座標は
1つ目 (50,0) ⇨制御点と言います。
2つ目 (50,50) ⇨端点と言います。
おそらく、実際の画像をみる方がわかりやすいかもしれません。
![スクリーンショット 2021-12-19 10.41.44](https://assets.st-note.com/production/uploads/images/68051196/picture_pc_21284c8fb3af041f52e279908ace80b5.png?width=1200)
こんな感じになりました。
イメージが湧きましたでしょうか。
こんな風に2つの点を元に曲線を引くので、2次ベジェ曲線と言います。
12 Cについて(曲線をひく)(3次ベジェ曲線)
11章の応用です。
結局、制御点がもう一つ増えただけですね。
![スクリーンショット 2021-12-19 11.02.18](https://assets.st-note.com/production/uploads/images/68051887/picture_pc_56499121329e482c72db4de8ff625116.png?width=1200)
こんな感じになりました。
イメージ通りでしょうか。
![スクリーンショット 2021-12-19 11.05.41](https://assets.st-note.com/production/uploads/images/68051926/picture_pc_c09e81ed02c8be2a3f9a40c3a0dacb56.png?width=1200)
13 定型技法(直線 lineタグ)
ここからは定型的な図形の書き方を見ていきましょう。
まずは直線です。
<line x1="10" y1="10" x2="100" y2="100" stroke="blue" stroke-width="2"/>
![スクリーンショット 2021-12-19 11.16.54](https://assets.st-note.com/production/uploads/images/68052614/picture_pc_6371707ee051173fb549353e70fa67d1.png?width=1200)
こんな感じでlineタグで囲むと直線を引くことができます。
こんな感じですね。
![スクリーンショット 2021-12-19 11.20.07](https://assets.st-note.com/production/uploads/images/68052666/picture_pc_bbb04c03231c290e9c67af10d739bb26.png?width=1200)
14 定型技法(四角形 rectタグ)
次は四角形です。
四角形は最初の点と幅、高さがわかれば描画できますね。
![スクリーンショット 2021-12-19 11.21.28](https://assets.st-note.com/production/uploads/images/68052788/picture_pc_ec247d0db6ad3c12b4853434ac54161a.png?width=1200)
こんな感じになりました。
![スクリーンショット 2021-12-19 11.24.35](https://assets.st-note.com/production/uploads/images/68052849/picture_pc_374976ccca1fc5221a7e59cb4e18d597.png?width=1200)
15 定型技法(円 circleタグ)
次は円です。
コンパスの要領で、中心と半径がわかれば描けますね。
<circle cx="100" cy="70" r="50" stroke="blue" stroke-width="2" fill="none"/>
![スクリーンショット 2021-12-19 11.26.18](https://assets.st-note.com/production/uploads/images/68053048/picture_pc_b288618903c88664a5937ec04b6aedba.png?width=1200)
こんな風になりました。
![スクリーンショット 2021-12-19 11.29.05](https://assets.st-note.com/production/uploads/images/68053102/picture_pc_76284ba0718440342079a077d9bc7b79.png?width=1200)
16 定型技法(楕円 ellipseタグ)
次は楕円です。
楕円は次の3つで決まるようです。
①中心
②X方向の半径
③Y方向の半径
<ellipse cx="100" cy="80" rx="80" ry="30" stroke="blue" stroke-width="2" fill="none"/>
![スクリーンショット 2021-12-19 11.30.55](https://assets.st-note.com/production/uploads/images/68053402/picture_pc_1e37b957d5fbb2ad212289df68be91b5.png?width=1200)
こんな感じになりました。
![スクリーンショット 2021-12-19 11.37.34](https://assets.st-note.com/production/uploads/images/68053494/picture_pc_83898503be41ebee632bace2fe3850f8.png?width=1200)
17 定型技法(折線 polylineタグ)
次は折線です。折れる箇所を指定しましょう。
<polyline points="50 50 100 25 150 75 200 65" stroke="blue" stroke-width="2" fill="none"/>
![スクリーンショット 2021-12-19 11.41.31](https://assets.st-note.com/production/uploads/images/68053687/picture_pc_1aa030ba033b875fab2235a7e5bc2475.png?width=1200)
こんな風になりました。
![スクリーンショット 2021-12-19 11.43.30](https://assets.st-note.com/production/uploads/images/68053721/picture_pc_011a9d01e560985976da9aaa1fef71a8.png?width=1200)
18 定型技法(多角形 polygonタグ)
次は多角形です。折れる箇所を指定しましょう。
<polygon points="50 50 100 200 50 150 0 200" stroke="blue" stroke-width="2" fill="none"/>
![スクリーンショット 2021-12-19 11.46.22](https://assets.st-note.com/production/uploads/images/68053939/picture_pc_78044e58f41fdff1aabc2a4a6c70c889.png?width=1200)
こんな感じになりました。
![スクリーンショット 2021-12-19 11.48.17](https://assets.st-note.com/production/uploads/images/68053980/picture_pc_4e8521b51145bfed6b42a1f024802e9d.png?width=1200)
19 点線の描写(stroke-dasharray)
点線も描いてみましょう。
下のようにstroke-dasharrayを用いると描けます。
<polygon points="50 50 100 200 50 150 0 200" stroke="blue" stroke-width="2" fill="none" stroke-dasharray="10 5"/>
![スクリーンショット 2021-12-19 11.53.25](https://assets.st-note.com/production/uploads/images/68054300/picture_pc_5783077b2656e249fc69049e2d93257b.png?width=1200)
こんな風になりました。
![スクリーンショット 2021-12-19 11.56.36](https://assets.st-note.com/production/uploads/images/68054337/picture_pc_736f1e384fb2a68a94ce1e31ca7cf4ad.png?width=1200)
もちろん、下のように曲線などでも行けますね。
![スクリーンショット 2021-12-19 11.58.19](https://assets.st-note.com/production/uploads/images/68054450/picture_pc_7d650913c4140c10a4acac0baa90ba8f.png?width=1200)
20 線の一部の色を変える(重ね合わせ)
svgでは描画箇所が同じであれば、下の行に描かれているものが上の行を上書きします。
![スクリーンショット 2021-12-19 12.02.44](https://assets.st-note.com/production/uploads/images/68054745/picture_pc_9f8f4558893934b09e53df00e54ad678.png?width=1200)
<polygon points="50 50 100 200 50 150 0 200" stroke="blue" stroke-width="2" fill="lightpink" stroke-dasharray="10 5"/>
<ellipse cx="100" cy="80" rx="80" ry="30" stroke="blue" stroke-width="2" fill="lightgreen"/>
上のように描いた場合、X座標が100~150の範囲で赤色が上書きされます。
こんな感じです。
![スクリーンショット 2021-12-19 12.05.49](https://assets.st-note.com/production/uploads/images/68054853/picture_pc_dc00d845fa29757a83bf79b603dd24a9.png?width=1200)
21 Animationの基礎を学ぼう。(animateタグ)
では、ここからは動きを加えていきましょう。
下のような「animate」タグで囲むことになります。
<circle cx = "30" cy="30" r="20" fill="blue">
<animate attributeName="cx" dur="5s" from="30" to="270" repeatCount="indefinite"/>
</circle>
![スクリーンショット 2021-12-19 12.23.36](https://assets.st-note.com/production/uploads/images/68056134/picture_pc_63283ec7a373be116b7d8467e595f8a3.png?width=1200)
うまく動画が載せられず残念でしたが、下のように右まで進み、また左に戻って進むようなものができました。
![スクリーンショット 2021-12-19 12.36.53](https://assets.st-note.com/production/uploads/images/68056756/picture_pc_9191287c9822f2c7340aef61186fc0e3.png?width=1200)
22 animateタグの構成を確認しよう
では構成を確認しましょう。
![スクリーンショット 2021-12-19 12.23.36](https://assets.st-note.com/production/uploads/images/68056821/picture_pc_92fbe6bb8493f8fe2f853ceb38c89629.png?width=1200)
① attributeName
たぶんこれが一番大事です。これは「何を動かすのか」というものです。
今回は「cx」です。
「cx」は上の「circle」タグで円の中心(X軸)を表しています。
つまり、今回のアニメーションは円の中心(X軸)を右に動かすことによって、円自体を動かすアニメーションです。
② dur
これはそのままの意味で、「duration」(継続時間)です。今回は5秒かけてアニメーションを動かすという設定になっています。
③ from to
これは今回動かす円のX座標をどこからどこまで動かすのかという設定です。
今回はX=30からX=270まで動かすという指定をしています。
④ repeatCount
これは何回繰り返すかです。
今回は「indefinite」(無限)で設定していますが、回数を指定することで、何回かという設定も可能です。
23 いろんなアニメーションを作ろう(大きくなる円)
では、いろんなアニメーションを作ってみましょう。
例えば、円が大きくなるようにするなら、半径を動かせばいいですね。
![スクリーンショット 2021-12-19 12.52.06](https://assets.st-note.com/production/uploads/images/68057569/picture_pc_8bbad0f9fecedbdc8ccda9b8aca5ef7e.png?width=1200)
ちなみに
begin="click"
とすることで、クリックすることでアニメーションが動き出す仕様になります。
下のような感じです。
![スクリーンショット 2021-12-19 13.07.28](https://assets.st-note.com/production/uploads/images/68058289/picture_pc_5749d7c24dd1f9b2bcb97650c950c099.png?width=1200)
![スクリーンショット 2021-12-19 13.07.14](https://assets.st-note.com/production/uploads/images/68058292/picture_pc_9b33009f9a515e4d25ed8bb83dae4feb.png?width=1200)
24 いろんなアニメーションを作ろう(色を変えよう)
色を変える場合も塗りつぶしである「fill」を属性に指定すればいいですね。
![スクリーンショット 2021-12-19 13.52.00](https://assets.st-note.com/production/uploads/images/68060730/picture_pc_9e4edca2ac5ef93037378816fd98b8d7.png?width=1200)
このように青からピンクに変わるものができました。
![スクリーンショット 2021-12-19 13.55.33](https://assets.st-note.com/production/uploads/images/68060827/picture_pc_7fee28539dc9e0fb2bff4b16109db583.png?width=1200)
![スクリーンショット 2021-12-19 13.55.47](https://assets.st-note.com/production/uploads/images/68060843/picture_pc_5b51d8656cccefcd3fea095ac7cda39b.png?width=1200)
25 いろんなアニメーションを作ろう(透明度を変えよう)
透明にする場合はopacityを設定すれば良いですね。
<animate attributeType="CSS" attributeName="opacity" dur="3s" from="1" to="0" repeatCount="indefinite"/>
![スクリーンショット 2021-12-19 14.15.07](https://assets.st-note.com/production/uploads/images/68062089/picture_pc_9e7b15499f226dbd545f2499350f6661.png?width=1200)
ちなみに今まで「attributeType」を設定していなかったのですが、こちらも設定をしたほうが良さそうでした。
こちらは図形要素自体の属性かCSSの属性かによって「XML」か「CSS」に設定します。
今回はコードの中にある属性ではありませんので、「CSS」の設定になりました。
![スクリーンショット 2021-12-19 14.24.22](https://assets.st-note.com/production/uploads/images/68062674/picture_pc_032362f289da81320c6f47c9280246a4.png?width=1200)
番外編
<svg width="500" height="500" xmlns="http://www.w3.org/2000/svg">
<path d="M 25,100 A 75,75 0 1,1 175,100 A 75,75 0 1,1 25,100 z" stroke="black" fill="lightblue"/>
<circle fill="red" r="5">
<animateMotion path="M 25,100 A 75,75 0 1,1 175,100 A 75,75 0 1,1 25,100 z" begin="0s" dur="6s" calcMode="linear" repeatCount="indefinite"/>
</circle>
</svg>
![](https://assets.st-note.com/img/1648248395346-35BSwB4az5.png?width=1200)
今回は以上です。
これで色々なsvgを作ることができ、結果色々なフルオンチェーンNFTを作ることができると思います。
ぜひやってみてくださいね。
サポートをしていただけたらすごく嬉しいです😄 いただけたサポートを励みに、これからもコツコツ頑張っていきます😊