You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Chrome本地网页实现图片触发隐藏视频全屏播放问题求助

Hey James, I feel your pain—spending days debugging something outside your usual skill set is brutal. Let's get this sorted out step by step, using terms that should make sense from your C# game dev background.

解决方案:分步实现你的全屏视频触发需求

I’ll refactor your existing code to fit your multi-image/multi-video requirement, keeping logic straightforward and avoiding overly complex jargon.


1. 基础页面搭建(类比游戏UI布局)

First, we’ll build the page structure: two headings, each with 4 image items (each linking to a hidden video and labeled with its trigger key).

<!DOCTYPE html>
<html>
<head>
    <title>Full Screen Video Trigger</title>
    <style>
        /* 布局样式,让页面更清晰 */
        .section {
            margin: 20px 0;
        }
        .image-item {
            display: inline-block;
            margin: 10px;
            text-align: center;
            cursor: pointer; /* 鼠标移上去显示手型,提示可点击 */
        }
        .image-item img {
            width: 150px;
            height: 100px;
            border: 2px solid #ccc;
            border-radius: 4px;
        }
        .key-hint {
            margin-top: 5px;
            font-weight: bold;
        }
        /* 初始隐藏所有视频 */
        video {
            display: none;
            width: 100%;
            height: 100%;
        }
        /* 全屏时隐藏视频控件 */
        video::-webkit-media-controls {
            display: none !important;
        }
    </style>
</head>
<body>
    <!-- 第一组视频区域 -->
    <div class="section">
        <h2>第一组视频</h2>
        <div class="image-item" data-video-id="video1" data-key="49">
            <img src="your-image-1.jpg" alt="视频1封面">
            <div class="key-hint">按键:1</div>
        </div>
        <div class="image-item" data-video-id="video2" data-key="50">
            <img src="your-image-2.jpg" alt="视频2封面">
            <div class="key-hint">按键:2</div>
        </div>
        <div class="image-item" data-video-id="video3" data-key="51">
            <img src="your-image-3.jpg" alt="视频3封面">
            <div class="key-hint">按键:3</div>
        </div>
        <div class="image-item" data-video-id="video4" data-key="52">
            <img src="your-image-4.jpg" alt="视频4封面">
            <div class="key-hint">按键:4</div>
        </div>
    </div>

    <!-- 第二组视频区域 -->
    <div class="section">
        <h2>第二组视频</h2>
        <div class="image-item" data-video-id="video5" data-key="81">
            <img src="your-image-5.jpg" alt="视频5封面">
            <div class="key-hint">按键:Q</div>
        </div>
        <div class="image-item" data-video-id="video6" data-key="87">
            <img src="your-image-6.jpg" alt="视频6封面">
            <div class="key-hint">按键:W</div>
        </div>
        <div class="image-item" data-video-id="video7" data-key="69">
            <img src="your-image-7.jpg" alt="视频7封面">
            <div class="key-hint">按键:E</div>
        </div>
        <div class="image-item" data-video-id="video8" data-key="82">
            <img src="your-image-8.jpg" alt="视频8封面">
            <div class="key-hint">按键:R</div>
        </div>
    </div>

    <!-- 所有隐藏的视频元素 -->
    <video id="video1" src="your-video-1.webm"></video>
    <video id="video2" src="your-video-2.webm"></video>
    <video id="video3" src="your-video-3.webm"></video>
    <video id="video4" src="your-video-4.webm"></video>
    <video id="video5" src="your-video-5.webm"></video>
    <video id="video6" src="your-video-6.webm"></video>
    <video id="video7" src="your-video-7.webm"></video>
    <video id="video8" src="your-video-8.webm"></video>

    <script>
        // 页面加载完成后执行逻辑(类比游戏里的Start()方法)
        document.addEventListener('DOMContentLoaded', function() {
            const imageItems = document.querySelectorAll('.image-item');
            let currentPlayingVideo = null; // 跟踪当前播放的视频,防止同时播放多个

            // 通用全屏播放视频函数(类比游戏里的PlayVideo()方法)
            function playVideoFullscreen(videoElement) {
                // 暂停并隐藏正在播放的其他视频
                if (currentPlayingVideo && currentPlayingVideo !== videoElement) {
                    currentPlayingVideo.pause();
                    currentPlayingVideo.style.display = 'none';
                    if (document.fullscreenElement) document.exitFullscreen();
                }

                // 显示并播放目标视频
                videoElement.style.display = 'block';
                videoElement.play();
                currentPlayingVideo = videoElement;

                // 请求全屏(适配Chrome的webkit前缀)
                if (videoElement.requestFullscreen) {
                    videoElement.requestFullscreen();
                } else if (videoElement.webkitRequestFullscreen) {
                    videoElement.webkitRequestFullscreen();
                }
            }

            // 监听图片点击事件(类比游戏里的OnClick事件)
            imageItems.forEach(item => {
                item.addEventListener('click', function() {
                    const videoId = this.dataset.videoId;
                    playVideoFullscreen(document.getElementById(videoId));
                });
            });

            // 监听键盘按键事件(类比游戏里的Input.GetKeyDown())
            document.addEventListener('keydown', function(e) {
                const targetItem = Array.from(imageItems).find(item => item.dataset.key === e.keyCode.toString());
                if (targetItem) {
                    const videoId = targetItem.dataset.videoId;
                    playVideoFullscreen(document.getElementById(videoId));
                }
            });

            // 监听视频播放结束事件(类比游戏里的OnVideoEnd事件)
            document.querySelectorAll('video').forEach(video => {
                video.addEventListener('ended', function() {
                    // 退出全屏并隐藏视频
                    if (document.fullscreenElement) document.exitFullscreen();
                    else if (document.webkitExitFullscreen) document.webkitExitFullscreen();
                    this.style.display = 'none';
                    currentPlayingVideo = null;
                });
            });
        });
    </script>
</body>
</html>

2. 关键逻辑解释(用C#游戏开发思路类比)

  • 数据绑定data-video-iddata-key attributes act like how you bind UI elements to game objects or event parameters in Unity—they link each image to its corresponding video and trigger key.
  • 事件监听addEventListener is the web equivalent of Unity’s OnClick or Input events, listening for user clicks and key presses.
  • 状态管理currentPlayingVideo tracks the active video to prevent overlapping playback, just like how you manage active animations or audio clips in games.
  • 全屏控制requestFullscreen and exitFullscreen are browser APIs for toggling fullscreen mode, similar to Screen.SetResolution or fullscreen toggle functions in game engines.

3. 你需要替换的内容

  • Swap all your-image-x.jpg with your actual local image filenames (keep images in the same folder as the HTML file).
  • Swap all your-video-x.webm with your actual local video filenames (Chrome supports WebM and MP4 formats).
  • To change trigger keys: Update the data-key values—you can look up ASCII key codes (e.g., 49 = "1", 81 = "Q") to match your preferred keys.

4. 测试注意事项

  • Chrome may block local video playback when opening the HTML file directly. To fix this, run a simple local server: open your terminal in the file folder, run python -m http.server (if you have Python installed), then visit http://localhost:8000 in Chrome.
  • Ensure your video files are in a format Chrome supports (WebM/MP4 work best).

内容的提问来源于stack exchange,提问作者James

火山引擎 最新活动