做为一名正在为高考奋斗的高三党,日复一日实在是太无聊啦!于是我突然灵光一闪,做了这个高考倒计时的小工具

Countdown!(๑•̀ㅂ•́)و✧

为什么会想到做这个?

高三的日子真的好忙碌呀,每天都在刷题、背书、考试中循环。有一天我突然想:要是有个能随时提醒我距离高考还有多久,又能给我加油打气的小工具就好啦!

于是我就在GitHub上翻呀翻,想找一个简单又好看的高考倒计时网页。逛了好久,终于发现了Gasolcloudteam/Countdown这个仓库~ 它的功能很基础,但我觉得可以给它加点“魔法”,让它变得更有趣、更能鼓励像我一样的考生!

说干就干,我决定fork这个项目,按照自己的想法改造它!

我的改造之旅~

时间计算

一开始我只是想先看看原项目是怎么工作的。打开代码研究了一番,发现它的倒计时计算有点小问题~ 作为一个要参加高考的人,时间可是容不得半点马虎的!

我仔细检查了日期计算的逻辑,重新写了一遍代码,确保它能精确地计算出距离高考的每一分每一秒~ 现在它终于可以准确告诉我还剩多少天可以努力啦!

“鼓励魔法”!

倒计时只是基础功能,我希望这个工具还能在我累了的时候给我加油打气~

于是我想:要是在高考当天,它能自动跳出一句“考试顺利”的祝福该多好!我立刻动手实现了这个功能~ 现在,无论是高考还是其他重要考试,到了那一天它都会给你送上最温暖的祝福哦 (✧ω✧)

不止高考

高三可不止高考这一个考试呢~ 我们还有调研考、零模、一模、二模… 每个考试都很重要!

我就想:要是能在同一个页面查看所有重要考试的倒计时就好啦!于是我给它加了个超级实用的功能——考试类型切换!

我首先定义了所有重要考试的配置:

1
2
3
4
5
6
7
8
// 考试类型配置
const exams = [
{ name: "调研考", year: 2025, month: 7, day: 21 },
{ name: "零模", year: 2025, month: 11, day: 23 },
{ name: "一模", year: 2026, month: 2, day: 19 },
{ name: "二模", year: 2026, month: 3, day: 21 },
{ name: "高考", year: 2026, month: 5, day: 7 }
];

然后实现了一个智能选择最近考试的函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 自动选择最近的一次大考
function selectNearestExam() {
const today = new Date();
let nearestExamIndex = 0;
let minDaysDifference = Infinity;

for (let i = 0; i < exams.length; i++) {
const examDate = new Date(exams[i].year, exams[i].month, exams[i].day);
const timeDiff = examDate - today;
const daysDifference = Math.ceil(timeDiff / (1000 * 60 * 60 * 24));

// 只考虑未来的考试
if (daysDifference >= 0 && daysDifference < minDaysDifference) {
minDaysDifference = daysDifference;
nearestExamIndex = i;
}
}

return nearestExamIndex;
}

最后添加了点击切换的交互逻辑:

1
2
3
4
5
6
7
8
9
10
11
12
13
// 考试类型切换点击事件 - 实现点击切换功能
document.getElementById("examType").addEventListener("click", () => {
if (displayMode === 'gaokao') {
// 从高考切换到最近的大考
displayMode = 'nearest';
currentExamIndex = selectNearestExam();
} else {
// 从最近的大考切换回高考
displayMode = 'gaokao';
currentExamIndex = exams.findIndex(exam => exam.name.includes('高考'));
}
updateCountdown(new Date());
});

现在你可以点击考试名称,在高考和最近的考试之间自由切换~ 这样就不会错过任何一个重要的时间节点啦!

再好看点

作为一个喜欢美的高三党,怎么能容忍界面不好看呢?我换了一张超美的背景图,还调整了页面的整体布局~ 现在看起来是不是舒服多啦?

不过我觉得还不够!我想要让它变得更有趣、更好玩~ 于是我想到了一个超酷的点子——点击波纹效果!

