アニメーション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 の濫用は避けます。

関連記事

比較

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 — 勘に頼らない土台づくり

どのサイトにも効く、速くて美しい配信のための最新ベーシック。リサイズ→圧縮→レスポンシブ→キャッシュの順で安定運用に。