【保存版】SVG徹底解説!②(図形の変形とグラデーション)
こんにちは、CryptoGamesの高橋です。
クリスペの会社です。
本日はSVGの図形の変更方法とグラデーションについて学んでいきます。
なお、第一弾はこちらをご参照ください。
また、こちらの素晴らしい記事を大いに参考にしました。よかったら元のページも見てみてください。
1 図形の変形について(trnasform属性)
まずはtransform属性です。
下の画像を見てください。
このように反転した画像を作ってみたり、ランダムで太陽の位置を動かしたりすることができるようになります。
では、見ていきましょう。
1ー0 概要
まず、transformで座標軸を動かすことを「アフィン変換」というようです。
そして、上のようにいくつかの関数が用意されています。
今回はこのうち、次の4つを扱います。
① 移動 ⇨ translate
② 拡大・縮小・反転 ⇨ scale
③ 回転 ⇨ rotate
④ 傾斜 ⇨ skewX skewY
1ー1 移動(translate)
ランダム数を組み合わせることにより、場所を変えることができます。
ポイント
① 書き方 trasform="translate(30, 40)"
② 図形を(30,40)方向に移動させる
1ー2 拡大・縮小・反転(scale)
ランダム数を組み合わせることで、反転までできてしまいます。
ポイント
① 書き方は transform="scale(2,3)"
② X方向に2倍、Y方向に3倍となる。
③ 引数が一つの場合(scale(2)など) ⇨ X,Yともに2倍になる
1ー3 回転(rotate)
こちらで回転ができます。
1ー4 傾斜(skewX skewY)
私はまだ、これをどう使うのかがイメージできていませんが、傾けるようですね。
2 グラデーション
2ー0 概要
グラデーションには3種類があり
① 帯状 linerGradient
② 放射状 radialGradient
③ 不定形 meshGradient
があります。
ポイントはグラデーションにIDをつけ、外からurl(#)により、IDを使って呼び出すことだと思います。
2ー1 gradientUnits(どこにグラデーションを設置するか)
ここがグラデーションの一つの山だと思います。
グラデーションをどこに設置するかという話です。
まずは、2つの種類があります。
gradientUnits
① キャンバス全体 ⇨ userSpaceOnUse
② 指定した図形の中 ⇨ objectBoundingBox
上の二つの点線で囲まれた図形のうち、
① 上(userSpaceOnUse) ⇨ 周りと馴染んでいる
② 下(objectBoundingBox) ⇨ 独自のグラデーション
2ー2 勾配ベクトル
どこから何色で切り替わるのかを示すのが勾配ベクトル
① offset → %、もしくは「0 ~1」で開始位置を設定
② color → 色
③ opacity → 色の元の色としての透明度
2ー3 敷詰め方法(繰り返し)
グラデーションを1度だけか、もしくは繰り返すのかの設定が「spreadMethod」です。
① 1度だけ ⇨ pad
② 単純な繰り返し ⇨ repeat
③ 反射繰り返し ⇨ reflect
③について、上手い表現が見つからないですが、見ていただけるとわかると思います。
今回は全て幅50です。repeatは50の幅が終わると、再び同じグラデーションを描いています。
一方、relfectの場合は画像の75の位置から、さらに50かけて元の色に戻っています。
結果として、元に戻るまでの幅100(50+50)で繰り返しを行っています。
2ー4 グラデーションの変形
右下の画像のように、簡単にグラデーションの位置を変えることができます。
「rotate」は回転なので、45度回転してグラデーションができています。
2ー5 グラデーションの代替
グラデーションが正しく反映されなかった時に備えて、代替の色を設定しています。
2ー6 理解度チェック(userSpaceOnUse)
では具体的に見てみましょう。
ここがおそらく頑張りどころです。まず、この3つは全て
gradientUnits="userSpaceonUse"です。
つまり、キャンバスそのものにグラデーションを描き、その後にただ図形をはめ込むだけです。
一番上は(0,0)から(50,50)までグラデーションを適用し、それで終わっています。
なので、(10,10)から幅180、高さ60を切り取ってはいますが(50,50)以降はそもそもグラデーションが終了しているため、白になります。
一方、2番目は(0,0)から(50,50)のグラデーションを繰り返しています。そして、その繰り返しているところに図形をはめ込んでいますので、最後までグラデーションになっています。
2ー7 理解度チェック(objectBoundingBox)
さて、次はobjectBoundingBoxです。
こちらは、図形そのものにグラデーションを適用する考えでしたね。
見てみると、X,Yが50%のところまでをグラデーションにして、repeatで繰り返しています。
図形の中で完結するので、グラデーションが最初から始まっていますね。
2ー8 放射型グラデーションについて
次は放射型グラデーションのradicalGradientについてです。
ただ、「焦点」以外はあまり変わらないかもしれません。
早速やってみましょう。
2−9 userSpaceOnUseの場合
キャンバス自体にグラデーションがかかるのでしたね。
それさえわかれば、考え方はlinerGradientと同じです。
2ー10 objectBoundingBoxの場合
こちらは、中心、半径がないのがデフォルトで設定されているのが特徴です。
その図形内でグラデーションが完結するため、図形の中心から始まり、offsetの%の位置でどのようになるかが決定します。
2ー11 焦点の設定について
焦点を設定することで、グラデーションが変わります。
形としては「中心」をもとに作られますが、グラデーションは「焦点」を元に作られます。
2ー12 境界線の設定について
下のように、同じ%で違う色を指定すると、境界線になる。
以上です。
ぜひ、やってみてください。
私も頑張ってみようと思います。
サポートをしていただけたらすごく嬉しいです😄 いただけたサポートを励みに、これからもコツコツ頑張っていきます😊