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

(图片来源网络,侵删)
- 设置目标时间:确定倒计时结束并执行跳转的时间点。
- 计算剩余时间:在页面上显示一个定时器,每隔一秒计算当前时间与目标时间的差值。
- 更新显示:将计算出的剩余时间(天、小时、分钟、秒)更新到网页的某个元素(如
<div>或<span>)中。 - 执行跳转:当剩余时间小于等于 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);
功能完善版(推荐)
这个版本更实用,它将倒计时格式化为“天:小时:分钟:秒”,并且代码结构更清晰,便于复用。

(图片来源网络,侵删)
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);
});
代码解释:
targetUrl和countdownMinutes:将配置项放在顶部,方便修改。new Date().getTime():获取当前时间的 UTC 时间戳(毫秒数),这是一个精确的数字,非常适合做计算。targetDate:计算出倒计时结束时的精确时间戳。Math.floor():对结果向下取整,得到完整的整数。padStart(2, '0'):这是一个非常有用的字符串方法,它会确保字符串的长度为2,如果长度不足,则在前面补 '0'。'7'.padStart(2, '0')会变成'07',让显示更美观。distance < 0:当distance为负数时,说明目标时间已经过去,倒计时结束。
使用 setTimeout 递归实现
除了 setInterval,我们还可以使用 setTimeout 结合递归来实现倒计时,这种方式的优点是更灵活,但逻辑上稍微复杂一点。

(图片来源网络,侵删)
// 使用 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 | 中等,逻辑递归 |
| 功能 | 简单秒数倒计时 | 完整的时分秒倒计时 | 简单秒数倒计时 |
| 可维护性 | 差,硬编码 | 好,配置清晰 | 中等 |
| 适用场景 | 快速测试、简单提示 | 推荐,大多数正式场景 | 需要更精细控制任务链时 |
对于绝大多数情况,强烈推荐使用【方案二:功能完善版】,它代码健壮、显示美观、易于维护和扩展,你可以直接复制代码,只需修改 targetUrl 和 countdownMinutes 这两个变量,就能快速应用到你的项目中。
