核心思路

无论哪种实现方式,其核心逻辑都是相同的:

javascript网页倒计时跳转
(图片来源网络,侵删)
  1. 设置目标时间:确定倒计时结束并执行跳转的时间点。
  2. 计算剩余时间:在页面上显示一个定时器,每隔一秒计算当前时间与目标时间的差值。
  3. 更新显示:将计算出的剩余时间(天、小时、分钟、秒)更新到网页的某个元素(如 <div><span>)中。
  4. 执行跳转:当剩余时间小于等于 0 时,清除定时器,并执行 window.location.href 进行页面跳转。

基础实现(简单直接)

这是最基本、最容易理解的版本,适用于简单的场景。

HTML 代码

在 HTML 中创建一个用于显示倒计时的容器。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">倒计时跳转</title>
    <style>
        body {
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
            margin: 0;
            background-color: #f0f0f0;
            font-family: Arial, sans-serif;
        }
        #countdown {
            font-size: 3rem;
            color: #333;
        }
    </style>
</head>
<body>
    <div id="countdown">10</div>
    <script src="countdown.js"></script>
</body>
</html>

JavaScript 代码

创建一个 countdown.js 文件,并编写以下逻辑。

// countdown.js
// 1. 获取显示倒计时的DOM元素
const countdownElement = document.getElementById('countdown');
// 2. 设置倒计时的总秒数(10秒)
let seconds = 10;
// 3. 创建一个定时器,每1000毫秒(1秒)执行一次
const timer = setInterval(function() {
    // 每次执行,秒数减1
    seconds--;
    // 4. 更新页面显示
    countdownElement.textContent = seconds;
    // 5. 判断倒计时是否结束
    if (seconds <= 0) {
        // 清除定时器,防止继续执行
        clearInterval(timer);
        // 跳转到指定页面
        window.location.href = 'https://www.example.com'; // 替换成你要跳转的URL
        // (可选)显示提示信息而不是数字
        // countdownElement.textContent = '即将跳转...';
    }
}, 1000);

功能完善版(推荐)

这个版本更实用,它将倒计时格式化为“天:小时:分钟:秒”,并且代码结构更清晰,便于复用。

javascript网页倒计时跳转
(图片来源网络,侵删)

HTML 代码

HTML 结构需要稍作调整,以便分别显示天、小时、分钟和秒。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">倒计时跳转(完善版)</title>
    <style>
        body {
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
            margin: 0;
            background-color: #2c3e50;
            color: white;
            font-family: 'Courier New', Courier, monospace;
        }
        .countdown-container {
            text-align: center;
        }
        .countdown-label {
            font-size: 1.5rem;
            margin-bottom: 20px;
        }
        .countdown-timer {
            display: flex;
            gap: 15px;
            justify-content: center;
        }
        .time-unit {
            background-color: #34495e;
            padding: 20px;
            border-radius: 10px;
            min-width: 80px;
        }
        .time-number {
            font-size: 2.5rem;
            font-weight: bold;
        }
        .time-label {
            font-size: 0.9rem;
            margin-top: 5px;
        }
    </style>
</head>
<body>
    <div class="countdown-container">
        <div class="countdown-label">页面将在 <span id="target-url">https://www.example.com</span> 后跳转</div>
        <div class="countdown-timer">
            <div class="time-unit">
                <div class="time-number" id="days">00</div>
                <div class="time-label">天</div>
            </div>
            <div class="time-unit">
                <div class="time-number" id="hours">00</div>
                <div class="time-label">时</div>
            </div>
            <div class="time-unit">
                <div class="time-number" id="minutes">00</div>
                <div class="time-label">分</div>
            </div>
            <div class="time-unit">
                <div class="time-number" id="seconds">00</div>
                <div class="time-label">秒</div>
            </div>
        </div>
    </div>
    <script src="countdown-advanced.js"></script>
</body>
</html>

JavaScript 代码

这个版本会计算一个未来的时间点(比如5分钟后),并动态更新显示。

