技術は私たちの力。技術は私たちの楽しみ。 Creative Developer BLOG 技術部ブログ
Technology is our strength. Technology is what we enjoy.

動的コンテンツを征するにはSVGやCanvasの基礎知識から・・

2024-06-11 勉強会
最近、とあるWEB制作の依頼でイラストの一部を動かしたいという要望をいただきました。昔ならSWFファイル(Flash)を使って簡単に解決できたのに、現在ではJavaScriptを駆使するしかなく、正直面倒に感じました。

そこで、Adobe Animateを使ってSVGとして書き出す方法を試してみました。公式サイトにはアニメーションを含むSVGの出力が可能だと書かれていたので、これで解決だと思ったのですが、実際に出力されたSVGは動きません。Canvas形式ならアニメーションが動くのに、なぜSVGではダメなのか理解に苦しみました。ネットで調べても参考になる例が見つからず、無力感を感じました。

SWF(Flash)が消え、jQueryも徐々に使われなくなった現在では、HTML5、CSS3、JavaScript(特にReactやVue.jsなどのフレームワーク)、SVG、WebGL、WebAssemblyなどの技術が主流です。しかし、ReactやVue.jsを深掘りするには知識もなければ時間がない。。

動的コンテンツを征するにはSVGやCanvasの知識が・・

JavaScriptのフレームワークやライブラリを使って動的コンテンツを作るには、SVGやCanvasの知識が必須で
これらの技術を理解しないと、前に進むのが難しいと感じました。
そこで今回は、SVGやCanvasを深掘りして、何ができるのかを試してみることにしました。(自己満足ですが)

SVGとHTML5 Canvasについて

SVGとCanvasは、ウェブ上でグラフィックスを描画するための主要な技術です。
どちらも異なるアプローチを取りますが、両方ともウェブアプリケーションやウェブサイトで豊富な視覚的なコンテンツを生成するために使用されます。

SVG(Scalable Vector Graphics)はXMLベースのベクターイメージ形式(画像フォーマット)であり、要素と属性を使用して図形、テキスト、画像を記述します。これはスケーラブルであり、高品質のイメージを作成するために広く使用されています。SVGはJavaScriptで直接操作することができ、DOM(Document Object Model)を使用してSVGの要素を動的に変更および操作することができます。JavaScriptで動的に操作も可能。

一方、CanvasはHTML5の要素であり、JavaScriptを使用して動的に描画されるビットマップ画像を作成します。(ビットマップ画像を描画するためのAPI)
Canvasはピクセルベースであり、描画された内容は静的であり、SVGよりも高度なアニメーションやグラフィックス処理が必要な場合に使用されます。

SVGとHTML5 Canvasの比較

SVGとHTML5 Canvasの比較を簡単にまとめました。

解像度: SVGは解像度に依存せず、Canvasは解像度に依存する。
操作性: SVGはDOMと統合されているため操作が簡単。Canvasは低レベルAPIのため柔軟だが複雑。
用途: SVGは高品質なインタラクティブグラフィックに、Canvasは高パフォーマンスなリアルタイムグラフィックに適している。


JPGやPNG:既存の画像データとして保存される静的な画像ファイル。
SVG:ベクターグラフィックスを描画するためのXMLコード。
Canvas:ビットマップ画像を描画するためのHTML要素とJavaScript API。

比較の詳細はこちらからご覧ください。
↓↓↓↓
SVGとHTML5Canvasの比較その2

svgは要素で動かす。
animate attributeName="
animateTransform attributeName=
回転や移動などの動作するための要素

SVG基本

例:四角形
HTMLのタグに似ている。
CSSも利用できる。
カラーは「fill:」を使う

<svg width="100" height="100">
<rect width="100" height="100" style="fill:blue"/>
</svg>
ではSVGの基本を確認してみます。
↓↓↓↓
SVGの基本の参考ページへ

所感ですが、
コード見る限り
SVGの方が短い、取っ付きやすい気がします。

canvasの基本

<canvas id="myCanvas" width="400" height="400">

HTML側にmyCanvasを配置しJSで描写するのが基本。

// キャンバスとコンテキストを取得
var canvas = document.getElementById('myCanvas');
var context = canvas.getContext('2d');

// 四角形を描画
context.fillStyle = 'blue';
context.fillRect(50, 50, 100, 100);

// 線で四角形を描画
context.strokeStyle = 'red';
context.lineWidth = 5;
context.strokeRect(200, 50, 100, 100);

// 円を描画
context.beginPath();
context.arc(150, 250, 50, 0, Math.PI * 2, false);
context.fillStyle = 'green';
context.fill();
context.lineWidth = 5;
context.strokeStyle = '#003300';
context.stroke();
canvasの基本をご参考までにご案内します。
↓↓↓↓↓
HTML5Canvasの基本ページへ  」

なんとなく基本がみえて来たところで、SVGとCanvasを使用したサンプルを作り、検証してみることとしました。

サンプルその1 SVG版(SVGアニメーション)

SVGをベースにJSでランダムを使用したミニアプリを
作ってみました。

プロトタイプ1号(SVG版)

HTMLをベースに
SVGをランダムで呼び出す単純なものです。
図形と文字はSVGを使用しています。
制御(js)は、クリックアクションとランダムのみです。
↓↓↓↓
「 プロトタイプ1号(SVG版)のリンク先へ 」

プロトタイプ2号(SVG版)