这个效果的JavaScript实现是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// 添加点击波纹特效
document.addEventListener('click', function(e) {
// 创建主波纹
createRipple(e, 1);

// 创建次级波纹,增加层次感
setTimeout(() => {
createRipple(e, 0.7, 0.2);
}, 100);
});

function createRipple(e, scaleFactor, delay = 0) {
const ripple = document.createElement('div');
ripple.classList.add('ripple');
// 随机大小变化 (80-140px)
const size = Math.random() * 60 + 80 * scaleFactor;
ripple.style.width = `${size}px`;
ripple.style.height = `${size}px`;
// 计算点击位置
const x = e.clientX - size / 2;
const y = e.clientY - size / 2;
// 设置波纹位置和样式
ripple.style.left = `${x}px`;
ripple.style.top = `${y}px`;
ripple.style.animationDelay = `${delay}s`;

// 使用HSL颜色模型创建蓝绿色系渐变
const hue = Math.random() * 60 + 180; // 180-240 蓝绿色系
ripple.style.background = `radial-gradient(circle, hsla(${hue}, 100%, 70%, 0.4) 0%, hsla(${hue}, 100%, 70%, 0.1) 100%)`;
document.body.appendChild(ripple);

// 动画结束后移除元素
ripple.addEventListener('animationend', () => {
ripple.remove();
});
}

配合CSS中的动画效果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
.ripple {
position: absolute;
border-radius: 50%;
background: radial-gradient(circle, rgba(255,255,255,0.4) 0%, rgba(255,255,255,0.1) 100%);
transform: scale(0);
animation: ripple 0.8s cubic-bezier(0.21, 0.98, 0.6, 0.99);
pointer-events: none;
box-shadow: 0 0 20px rgba(255, 255, 255, 0.3);
}

@keyframes ripple {
to {
transform: scale(6);
opacity: 0;
}
}

现在,你只要点击页面的任何地方,就能看到一圈圈蓝绿色的波纹像水波纹一样扩散开来~ 每次点击的波纹大小和颜色都不一样哦,就像在和你玩游戏一样 (๑>◡<๑)

加油!

有一天我学习学累了,盯着倒计时看了好久。突然想:要是能和它互动一下就好了!

于是我又加了个超治愈的功能——双击页面就能触发加油模式!这个功能的实现是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
document.addEventListener('dblclick', function() {
const currentExam = exams[currentExamIndex];
const cheerMessage = document.getElementById('cheerMessage');
const blurElements = document.querySelectorAll('.blur-target, .background-container');

// 先应用模糊效果
blurElements.forEach(el => el.classList.add('blur-background'));

// 延迟0.5秒后显示加油消息
setTimeout(() => {
cheerMessage.textContent = `${currentExam.name}加油!!!!!ヾ(≧ ▽ ≦)ゝ`;
cheerMessage.style.opacity = '1';

// 2秒后恢复原状
setTimeout(() => {
cheerMessage.style.opacity = '0';
blurElements.forEach(el => el.classList.remove('blur-background'));
}, 2000);
}, 500);
});

当你双击屏幕时,背景会变得朦朦胧胧的,然后跳出超大的加油字样~ 每次看到这个,我都会觉得又充满了动力呢!

改造完成后,我重新写了README文档,告诉大家这个小工具怎么用、有什么功能~ 于是我重新写了README文档

一些收获

通过做这个小项目,我不仅有了一个陪伴自己备考的小工具,还学到了好多前端知识!原来用简单的HTML、CSS和JavaScript就能做出这么有趣的东西呀~

虽然它现在已经很好用了,但我脑子里还有好多新点子呢!比如:

  • 让大家可以自己上传喜欢的背景图
  • 记住每个人喜欢的设置

这个高考倒计时小工具不仅是一个记录时间的网页,更是我高三生活的一个小小见证,是我学习编程的一次很有趣尝试~

如果你也觉得它有用,欢迎来看看哦!希望它能在你的备考路上给你一点鼓励和动力~ 我们一起加油,向着自己的目标努力吧!(。・ω・。)ノ♡

点击体验我的高考倒计时

来GitHub和我一起完善它吧~