AI先生のロボットキャラクター
第9章 - セクション6

肉球のプログレスバーアニメーション

肉球の足跡が左右交互に現れるプログレスバーアニメーション。立体感のある肉球が歩くような表示されます

ローディング中の待ち時間は、ユーザーにとってストレスになりがちです。しかし、かわいらしい演出を加えることで、待ち時間を楽しい体験に変えることができます。

このパーツでは、肉球の足跡が左右交互に現れるプログレスバーを作成します。立体感のあるdrop-shadowと、歩くような配置で、ユーザーの気持ちを和ませながら進行状況を伝えます。猫好きなユーザーには特に好評な、遊び心あふれるデザインです。

作成した肉球のプログレスバーアニメーション

肉球の足跡が左右交互に現れるプログレスバーアニメーション。立体感のある肉球が歩くような表示されます

HTML
<div class="paw-track" id="pawTrack"></div>
CSS
body {
    margin: 0;
    padding: 0;
    min-height: 100vh;
    display: flex;
    align-items: center;
    justify-content: center;
}

/* Paw Track Container */
.paw-track {
    display: flex;
    align-items: center;
    gap: 20px;
    position: relative;
    height: 40px;
    background: 
        repeating-linear-gradient(
            45deg,
            transparent,
            transparent 0.5px,
            rgba(0,0,0,0.015) 0.5px,
            rgba(0,0,0,0.015) 1px
        ),
        repeating-linear-gradient(
            -45deg,
            transparent,
            transparent 0.5px,
            rgba(0,0,0,0.015) 0.5px,
            rgba(0,0,0,0.015) 1px
        ),
        repeating-linear-gradient(
            90deg,
            transparent,
            transparent 1px,
            rgba(0,0,0,0.01) 1px,
            rgba(0,0,0,0.01) 2px
        ),
        linear-gradient(
            to bottom,
            #c5c5c5,
            #b8b8b8,
            #acacac
        );
    padding: 10px 20px;
}

/* Individual Paw Print */
.paw {
    width: 30px;
    height: 30px;
    transform: scale(0);
    filter: 
        drop-shadow(-2px -2px 4px rgba(0,0,0,0.25))
        drop-shadow(2px 2px 4px rgba(255,255,255,0.6));
    animation: pawAppear 0.3s ease-out forwards;
    position: relative;
}

.paw svg {
    width: 100%;
    height: 100%;
    fill: #5a5a5a;
    transform: rotate(90deg);
}

/* Paw Animation */
@keyframes pawAppear {
    0% {
        opacity: 0;
        transform: scale(0.3);
    }
    40% {
        opacity: 1;
    }
    70% {
        transform: scale(1.15);
    }
    100% {
        transform: scale(1);
    }
}

/* Left paw (top position) */
.paw.left {
    align-self: flex-start;
    margin-top: -4px;
}

/* Right paw (bottom position) */
.paw.right {
    align-self: flex-end;
    margin-bottom: -4px;
}
JavaScript
// SVG path for paw print
const PAW_SVG = `
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 -960 960 960">
<path d="M180-475q-42 0-71-29t-29-71q0-42 29-71t71-29q42 0 71 29t29 71q0 42-29 71t-71 29Zm180-160q-42 0-71-29t-29-71q0-42 29-71t71-29q42 0 71 29t29 71q0 42-29 71t-71 29Zm240 0q-42 0-71-29t-29-71q0-42 29-71t71-29q42 0 71 29t29 71q0 42-29 71t-71 29Zm180 160q-42 0-71-29t-29-71q0-42 29-71t71-29q42 0 71 29t29 71q0 42-29 71t-71 29ZM266-75q-45 0-75.5-34.5T160-191q0-52 35.5-91t70.5-77q29-31 50-67.5t50-68.5q22-26 51-43t63-17q34 0 63 16t51 42q28 32 49.5 69t50.5 69q35 38 70.5 77t35.5 91q0 47-30.5 81.5T694-75q-54 0-107-9t-107-9q-54 0-107 9t-107 9Z"/>
</svg>
`;

const pawTrack = document.getElementById('pawTrack');
const pawCount = 8;
const baseDelay = 0.3;

