見出し画像

【保存版】SVG徹底解説!②(図形の変形とグラデーション)

こんにちは、CryptoGamesの高橋です。

クリスペの会社です。


本日はSVGの図形の変更方法とグラデーションについて学んでいきます。

なお、第一弾はこちらをご参照ください。

また、こちらの素晴らしい記事を大いに参考にしました。よかったら元のページも見てみてください。

1 図形の変形について(trnasform属性)

まずはtransform属性です。

下の画像を見てください。

スクリーンショット 2021-12-26 7.51.27

このように反転した画像を作ってみたり、ランダムで太陽の位置を動かしたりすることができるようになります。

では、見ていきましょう。

1ー0 概要

まず、transformで座標軸を動かすことを「アフィン変換」というようです。

スクリーンショット 2021-12-26 10.06.17

そして、上のようにいくつかの関数が用意されています。

今回はこのうち、次の4つを扱います。

① 移動       ⇨ translate
② 拡大・縮小・反転 ⇨ scale
③ 回転       ⇨ rotate
④ 傾斜       ⇨ skewX  skewY

1ー1 移動(translate)

ランダム数を組み合わせることにより、場所を変えることができます。

スクリーンショット 2021-12-26 10.20.16

ポイント
① 書き方 trasform="translate(30, 40)"
② 図形を(30,40)方向に移動させる

1ー2 拡大・縮小・反転(scale)

ランダム数を組み合わせることで、反転までできてしまいます。

スクリーンショット 2021-12-26 10.22.08

ポイント
① 書き方は transform="scale(2,3)"
② X方向に2倍、Y方向に3倍となる。
③ 引数が一つの場合(scale(2)など) ⇨ X,Yともに2倍になる

スクリーンショット 2021-12-26 10.18.33

1ー3 回転(rotate)

こちらで回転ができます。

スクリーンショット 2021-12-26 10.25.34

1ー4 傾斜(skewX  skewY

私はまだ、これをどう使うのかがイメージできていませんが、傾けるようですね。

スクリーンショット 2021-12-26 10.46.30

2 グラデーション

2ー0 概要

スクリーンショット 2021-12-26 10.50.39

グラデーションには3種類があり
① 帯状  linerGradient
② 放射状 radialGradient
③ 不定形 meshGradient

があります。

ポイントはグラデーションにIDをつけ、外からurl(#)により、IDを使って呼び出すことだと思います。

2ー1 gradientUnits(どこにグラデーションを設置するか)

ここがグラデーションの一つの山だと思います。

グラデーションをどこに設置するかという話です。

まずは、2つの種類があります。

スクリーンショット 2021-12-26 14.03.29

gradientUnits
① キャンバス全体  ⇨ userSpaceOnUse
② 指定した図形の中 ⇨ objectBoundingBox

上の二つの点線で囲まれた図形のうち、

 ① 上(userSpaceOnUse)  ⇨ 周りと馴染んでいる
 ② 下(objectBoundingBox)  ⇨ 独自のグラデーション 

2ー2 勾配ベクトル

どこから何色で切り替わるのかを示すのが勾配ベクトル

スクリーンショット 2021-12-26 14.15.44

① offset → %、もしくは「0 ~1」で開始位置を設定
② color → 色
③ opacity → 色の元の色としての透明度

2ー3 敷詰め方法(繰り返し)

グラデーションを1度だけか、もしくは繰り返すのかの設定が「spreadMethod」です。

スクリーンショット 2021-12-26 14.26.02

① 1度だけ    ⇨ pad
② 単純な繰り返し ⇨ repeat
③ 反射繰り返し  ⇨ reflect

③について、上手い表現が見つからないですが、見ていただけるとわかると思います。

今回は全て幅50です。repeatは50の幅が終わると、再び同じグラデーションを描いています。

一方、relfectの場合は画像の75の位置から、さらに50かけて元の色に戻っています。

結果として、元に戻るまでの幅100(50+50)で繰り返しを行っています。

2ー4 グラデーションの変形

右下の画像のように、簡単にグラデーションの位置を変えることができます。

スクリーンショット 2021-12-26 14.36.37

「rotate」は回転なので、45度回転してグラデーションができています。

2ー5 グラデーションの代替

グラデーションが正しく反映されなかった時に備えて、代替の色を設定しています。

スクリーンショット 2021-12-26 14.41.36

2ー6 理解度チェック(userSpaceOnUse)

では具体的に見てみましょう。

ここがおそらく頑張りどころです。まず、この3つは全て
gradientUnits="userSpaceonUse"です。

つまり、キャンバスそのものにグラデーションを描き、その後にただ図形をはめ込むだけです。

スクリーンショット 2021-12-26 14.49.51

一番上は(0,0)から(50,50)までグラデーションを適用し、それで終わっています。

なので、(10,10)から幅180、高さ60を切り取ってはいますが(50,50)以降はそもそもグラデーションが終了しているため、白になります。

一方、2番目は(0,0)から(50,50)のグラデーションを繰り返しています。そして、その繰り返しているところに図形をはめ込んでいますので、最後までグラデーションになっています。

2ー7 理解度チェック(objectBoundingBox)

さて、次はobjectBoundingBoxです。

こちらは、図形そのものにグラデーションを適用する考えでしたね。

スクリーンショット 2021-12-26 15.07.58

見てみると、X,Yが50%のところまでをグラデーションにして、repeatで繰り返しています。

図形の中で完結するので、グラデーションが最初から始まっていますね。

2ー8 放射型グラデーションについて

次は放射型グラデーションのradicalGradientについてです。

ただ、「焦点」以外はあまり変わらないかもしれません。

早速やってみましょう。

スクリーンショット 2021-12-26 15.13.37

2−9 userSpaceOnUseの場合

キャンバス自体にグラデーションがかかるのでしたね。

それさえわかれば、考え方はlinerGradientと同じです。

スクリーンショット 2021-12-26 15.16.51

2ー10 objectBoundingBoxの場合

こちらは、中心、半径がないのがデフォルトで設定されているのが特徴です。

その図形内でグラデーションが完結するため、図形の中心から始まり、offsetの%の位置でどのようになるかが決定します。

スクリーンショット 2021-12-26 15.24.40

2ー11 焦点の設定について

焦点を設定することで、グラデーションが変わります。

形としては「中心」をもとに作られますが、グラデーションは「焦点」を元に作られます。

スクリーンショット 2021-12-26 15.53.24

2ー12 境界線の設定について

下のように、同じ%で違う色を指定すると、境界線になる。

スクリーンショット 2021-12-26 16.04.56

以上です。

ぜひ、やってみてください。

私も頑張ってみようと思います。

サポートをしていただけたらすごく嬉しいです😄 いただけたサポートを励みに、これからもコツコツ頑張っていきます😊