
目次
Webの透過アニメーションなら、ページ自体の背景がキャラクターの周りから見えるはずです。各フレームに黒・白・緑の背景や描き込まれた市松模様が固定されていては、同じ結果になりません。
ここではAnimGenから書き出した本物のWebM Alphaを使い、GIFで見た目だけを再現しません。まずブラウザで動くデモを開くか、HTMLサンプル一式をダウンロードし、対象ブラウザで同じファイルを試してください。
コードより先に実際の表示を見る
デモでは1つのキャラクター動画を明るいパネル、暗いパネル、グラデーションのHero領域に重ねています。3種類の背景で、透過が本物かどうかと、特定の色でだけ現れる縁の問題を見分けられます。
使用したファイルの実測値は次の通りです。
| 素材 | 実測値 | 役割 |
|---|---|---|
| 透過WebM | VP8 Alpha、512 × 512、24 FPS、4.00秒、1,611,685バイト | アニメーション |
| PNGポスター | 512 × 512 RGBA、121,667バイト | 初期表示と静止画への切り替え |
libvpx で96フレームをすべてデコードし、Alphaが0~255に分布することを確認しました。続いてmacOS 26.5.2のChrome 152.0.7977.84でページを開き、3本の動画が進み、透過画素の下に各背景が見えることを確認しました。幅500画素の狭い表示でもレイアウトを確認しています。
これはこのファイルと検証環境に対する結果です。通常のWebMが再生できても、WebM Alphaが正しく合成されるとは限りません。MDNの動画コーデックガイドはSafariでVP8/VP9動画のアルファ透過がサポートされない点に触れています。推測せず、対象ブラウザを製品要件として確認してください。
WebMとPNGを別ファイルで用意する
public/
└── animation/
├── character-run.webm
└── character-run.png
PNGは市松模様のスクリーンショットではなく、実際にアルファを持つ1フレームにします。次はデモで使うフォールバック画像です。このページの画像ビューアーに見える市松模様は、ファイルに描き込まれた背景ではありません。
通常のMP4を透過用フォールバックと考えないでください。一般的なMP4と最初のモデルプレビューは不透明です。AnimGenではWebM Alpha、ProRes 4444、RGBAフレーム、透過スプライトは別途生成される書き出し結果です。透過形式と再生互換性も参照してください。
段階的に機能を強めるHTMLから始める
既定ではPNGを表示し、ブラウザがVP8 WebMを再生できると判断した場合に動画を表示します。読み込みエラーならPNGに戻します。
<div class="animation-stage">
<img
id="character-fallback"
src="/animation/character-run.png"
width="512"
height="512"
alt="走っている青いキャラクター"
/>
<video
id="character-video"
width="512"
height="512"
muted
loop
playsinline
preload="metadata"
poster="/animation/character-run.png"
aria-label="走っている青いキャラクター"
hidden
>
<source
src="/animation/character-run.webm"
type='video/webm; codecs="vp8"'
/>
</video>
</div>
width と height を指定すれば、読み込み前に正しい比率の場所を確保できます。playsinline はモバイルでページ内再生を促し、muted は装飾動画を無音にし、preload="metadata" はページを開いた時点で動画全体を急いでダウンロードしないようにします。MDNの<video>要素の説明に属性とposterの挙動があります。
<video>...</video> の内部に置く文字や画像は、主にvideo要素自体を知らないブラウザ向けです。現代のブラウザが要素は認識するが、どのsourceもデコードできない場合、内部の内容が期待通りに出るとは限りません。隣接した <img> を置き、エラーイベントで切り替える方が実用的です。
CSSでページの背景に重ねる
透過画素の下には .animation-stage の背景が見えます。
.animation-stage {
position: relative;
width: min(100%, 32rem);
aspect-ratio: 1;
overflow: hidden;
border-radius: 1.5rem;
background: linear-gradient(145deg, #7c3aed, #0891b2);
}
.animation-stage > img,
.animation-stage > video {
position: absolute;
inset: 0;
display: block;
width: 100%;
height: 100%;
object-fit: contain;
}
画面全体を見せるなら object-fit: contain を使い、切り抜きたいと確信できる場合だけ cover を使います。複雑なHero背景では drop-shadow() を足せますが、元の縁を検査するときはエフェクトを切り、スピルや明るい縁を隠さないでください。
動画と静止画を安全に切り替える
canPlayType() は初期の分岐には使えますが、容器とコーデックの判定にすぎず、アルファが正しく合成される証明にはなりません。
const video = document.querySelector("#character-video");
const fallback = document.querySelector("#character-fallback");
const playButton = document.querySelector("#play-character");
function showFallback() {
video.pause();
video.hidden = true;
fallback.hidden = false;
}
const canPlayWebM = video.canPlayType(
'video/webm; codecs="vp8"'
);
if (canPlayWebM) {
fallback.hidden = true;
video.hidden = false;
} else {
showFallback();
}
video.addEventListener("error", showFallback);
playButton.addEventListener("click", () => video.play());
重要なHeroや導入フローに使うなら、対象ブラウザで実測し、アプリ側の明確なフォールバックを保ちます。装飾なら適切なPNGだけでもレイアウトは維持でき、動画の互換性を主な内容の障害にしなくて済みます。
再生の制御を訪問者に渡す
透過動画も動くコンテンツです。無限ループする装飾を、ページを理解・利用する唯一の方法にしないでください。
ダウンロード可能なデモは最初にposterで停止し、再生/一時停止ボタンを用意しています。prefers-reduced-motion も確認し、動きを減らしたい訪問者には、本人が再生するまでPNGを表示します。
const reducedMotion = matchMedia(
"(prefers-reduced-motion: reduce)"
).matches;
if (reducedMotion) {
showFallback();
}
どうしても自動再生が必要なら、無音・ページ内再生とし、ブラウザに拒否された play() のPromiseを処理し、一時停止の操作を用意します。短い動画でも、ループでCPUや通信を使い続けるべきではありません。
Webへの配信コストを抑える
このデモで同じ動画を3本同時再生するのは、3背景で透過を証明するためです。本番では普通1つのvideoで足り、同じ素材を3つのデコーダーで再生する必要はありません。
- 実際に見せる動作範囲まで切ります。
- Webでの最大表示サイズに近い寸法で書き出し、小さなカードに巨大な元ファイルを入れません。
- ファーストビューより下や操作後にだけ必要な動画は
preload="none"とし、寸法・長さを先に知る必要がある場合にmetadataを使います。 - 内容を示す透過PNGのposterを用意します。
- 長時間再生する動画は、ビューポート外やタブが非表示になったら停止します。
- サーバーが
video/webmのContent-Typeを返し、バージョン付き静的ファイルをキャッシュするようにします。 - ProRes 4444は編集・合成に残し、通常のWeb埋め込みには使いません。
今回の4秒の例は約1.54 MiBで、短い展示素材として使えますが、あらゆるサイトの予算ではありません。他のページリソースと一緒に、通信速度を落としたモバイル環境で測ってください。
黒い矩形が出ても、すぐに動きを再生成しない
- 対応するRGBA PNGを明るい背景と暗い背景の上で確認します。
- PNGは透過するのにWebMが黒くなるなら、ブラウザ/デコーダー、実際のエンコード、合成経路を調べます。
- 両方とも不透明なら、入力画像のAlpha、書き出しモード、元絵に背景が描かれていないかを確認します。
- サーバーがファイル全体と
Content-Type: video/webmを返すか確認します。 - 製品で使うブラウザ、OS、端末、埋め込みWebViewで再テストします。
透過書き出しのトラブルシューティングには明るい縁、色かぶり、ぼけた縁、ファイルにAlphaがあるのにプレーヤー表示が誤る場合もまとめています。
動画を作ったら、最終的なWebページで受け入れ確認をする
AnimGenでWeb用素材を作るなら、有効なAlpha付きPNGから透過アニメーションモードで動きを生成し、使える範囲を切り出し、WebM Alphaとフォールバック用のPNGを一緒に書き出します。透過アニメーションの全体フローは入力と出力の境界を、走行・ジャンプの事例は生成と仕上げを説明しています。
最終確認の対象はダウンロードファイルだけでなく、実際のページのコンポーネントです。本物の背景に置き、最小対応ビューポートも確認してください。この記事のサンプル一式を出発点にするか、AnimGen Studioで自分の透過キャラクターを制作できます。