プロトタイプ1号にステージを3つ用意し
スタート画面、実行画面、結果画面に出力するようにしました。
↓↓↓↓
「 プロトタイプ2号(SVG版)のリンク先へ 」

プロトタイプ3号(SVG版)完成品

プロトタイプ2号をベースに、SVGを読み込み画像を
入れ、文字を動かしました。
↓↓↓↓
「 プロトタイプ3号(SVG版)のリンク先へ 」

SVGポイント1

SVGを外部からリンクして簡略化します。
何個でも入れられます。
同じものは入れる場合、<symbol>で使いまわしできます。
<svg xmlns="http://www.w3.org/2000/svg" width="350" height="350">
<!-- メインイメージ SVGを外部からリンクする-->
<image href="omikuji01.svg" width="350" height="350" />
</svg>

フェイドインはCSSで設定してます。
.fade-in {
animation: fadeIn 6s forwards; /* テキストのフェイドインの時間 */
}
@keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
制御はJSです。

SVGポイント2

テキストはバラバラにして動かします。
<tspan> tspan要素を使用。
バラバラの文字は<animate>要素で動かします。
<svg>
<!-- "カラカラ" 文字 -->
<text x="175" y="175" font-size="30" font-family="Arial" text-anchor="middle" alignment-baseline="middle">
<!-- 各文字に対するtspan要素にする -->
<tspan id="char1" fill="#fff" x="150">カ</tspanc
<tspan id="char2" fill="#fff" x="175">ラ</tspan>
<tspan id="char3" fill="#fff" x="200">カ</tspan>
<tspan id="char4" fill="#fff" x="225">ラ</tspan>
</text>

<!-- 文字のアニメーションにする -->
<!-- 1文字目のアニメーション -->
<animate xlink:href="#char1" attributeName="y" from="175" to="145" dur="0.5s" begin="0s" repeatCount="indefinite" fill="freeze" />
<animate xlink:href="#char1" attributeName="y" from="145" to="175" dur="0.5s" begin="0.5s" repeatCount="indefinite" fill="freeze" />

<!-- 2文字目のアニメーション -->
<animate xlink:href="#char2" attributeName="y" from="175" to="145" dur="0.5s" begin="0.2s" repeatCount="indefinite" fill="freeze" />
<animate xlink:href="#char2" attributeName="y" from="145" to="175" dur="0.5s" begin="0.7s" repeatCount="indefinite" fill="freeze" />

<!-- 3文字目のアニメーション -->
<animate xlink:href="#char3" attributeName="y" from="175" to="145" dur="0.5s" begin="0.4s" repeatCount="indefinite" fill="freeze" />
<animate xlink:href="#char3" attributeName="y" from="145" to="175" dur="0.5s" begin="0.9s" repeatCount="indefinite" fill="freeze" />

<!-- 4文字目のアニメーション -->
<animate xlink:href="#char4" attributeName="y" from="175" to="145" dur="0.5s" begin="0.6s" repeatCount="indefinite" fill="freeze" />
<animate xlink:href="#char4" attributeName="y" from="145" to="175" dur="0.5s" begin="1.1s" repeatCount="indefinite" fill="freeze" />
</svg>

サンプルその2 Canvas版

今度は、html5 Canvasをベースにしたミニアプリを作てみました。

プロトタイプ1号(Canvas版)

よくある画像変化ゲーム(アハ体験)を簡素ですが
作ってみました。
クリックアクション、フェイドイン、フェイドアウトを使用しています。
↓↓↓↓
「 プロトタイプ1号(Canvas版)のリンク先へ 」

プロトタイプ2号(Canvas版)

プロトタイプ1号をベースにタイマーを設置し
時間で制御するようにしました。
↓↓↓↓
「 プロトタイプ2号(Canvas版)のリンク先へ 」

プロトタイプ3号(Canvas版)完成版

プロトタイプ2号をベースに見た目を整えました。
実際にプレイできるので、クリアできるか試してください。
↓↓↓↓
「 プロトタイプ3号(Canvas版)のリンク先へ 」

ベースはadobe animateで作ってます。

ベースとなるステージ、UI系のボタン類。画像の取り込み。文字の動きなどで使用してます。
JSについては、createjs.comを参考にしています。

Adobe Animateの画面内にいて

ポイント1

ステージづくりが基本。
スタート→プレイ→ゲームクリア→ゲームオーバー
各ステージに画像やスクリプトを組み込みます。

まとめ

SVGとHTML5Canvasを検証してみて、なんとなくですが、基本がえてきたので、次は派生したJS系のライブりを試してみようと思います。
また、Adobe Animateは、HTML5Canvasなら使えそうですが、制御系は弱くJSを直接編集した方が、早いと感じました。今回はできませんでしたが、配列を使えば、レベルが上がるごとに連続してプレイできるようにできると思うので、時間があれば試してみようと思います。

まだまだ、勉強不足ですが、少しでも魅力的で動きのあるWEBサイトの探求を今後も続けていければと思います。

※じつはまだ、試作があります。ほんのお遊びで・・・ChatGTPで試してみました。
よろしければ、下記のリンク先よりご覧ください。
 ↓↓↓↓↓
「 シューティング試作1号 」
そして2号
「 シューティング試作2号 」
AIの力恐るべし・・

最後までお付き合いいただき有難うございました。
記事一覧へ

Member

システム部開発ユニット
システム部SIユニット
クリエイティブ戦略部デザインユニット
クリエイティブ戦略部プランニングユニット
管理部