🔒 サンドボックス内で実行中 ⛶ 全画面で遊ぶ
HTML / CSS / JS
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>影山飛雄 - コート上の王様 (Setter Version)</title>
    <script src="https://cdn.tailwindcss.com"></script>
    <style>
        @import url('https://fonts.googleapis.com/css2?family=Noto+Serif+JP:wght@700;900&family=Oswald:wght@700&display=swap');

        body {
            background-color: #050505;
            color: #ffffff;
            overflow: hidden;
            font-family: 'Noto Serif JP', serif;
        }

        /* 画面全体のヴィネット効果(映像っぽくする) */
        .vignette {
            position: absolute;
            top: 0; left: 0; width: 100%; height: 100%;
            background: radial-gradient(circle, transparent 40%, rgba(0,0,0,0.9) 100%);
            pointer-events: none;
            z-index: 10;
        }

        /* 画面レイアウト */
        #scene-container {
            position: relative;
            width: 100vw;
            height: 100vh;
            display: flex;
            justify-content: center;
            align-items: center;
            overflow: hidden;
        }

        /* キャラクター画像のコンテナ */
        .character-container {
            position: relative;
            width: 80vh; /* 画面高さに合わせて調整 */
            max-width: 90vw;
            height: auto;
            transform: translateY(50px) scale(0.9);
            opacity: 0;
            filter: blur(5px);
            z-index: 5;
            /* シーン開始時のアニメーション */
            animation: characterEnter 1.5s cubic-bezier(0.215, 0.61, 0.355, 1) 1s forwards;
        }

        /* 影山飛雄の画像(プレースホルダー) */
        .character-image {
            width: 100%;
            height: auto;
            border-radius: 10px;
            box-shadow: 0 0 50px rgba(255, 102, 0, 0.2);
        }

        @keyframes characterEnter {
            0% { opacity: 0; transform: translateY(50px) scale(0.9); filter: blur(5px); }
            100% { opacity: 1; transform: translateY(0) scale(1); filter: blur(0px); }
        }

        /* バレーボールの演出 */
        .ball {
            position: absolute;
            top: 50%; left: 50%;
            transform: translate(-50%, -50%) scale(0);
            width: 100px; height: 100px;
            background: linear-gradient(135deg, #FFD700 35%, #0000CD 35%, #0000CD 65%, #FFD700 65%);
            border-radius: 50%;
            box-shadow: inset -10px -10px 20px rgba(0,0,0,0.5), 0 0 15px rgba(255, 255, 255, 0.8);
            z-index: 6; /* キャラクター画像の手前に */
            opacity: 0;
            display: none;
        }

        .ball::after {
            content: '';
            position: absolute; top: 0; left: 0; width: 100%; height: 100%;
            border-radius: 50%;
            border: 2px solid rgba(255,255,255,0.3);
            animation: spin 0.2s linear infinite;
        }

        @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }

        /* JavaScriptで制御するアニメーションクラス */
        
        /* ボールが手元に収まる */
        .ball-catch {
            display: block;
            opacity: 1;
            animation: ballCatchEffect 0.5s cubic-bezier(0.175, 0.885, 0.32, 1.275) forwards;
        }

        @keyframes ballCatchEffect {
            0% { transform: translate(-50%, -50%) scale(0); filter: blur(10px); }
            100% { transform: translate(-50%, -50%) scale(1); filter: blur(0px); }
        }

        /* トスの「カッコいい」動き */
        .ball-toss {
            animation: ballTossEffect 1s cubic-bezier(0.19, 1, 0.22, 1) forwards;
        }

        @keyframes ballTossEffect {
            0% { transform: translate(-50%, -50%) scale(1) translate(0, 0) rotate(0deg); opacity: 1; }
            30% { transform: translate(-50%, -50%) scale(1.1) translate(-20px, 10px) rotate(30deg); } /* 一瞬ためを作る */
            100% { transform: translate(-50%, -50%) scale(0.5) translate(150vw, -300px) rotate(720deg); opacity: 0; } /* 画面外へ */
        }

        /* 影山自身の動き */
        .character-action {
            animation: characterActionEffect 0.7s cubic-bezier(0.19, 1, 0.22, 1) forwards;
        }

        @keyframes characterActionEffect {
            0% { transform: scale(1) translate(0, 0); }
            30% { transform: scale(1.05) translate(-10px, 5px); }
            100% { transform: scale(0.98) translate(0, 0); filter: blur(2px) saturate(0.5); }
        }

        /* 効果音テキスト「ドシャァッ!!」 */
        .impact-text {
            position: absolute;
            top: 50%; left: 60%;
            transform: translate(-50%, -50%) scale(0) rotate(-10deg);
            font-size: 8rem;
            font-weight: 900;
            color: transparent;
            -webkit-text-stroke: 2px #ff6600;
            text-shadow: 0 0 30px rgba(255,102,0,0.8), 5px 5px 0px #ff6600;
            opacity: 0;
            z-index: 11;
            pointer-events: none;
            white-space: nowrap;
            display: none;
        }

        .show-impact {
            display: block;
            animation: impact 0.7s ease-out forwards;
        }

        @keyframes impact {
            0% { transform: translate(-50%, -50%) scale(0) rotate(-15deg); opacity: 1; filter: blur(5px); }
            20% { transform: translate(-50%, -50%) scale(1.3) rotate(-5deg); opacity: 1; filter: blur(0px); }
            100% { transform: translate(-50%, -50%) scale(1) rotate(0deg); opacity: 0; filter: blur(10px); }
        }

        /* セリフテキスト */
        .quote-container {
            position: absolute;
            bottom: 15%;
            left: 50%;
            transform: translateX(-50%) translateY(20px);
            text-align: center;
            opacity: 0;
            z-index: 12;
            pointer-events: none;
        }

        .show-quote {
            animation: quoteEnter 1s cubic-bezier(0.19, 1, 0.22, 1) forwards;
        }

        @keyframes quoteEnter {
            0% { opacity: 0; transform: translateX(-50%) translateY(20px) scale(0.8); filter: blur(5px); }
            100% { opacity: 1; transform: translateX(-50%) translateY(0) scale(1); filter: blur(0px); }
        }

        /* 画面揺れエフェクト */
        .shake-screen {
            animation: shake 0.3s cubic-bezier(.36,.07,.19,.97) both;
        }

        @keyframes shake {
            10%, 90% { transform: translate3d(-5px, 2px, 0); }
            20%, 80% { transform: translate3d(5px, -2px, 0); }
            30%, 50%, 70% { transform: translate3d(-10px, 4px, 0); }
            40%, 60% { transform: translate3d(10px, -4px, 0); }
        }

        /* リプレイボタン */
        .replay-button {
            position: absolute;
            bottom: 5%;
            left: 50%;
            transform: translateX(-50%);
            z-index: 20;
            opacity: 0;
            pointer-events: none;
        }

        .show-replay {
            animation: fadeInScale 1s ease 1s forwards;
            pointer-events: auto;
        }

        @keyframes fadeInScale {
            0% { opacity: 0; transform: translateX(-50%) translateY(10px) scale(0.9); }
            100% { opacity: 1; transform: translateX(-50%) translateY(0) scale(1); }
        }

    </style>
