アニメーションUX最適化 2025 — 体験を上げてバイトを下げる設計指針
公開: 2025年9月20日 · 読了目安: 2 分 · 著者: Unified Image Tools 編集部
なぜ GIF を卒業するのか
GIF は非効率で、画質も悪く、色数にも制約があります。2025 年は「アニメ WebP/AVIF」か「短尺動画 (MP4/WebM)」を基準にしましょう。
フォーマット選定
- ループ短尺・UI アニメ: アニメ WebP/AVIF
- 実写/写真・音声あり: MP4/WebM(動画)
- 透明が必要: アニメ WebP(AVIF の透明はブラウザ状況を確認)
実装の型
<video autoplay loop muted playsinline width="640" height="360" preload="metadata">
<source src="/loop.webm" type="video/webm" />
<source src="/loop.mp4" type="video/mp4" />
<!-- フォールバック画像 -->
<img src="/loop.jpg" alt="短いループ" />
</video>
体験設計のコツ
prefers-reduced-motion
に配慮(CSS/JS で停止オプション)。- FCP/LCP を阻害しない遅延戦略(インタラクション直前に読み込み)。
- サムネイルは静止画、再生でアニメ/動画をロード。
CSS での動きの抑制例
@media (prefers-reduced-motion: reduce) {
.anim { animation: none !important; transition: none !important; }
}
予算思考(パフォーマンス・データ)
- ヒーロー上の動画は 500–800KB 程度を上限に設計(画質優先ならポスター静止画+遅延再生)。
- 複数同時再生は避け、ユーザー操作で 1 本に集約。
- モバイルは
preload="none"
前提、インタラクション後にsrc
付け替え。
チェックリスト
- [ ] GIF → WebP/AVIF/動画への移行
- [ ] 透明やループ要件の整理
- [ ]
prefers-reduced-motion
対応 - [ ] 遅延読み込みとキャッシュの最適化
ケーススタディ
- ローディング・インジケータ: CSS アニメに置換し 30KB 削減。
- 英雄アニメを動画化: 2.4MB GIF → 420KB WebM(同等視覚)。
- スクロールで発火: IntersectionObserver で 30% 可視時に
src
注入。
FAQ
-
Q: どの画面幅で動画を止めるべき?
-
A: 帯域とバッテリーに配慮し、モバイルでは自動再生は無音・短尺に限定。ユーザー操作で拡張再生を推奨します。
-
Q: WebP と AVIF はどちらが良い?
-
A: 画質/圧縮は AVIF に分がありますが、互換性で WebP を併記するのが無難です。
-
Q: SEO への影響は?
-
A: LCP/CLS を悪化させないことが最優先。動画はヒーローでの自動再生を避け、静止ポスター+遅延で設計すると安全です。
-
Q: 字幕やアクセシビリティは?
-
A: 意味を伴う動画は字幕を用意し、キーボード操作/再生停止/音量調整に対応しましょう。
設計原則 — 目的のある動き
- 意味付け: 状態変化・因果関係・階層を伝えるための動きに限定。
- 安全性: 3回/秒以上の点滅や大振幅のズーム/回転は回避(WCAG 2.3.1)。
- 一貫性: 同一コンポーネントは同一タイミング/イージングを維持。
- 可逆性: 動きが失敗した時は静的 UI で機能を代替可能に。
時間とイージングの指針
- 小規模トランジション: 120–180ms /
cubic-bezier(0.2, 0, 0, 1)
- コンテナ/モーダル出現: 180–240ms /
ease-out
- ページ遷移(クロスフェード/スライド): 240–320ms /
ease-in-out
- スプリング(物理):
damping: 20–28, stiffness: 140–220
目安
.btn {
transition: transform 160ms cubic-bezier(.2,0,0,1), box-shadow 160ms ease-out;
}
.btn:active { transform: translateY(1px); }
Web Animations API とスプリング
// Reduced Motion を尊重しつつ WAAPI を利用
const prefersReduced = matchMedia('(prefers-reduced-motion: reduce)').matches;
const el = document.querySelector('.card');
if (!prefersReduced && el) {
el.animate([
{ transform: 'translateY(8px)', opacity: 0 },
{ transform: 'translateY(0)', opacity: 1 },
], {
duration: 220,
easing: 'cubic-bezier(.2,0,0,1)',
fill: 'both'
});
}
// スプリング風(簡易)
function springTo(el, to = 0, { stiffness = 180, damping = 22 } = {}) {
let v = 0; // velocity
let x = 1; // normalized position
const dt = 1/60;
function frame() {
const f = -stiffness * (x - to) - damping * v;
v += f * dt;
x += v * dt;
el.style.transform = `translateY(${x * 20}px)`;
if (Math.abs(v) > 0.001 || Math.abs(x - to) > 0.001) requestAnimationFrame(frame);
}
frame();
}
スクロール連動の最適化
- IntersectionObserver でビューポート 25–33% 可視時に開始。
position: sticky
を活用し、パララックス/ピン留めの JS 計算を最小化。- 高コストプロパティ(top/left/width/height)より
transform/opacity
を優先。
const io = new IntersectionObserver(entries => {
entries.forEach(e => {
if (e.isIntersecting) e.target.classList.add('in');
});
}, { threshold: 0.3 });
document.querySelectorAll('.reveal').forEach(n => io.observe(n));
Lottie / CSS / Video の使い分け
- Lottie(JSONベクター): UI アイコンや軽量イラスト。色差し替え/解像度独立。
- CSS: マイクロインタラクション。依存軽く、実行コスト低。
- Video: 写真品質/複雑な表現。圧縮効率高、字幕/音声も可。
判断基準: 「画質が最優先→Video」「ループUIで軽量→CSS/Lottie」「透明必須→Lottie/アニメWebP」。
パフォーマンス計測
// ペイント/合成への影響を把握
new PerformanceObserver((list) => {
for (const e of list.getEntries()) {
console.log(e.entryType, e.name, e.duration);
}
}).observe({ entryTypes: ['longtask', 'measure'] });
performance.mark('anim:start');
// ... run animation ...
performance.mark('anim:end');
performance.measure('anim:duration', 'anim:start', 'anim:end');
アクセシビリティ/セーフティ
- 停止/一時停止/非表示の提供(WCAG 2.2.2)。
prefers-reduced-motion
で代替。自動再生は既定でミュート。- 3Hz–60Hz の点滅を避け、明滅コントラストを抑制。
失敗しない実装チェック
- [ ] 目的と KPI を定義(クリック率/滞在/完読率 など)
- [ ] 動きは transform/opacity に限定(レイアウト無変更)
- [ ] 遅延読み込み/ユーザー操作で発火
- [ ] Reduced Motion ルールと手動停止 UI
- [ ] A/B テストで効果検証
さらに深い FAQ
-
Q: Lottie は重くならない?
- A: プリミティブ数の削減やフレーム率最適化で軽量化可能。重い場合は動画へ移行。
-
Q: GIF をどうしても使うケースは?
- A: 互換性要件や外部制約が強いときのみ。容量/画質の妥協を理解したうえで限定運用。
-
Q: スクロール連動でカクつく
- A: requestAnimationFrame と IntersectionObserver を併用し、スレッド負荷を下げ、
will-change
の濫用は避けます。
- A: requestAnimationFrame と IntersectionObserver を併用し、スレッド負荷を下げ、
関連記事
AVIF vs WebP vs JPEG XL 徹底比較 2025 — 実測と導入戦略
主要モダン画像フォーマット AVIF・WebP・JPEG XL を画質・サイズ・デコード速度・ブラウザ対応の観点で実測比較。現実的な導入戦略とフォールバック設計、既存ワークフローへの統合例を提示します。
フォーマット変換の戦略 2025 — WebP/AVIF/JPEG/PNG を使い分ける指針
コンテンツ種別ごとの意思決定と運用フロー。互換性・容量・画質のバランスを取り、最小の労力で安定化。
正しいカラー管理とICCプロファイル戦略 2025 ─ Web画像の色再現を安定させる実践ガイド
デバイスやブラウザ間で色ズレを起こさないためのICCプロファイル/カラースペース/埋め込み方針と、WebP/AVIF/JPEG/PNG各形式における最適化手順を体系化。
画像圧縮 完全戦略 2025 ─ 画質を守りつつ体感速度を最適化する実践ガイド
Core Web Vitals と実運用に効く最新の画像圧縮戦略を、用途別の具体的プリセット・コード・ワークフローで徹底解説。JPEG/PNG/WebP/AVIF の使い分け、ビルド/配信最適化、トラブル診断まで網羅。
画像最適化の基本 2025 — 勘に頼らない土台づくり
どのサイトにも効く、速くて美しい配信のための最新ベーシック。リサイズ→圧縮→レスポンシブ→キャッシュの順で安定運用に。