動的コンテンツを征するには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を深掘りするには知識もなければ時間がない。。
そこで、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や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(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はDOMと統合されているため操作が簡単。Canvasは低レベルAPIのため柔軟だが複雑。
用途: SVGは高品質なインタラクティブグラフィックに、Canvasは高パフォーマンスなリアルタイムグラフィックに適している。
JPGやPNG:既存の画像データとして保存される静的な画像ファイル。
SVG:ベクターグラフィックスを描画するためのXMLコード。
Canvas:ビットマップ画像を描画するためのHTML要素とJavaScript API。
比較の詳細はこちらからご覧ください。
↓↓↓↓
SVGとHTML5Canvasの比較その2
svgは要素で動かす。
animate attributeName="
animateTransform attributeName=
回転や移動などの動作するための要素
↓↓↓↓
SVGとHTML5Canvasの比較その2
svgは要素で動かす。
animate attributeName="
animateTransform attributeName=
回転や移動などの動作するための要素
SVG基本
例:四角形
HTMLのタグに似ている。
CSSも利用できる。
カラーは「fill:」を使う
HTMLのタグに似ている。
CSSも利用できる。
カラーは「fill:」を使う
<svg width="100" height="100">
<rect width="100" height="100" style="fill:blue"/>
</svg>
canvasの基本
<canvas id="myCanvas" width="400" height="400">
HTML側にmyCanvasを配置しJSで描写するのが基本。
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();
なんとなく基本がみえて来たところで、SVGとCanvasを使用したサンプルを作り、検証してみることとしました。
サンプルその1 SVG版(SVGアニメーション)
SVGをベースにJSでランダムを使用したミニアプリを
作ってみました。
作ってみました。
プロトタイプ1号(SVG版)
HTMLをベースに
SVGをランダムで呼び出す単純なものです。
図形と文字はSVGを使用しています。
制御(js)は、クリックアクションとランダムのみです。
↓↓↓↓
「 プロトタイプ1号(SVG版)のリンク先へ 」
SVGをランダムで呼び出す単純なものです。
図形と文字はSVGを使用しています。
制御(js)は、クリックアクションとランダムのみです。
↓↓↓↓
「 プロトタイプ1号(SVG版)のリンク先へ 」
プロトタイプ2号(SVG版)
プロトタイプ3号(SVG版)完成品
SVGポイント1
SVGを外部からリンクして簡略化します。
何個でも入れられます。
同じものは入れる場合、<symbol>で使いまわしできます。
何個でも入れられます。
同じものは入れる場合、<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>要素で動かします。
<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版)
プロトタイプ2号(Canvas版)
プロトタイプ3号(Canvas版)完成版
ベースはadobe animateで作ってます。
ベースとなるステージ、UI系のボタン類。画像の取り込み。文字の動きなどで使用してます。
JSについては、createjs.comを参考にしています。
JSについては、createjs.comを参考にしています。
Adobe Animateの画面内にいて
ポイント1
ステージづくりが基本。
スタート→プレイ→ゲームクリア→ゲームオーバー
各ステージに画像やスクリプトを組み込みます。
スタート→プレイ→ゲームクリア→ゲームオーバー
各ステージに画像やスクリプトを組み込みます。
まとめ
SVGとHTML5Canvasを検証してみて、なんとなくですが、基本がえてきたので、次は派生したJS系のライブりを試してみようと思います。
また、Adobe Animateは、HTML5Canvasなら使えそうですが、制御系は弱くJSを直接編集した方が、早いと感じました。今回はできませんでしたが、配列を使えば、レベルが上がるごとに連続してプレイできるようにできると思うので、時間があれば試してみようと思います。
まだまだ、勉強不足ですが、少しでも魅力的で動きのあるWEBサイトの探求を今後も続けていければと思います。
※じつはまだ、試作があります。ほんのお遊びで・・・ChatGTPで試してみました。
よろしければ、下記のリンク先よりご覧ください。
↓↓↓↓↓
「 シューティング試作1号 」
そして2号
「 シューティング試作2号 」
AIの力恐るべし・・
最後までお付き合いいただき有難うございました。
また、Adobe Animateは、HTML5Canvasなら使えそうですが、制御系は弱くJSを直接編集した方が、早いと感じました。今回はできませんでしたが、配列を使えば、レベルが上がるごとに連続してプレイできるようにできると思うので、時間があれば試してみようと思います。
まだまだ、勉強不足ですが、少しでも魅力的で動きのあるWEBサイトの探求を今後も続けていければと思います。
※じつはまだ、試作があります。ほんのお遊びで・・・ChatGTPで試してみました。
よろしければ、下記のリンク先よりご覧ください。
↓↓↓↓↓
「 シューティング試作1号 」
そして2号
「 シューティング試作2号 」
AIの力恐るべし・・
最後までお付き合いいただき有難うございました。