// countdown-advanced.js
document.addEventListener('DOMContentLoaded', function() {
    // --- 配置项 ---
    const targetUrl = 'https://www.example.com'; // 目标跳转地址
    const countdownMinutes = 5; // 倒计时分钟数
    // --- DOM 元素 ---
    const daysElement = document.getElementById('days');
    const hoursElement = document.getElementById('hours');
    const minutesElement = document.getElementById('minutes');
    const secondsElement = document.getElementById('seconds');
    const targetUrlElement = document.getElementById('target-url');
    targetUrlElement.textContent = targetUrl; // 显示目标URL
    // --- 计算目标时间 ---
    // 获取当前时间,并加上倒计时设定的分钟数
    const targetDate = new Date().getTime() + (countdownMinutes * 60 * 1000);
    // --- 启动定时器 ---
    const timer = setInterval(function() {
        // 获取当前时间
        const now = new Date().getTime();
        // 计算剩余的毫秒数
        const distance = targetDate - now;
        // 计算天、小时、分钟、秒
        const days = Math.floor(distance / (1000 * 60 * 60 * 24));
        const hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
        const minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
        const seconds = Math.floor((distance % (1000 * 60)) / 1000);
        // 更新显示内容,并确保始终是两位数
        daysElement.textContent   = String(days).padStart(2, '0');
        hoursElement.textContent  = String(hours).padStart(2, '0');
        minutesElement.textContent = String(minutes).padStart(2, '0');
        secondsElement.textContent = String(seconds).padStart(2, '0');
        // 如果倒计时结束
        if (distance < 0) {
            clearInterval(timer); // 停止定时器
            daysElement.textContent   = '00';
            hoursElement.textContent  = '00';
            minutesElement.textContent = '00';
            secondsElement.textContent = '00';
            // 执行跳转
            window.location.href = targetUrl;
        }
    }, 1000);
});

代码解释:

  1. targetUrlcountdownMinutes:将配置项放在顶部,方便修改。
  2. new Date().getTime():获取当前时间的 UTC 时间戳(毫秒数),这是一个精确的数字,非常适合做计算。
  3. targetDate:计算出倒计时结束时的精确时间戳。
  4. Math.floor():对结果向下取整,得到完整的整数。
  5. padStart(2, '0'):这是一个非常有用的字符串方法,它会确保字符串的长度为2,如果长度不足,则在前面补 '0'。'7'.padStart(2, '0') 会变成 '07',让显示更美观。
  6. distance < 0:当 distance 为负数时,说明目标时间已经过去,倒计时结束。

使用 setTimeout 递归实现

除了 setInterval,我们还可以使用 setTimeout 结合递归来实现倒计时,这种方式的优点是更灵活,但逻辑上稍微复杂一点。

javascript网页倒计时跳转
(图片来源网络,侵删)
// 使用 setTimeout 的倒计时实现
const countdownElement = document.getElementById('countdown');
let seconds = 10;
function startCountdown() {
    if (seconds > 0) {
        countdownElement.textContent = seconds;
        seconds--;
        // 1秒后再次调用自己
        setTimeout(startCountdown, 1000);
    } else {
        countdownElement.textContent = '跳转中...';
        window.location.href = 'https://www.example.com';
    }
}
// 启动倒计时
startCountdown();

setInterval 的区别:

  • setInterval:像一个闹钟,设定好后每隔固定时间就会响一次,不管上一次的任务是否完成,如果任务执行时间超过了间隔时间,可能会导致任务堆积。
  • setTimeout 递归:像一个“接力赛”,当前任务完成后,再“预定”下一个任务,这种方式能确保每次执行之间至少有指定的间隔,逻辑上更严谨,但在倒计时这种简单场景下,两者效果几乎一样。

总结与建议

特性 方案一 (基础版) 方案二 (完善版) 方案三 (setTimeout)
易用性 非常简单 简单,需稍多HTML 中等,逻辑递归
功能 简单秒数倒计时 完整的时分秒倒计时 简单秒数倒计时
可维护性 差,硬编码 ,配置清晰 中等
适用场景 快速测试、简单提示 推荐,大多数正式场景 需要更精细控制任务链时

对于绝大多数情况,强烈推荐使用【方案二:功能完善版】,它代码健壮、显示美观、易于维护和扩展,你可以直接复制代码,只需修改 targetUrlcountdownMinutes 这两个变量,就能快速应用到你的项目中。