You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为带粒子效果的倒计时页面添加结束跳转并解决失效问题?

解决倒计时失效+保留粒子效果+结束跳转的问题

嘿,我猜你之前是把跳转逻辑和倒计时逻辑割裂开了,才导致倒计时没跑完就跳走,或者干脆没正常渲染对吧?别慌,咱们把逻辑理顺,既能保住炫酷的粒子效果,又能让倒计时乖乖走完再跳转。

1. 核心思路拆解

  • 先让粒子动画独立运行,别干扰倒计时的DOM渲染
  • 用setInterval做倒计时的实时更新,每秒刷新剩余时间
  • 把跳转逻辑绑定到倒计时结束的判断上,确保倒计时走完再跳转
  • 用CSS层级控制,让倒计时内容始终显示在粒子上方

2. 完整可运行代码示例

HTML+CSS+JS 一体化实现

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Temperature Sensor Coming Soon</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
        body {
            font-family: 'Arial', sans-serif;
            overflow: hidden;
        }
        /* 粒子容器占满全屏 */
        #particles-js {
            position: absolute;
            width: 100%;
            height: 100%;
            background-color: #1a1a2e;
        }
        /* 倒计时容器悬浮在粒子上方 */
        .countdown-wrapper {
            position: relative;
            z-index: 10;
            width: 100%;
            top: 50%;
            transform: translateY(-50%);
            text-align: center;
            color: #ffffff;
        }
        .countdown-title {
            font-size: 2.5rem;
            margin-bottom: 2rem;
            text-shadow: 0 0 10px rgba(255,255,255,0.5);
        }
        .countdown-timer {
            display: flex;
            justify-content: center;
            gap: 2rem;
            flex-wrap: wrap;
        }
        .timer-block {
            background: rgba(255,255,255,0.1);
            padding: 1.5rem 1rem;
            border-radius: 8px;
            backdrop-filter: blur(10px);
        }
        .timer-value {
            font-size: 3.5rem;
            font-weight: bold;
            margin-bottom: 0.5rem;
        }
        .timer-label {
            font-size: 0.9rem;
            text-transform: uppercase;
            letter-spacing: 1px;
        }
    </style>
</head>
<body>
    <!-- 粒子动画容器 -->
    <div id="particles-js"></div>
    <!-- 倒计时内容 -->
    <div class="countdown-wrapper">
        <h1 class="countdown-title">Temperature Sensor coming soon</h1>
        <div class="countdown-timer">
            <div class="timer-block">
                <div class="timer-value" id="days">00</div>
                <div class="timer-label">Days</div>
            </div>
            <div class="timer-block">
                <div class="timer-value" id="hours">00</div>
                <div class="timer-label">Hours</div>
            </div>
            <div class="timer-block">
                <div class="timer-value" id="minutes">00</div>
                <div class="timer-label">Minutes</div>
            </div>
            <div class="timer-block">
                <div class="timer-value" id="seconds">00</div>
                <div class="timer-label">Seconds</div>
            </div>
        </div>
    </div>

    <!-- 粒子效果JS(可替换为本地文件) -->
    <script src="https://cdn.jsdelivr.net/particles.js/2.0.0/particles.min.js"></script>
    <script>
        // 初始化粒子动画
        particlesJS('particles-js', {
            "particles": {
                "number": {"value": 100, "density": {"enable": true, "value_area": 800}},
                "color": {"value": "#ffffff"},
                "opacity": {"value": 0.6, "random": true},
                "size": {"value": 3, "random": true},
                "line_linked": {"enable": true, "distance": 150, "color": "#ffffff", "opacity": 0.3, "width": 1},
                "move": {"enable": true, "speed": 2, "direction": "none", "random": true, "out_mode": "out"}
            },
            "interactivity": {
                "detect_on": "canvas",
                "events": {
                    "onhover": {"enable": true, "mode": "grab"},
                    "onclick": {"enable": true, "mode": "push"},
                    "resize": true
                }
            },
            "retina_detect": true
        });

        // 倒计时核心函数
        function initCountdown(targetTimestamp) {
            const updateTimer = setInterval(() => {
                const now = Date.now();
                const remainingTime = targetTimestamp - now;

                // 时间格式转换
                const days = Math.floor(remainingTime / (1000 * 60 * 60 * 24));
                const hours = Math.floor((remainingTime % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
                const minutes = Math.floor((remainingTime % (1000 * 60 * 60)) / (1000 * 60));
                const seconds = Math.floor((remainingTime % (1000 * 60)) / 1000);

                // 更新DOM(补零保证格式统一)
                document.getElementById('days').textContent = days.toString().padStart(2, '0');
                document.getElementById('hours').textContent = hours.toString().padStart(2, '0');
                document.getElementById('minutes').textContent = minutes.toString().padStart(2, '0');
                document.getElementById('seconds').textContent = seconds.toString().padStart(2, '0');

                // 倒计时结束:清除定时器+跳转页面
                if (remainingTime < 0) {
                    clearInterval(updateTimer);
                    // 替换成你的目标页面地址
                    window.location.href = "/sensor-landing-page.html";
                }
            }, 1000);
        }

        // 设置目标时间(示例:当前时间+30秒,可改为具体日期如new Date("2024-12-31T23:59:59").getTime())
        const targetTime = Date.now() + 30000;
        // 启动倒计时
        initCountdown(targetTime);
    </script>
</body>
</html>

3. 关键细节说明

  • 层级控制:通过z-index让倒计时容器悬浮在粒子画布上方,避免被遮挡
  • 联动逻辑:把跳转放在倒计时的更新循环里,只有当剩余时间为负时才触发,绝对不会出现倒计时没走完就跳走的情况
  • 格式统一:用padStart(2, '0')让时间数字始终保持两位,视觉更整齐
  • 粒子独立性:粒子动画的初始化和倒计时逻辑完全分离,互不干扰,确保两者都能正常运行

4. 你之前的问题排查

如果你之前是用单独的setTimeout硬写跳转时长,比如:

// 错误示例:固定时长跳转,和倒计时不联动
setTimeout(() => window.location.href = "xxx.html", 10000);

这种方式很容易出现倒计时和跳转不同步的问题,而上面的方案是完全绑定倒计时的剩余时间,从根源上解决了这个问题。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:14:22