キャンバス ドリブンの背景画像

背景画像をプログラムでアニメーション化する

背景画像をアニメーション化する主な方法は 2 つあります

  1. CSS スプライトを使用して、JS で background-position を更新します。
  2. .toDataURL() を使用したハッキング。

最初の方法は、事前に画像を用意できる場合は有効ですが、ソースをプログラムで生成する必要がある場合(たとえば <canvas> で生成する場合)はどうすればよいでしょうか。1 の解決策は、キャンバスで .toDataURL() を使用し、生成された URL を背景に設定することです。

while(1) {
    var url = canvas.toDataURL('image/jpeg');
    el.style.background = 'url(' + url + ')';
}

この方法には 2 つの問題があります。

  1. data: URL を使用すると、生成される画像のサイズが約 33% 増加します。
  2. DOM の操作が大量に行われている(el.style)。

どちらの方法も効率が悪く、常に 60 fps の滑らかなウェブアプリには適していません。

2D キャンバスを背景として使用する

背景としてのキャンバスのデモ
デモ

実は、WebKit には 長年存在している非標準の API があり、キャンバスを背景のソースとして使用できます。残念ながら、この機能に関する公開されている仕様はありません

まず、back の URL を指定する代わりに、

.bg {
    background: url(bg.png) no-repeat 50% 50%;
}

-webkit-canvas() を使用して、文字列識別子をキャンバス コンテキストに参照します。

.canvas-bg {
    background: -webkit-canvas(animation) no-repeat 50% 50%;
}

次に、特別なバージョンの .getContext() を使用して 2D コンテキストを作成する必要があります。

var ctx = document.getCSSCanvasContext('2d', 'animation', 300, 300);

Dave Hyatt からの追加情報:

アニメーション

デモで見たように、requestAnimationFrame() を再利用してアニメーションを駆動できます。この方法では、一度設定すると CSS とキャンバス要素の関連付けが維持されるため、便利です。DOM を操作する必要はありません。

Chrome でデモがアニメーション表示されない

現在の Chrome の安定版(バージョン 23)には crbug.com/161699 があり、requestAnimationFrame() アニメーションがバックグラウンドを適切に更新できません。この問題は Chrome 25(現在は Canary)で修正されています。デモも現在の Safari で正常に動作します。

パフォーマンス上のメリット

ここではキャンバスについて説明します。ハードウェア アクセラレーションによるアニメーションが完全に有効になりました(少なくとも、この機能が動作するブラウザでは)。繰り返しになりますが、JS から DOM を操作する必要はありません

背景として WebGL を使用する

ちょっと待ってください。これは、WebGL を使用して CSS の背景を動かすことができるということですか?もちろん、そうですよね。WebGL は単なるキャンバスの 3D コンテキストです。「2d」の代わりに「experimental-webgl」を指定するだけで、完了です。

var gl = document.getCSSCanvasContext('experimental-webgl', 'animation', 300, 150);

頂点シェーダーとフラグメント シェーダーを使用して背景が描画された div を含む概念実証は、こちらをご覧ください。デモ

その他のアプローチ

Mozilla はかなり前から -moz-element()MDN)を導入しています。これは CSS Image Values and Replaced Content Module Level 4 仕様の一部であり、任意の HTML(動画、キャンバス、DOM コンテンツなど)から生成された画像を作成できます。ただし、DOM のスナップショット イメージへのフルアクセスにはセキュリティ上の懸念があります。これが、他のブラウザがこの機能を導入していない主な理由です。