// Create paws with alternating left/right positions
for (let i = 0; i < pawCount; i++) {
    const paw = document.createElement('div');
    paw.className = i % 2 === 0 ? 'paw left' : 'paw right';
    paw.innerHTML = PAW_SVG;

    // Last paw gets a slightly longer delay
    paw.style.animationDelay =
        i === pawCount - 1
            ? `${i * baseDelay + 0.15}s`
            : `${i * baseDelay}s`;

    pawTrack.appendChild(paw);
}

このパーツの特徴

  • 左右交互配置 肉球が上下に交互に配置され、歩いているような自然な印象を演出
  • 立体的な質感 drop-shadowで光と影を表現し、地面に押された肉球のリアルな立体感
  • SVG活用 Material Designの肉球アイコンを活用し、高解像度でもきれいに表示
  • 順次表示アニメーション animation-delayで時間差をつけ、歩く動作を視覚化
  • 背景テクスチャ repeating-linear-gradientで地面のような質感を表現

コードのポイント

立体感のあるdrop-shadowの使用

2方向のdrop-shadowを組み合わせて、肉球に深みと立体感を与えています。暗い影と明るいハイライトで地面に押された質感を表現します。

.paw {
    width: 30px;
    height: 30px;
    transform: scale(0);
    filter: 
        drop-shadow(-2px -2px 4px rgba(0,0,0,0.25))
        drop-shadow(2px 2px 4px rgba(255,255,255,0.6));
    animation: pawAppear 0.3s ease-out forwards;
    position: relative;
}

左右交互の配置ロジック

JavaScriptで肉球を生成する際、インデックスの偶数/奇数でクラスを振り分け、左右に配置しています。

for (let i = 0; i < pawCount; i++) {
    const paw = document.createElement('div');
    paw.className = i % 2 === 0 ? 'paw left' : 'paw right';
    paw.innerHTML = PAW_SVG;

    paw.style.animationDelay =
        i === pawCount - 1
            ? `${i * baseDelay + 0.15}s`
            : `${i * baseDelay}s`;

    pawTrack.appendChild(paw);
}

スケールアニメーションで登場演出

pawAppearアニメーションでは、scale(0.3)から始まり、一度拡大してから元のサイズに戻ることで、弾むような印象を与えます。

@keyframes pawAppear {
    0% {
        opacity: 0;
        transform: scale(0.3);
    }
    40% {
        opacity: 1;
    }
    70% {
        transform: scale(1.15);
    }
    100% {
        transform: scale(1);
    }
}

地面のようなテクスチャ背景

複数のrepeating-linear-gradientを重ねることで、微細なパターンの地面テクスチャを表現しています。

.paw-track {
    background: 
        repeating-linear-gradient(
            45deg,
            transparent,
            transparent 0.5px,
            rgba(0,0,0,0.015) 0.5px,
            rgba(0,0,0,0.015) 1px
        ),
        repeating-linear-gradient(
            -45deg,
            transparent,
            transparent 0.5px,
            rgba(0,0,0,0.015) 0.5px,
            rgba(0,0,0,0.015) 1px
        ),
        linear-gradient(
            to bottom,
            #c5c5c5,
            #b8b8b8,
            #acacac
        );
}

まとめ

肉球プログレスバーのポイント
  • かわいさで待ち時間を楽しく 肉球の足跡で、ローディングをポジティブな体験に変換
  • 立体感の表現 drop-shadowによる光と影で、リアルな質感を実現
  • 歩く動作の演出 左右交互配置とanimation-delayで、自然な歩行動作を視覚化
  • SVGの活用 ベクター形式で高解像度表示にも対応した美しい肉球
  • 背景テクスチャ repeating-linear-gradientで地面のような質感を追加

シンプルなプログレスバーに、キュートな肉球モチーフを加えることで、ユーザーの待ち時間を楽しい体験に変えます。遊び心のあるデザインは、ブランドの親しみやすさを表現する効果的な手段です。

学習チェック

このレッスンを理解できたら「完了」をクリックしてください。
後で見直したい場合は「未完了に戻す」で進捗をリセットできます。

レッスン完了!🎉

お疲れさまでした!