</head>
<body>

    <div class="vignette"></div>

    <div id="scene-container">
        <div class="character-container" id="character-element">
            <img src="https://placehold.co/400x600/000000/FF6600?text=Kageyama+Setting" alt="影山飛雄 セッター・トス" class="character-image">
        </div>

        <div class="ball" id="ball-element"></div>

        <div class="impact-text" id="impact-element">ドシャァッ!!</div>

        <div class="quote-container" id="quote-element">
            <h1 class="text-4xl md:text-5xl italic text-white tracking-widest font-black" style="text-shadow: 2px 2px 10px rgba(0,0,0,0.8);">
                「俺がいれば、<span class="text-orange-400">お前は最強だ</span>」
            </h1>
        </div>

        <button onclick="location.reload()" class="replay-button px-8 py-3 border border-orange-500 text-orange-500 rounded-full hover:bg-orange-500 hover:text-black transition-all duration-300 font-sans tracking-wider" id="replay-element">
            ▶ REPLAY
        </button>
    </div>

    <script>
        // アニメーションを順番に実行するための関数
        const playKageyamaSequence = () => {
            const char = document.getElementById('character-element');
            const ball = document.getElementById('ball-element');
            const impact = document.getElementById('impact-element');
            const quote = document.getElementById('quote-element');
            const body = document.body;
            const replay = document.getElementById('replay-element');

            // 1. 静寂(1秒後、キャラクターが浮かび上がっている状態で開始)

            // 2. キャッチ(1.5秒後)
            setTimeout(() => {
                ball.classList.add('ball-catch');
            }, 1500);

            // 3. アクション&トス(2.0秒後)
            setTimeout(() => {
                // キャラクターの動きを追加
                char.classList.add('character-action');
                // ボールのトス(高速移動)
                ball.classList.remove('ball-catch');
                ball.classList.add('ball-toss');
            }, 2000);

            // 4. インパクト(2.15秒後、ボールが通り抜けた直後)
            setTimeout(() => {
                // 画面揺れ
                body.classList.add('shake-screen');
                // 効果音テキスト
                impact.classList.add('show-impact');
                // 呼吸するように少し待ってから名言
                setTimeout(() => {
                    quote.classList.add('show-quote');
                }, 500);
            }, 2150);

            // 5. 終了とリプレイボタン(5秒後)
            setTimeout(() => {
                replay.classList.add('show-replay');
            }, 5000);
        };

        // 画面ロード時にシーケンスを開始
        window.addEventListener('load', playKageyamaSequence);
    </script>

</body>
</html>
🔨 開発中アトリエ

とびお

てすと

👁 35 回閲覧
📅 投稿:2026年8月29日 🔄 更新:2026年9月11日
応援スタンプを押してみよう!