当前位置: 首页 > news >正文

HTML创意工坊之动态倒计时页面

1. 从零开始打造动态倒计时页面

每次看到电商大促或者重要活动的倒计时页面,是不是觉得特别酷?其实用HTML、CSS和JavaScript三件套就能轻松实现。我去年给朋友婚礼做的电子请柬就用了这个效果,宾客们都说很有仪式感。今天我们就来手把手实现一个支持自定义背景、带半透明玻璃效果的高级倒计时页面。

这个项目特别适合刚入门前端的小伙伴,只需要基础语法知识就能完成。最终效果会包含动态跳动的数字、自适应背景和响应式布局,在手机和电脑上都能完美显示。我还会教你几个让倒计时更专业的技巧,比如防止页面刷新时的闪烁、优化性能避免卡顿等实际开发中会遇到的问题。

2. 搭建HTML骨架结构

2.1 基础文档结构

我们先从HTML开始搭建页面骨架。建议用VS Code新建文件,保存为countdown.html。基础结构如下:

<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>新年倒计时</title> <link rel="stylesheet" href="styles.css"> </head> <body> <div class="countdown-wrapper"> <h1>距离2025年还有</h1> <div class="countdown-container"> <div class="time-box"> <span id="days">00</span> <span>天</span> </div> <!-- 类似结构添加小时、分钟、秒 --> </div> </div> <script src="script.js"></script> </body> </html>

这里有几个注意点:lang属性设为zh-CN支持中文显示,viewport设置确保移动端适配。我把CSS和JS都拆分成独立文件,这样结构更清晰。实际项目中你可能还需要添加favicon等元信息。

2.2 倒计时容器设计

倒计时区域我采用了模块化设计,每个时间单位(天、小时等)都用单独的div包裹。这样做有两个好处:一是CSS样式更好控制,二是后期要添加动画效果会更方便。在countdown-container里我放了4个time-box,分别对应天、小时、分钟和秒。

<div class="countdown-container"> <div class="time-box"> <span id="days">00</span> <span>天</span> </div> <div class="time-box"> <span id="hours">00</span> <span>小时</span> </div> <!-- 分钟和秒的类似结构 --> </div>

3. 用CSS打造视觉盛宴

3.1 背景与整体布局

新建styles.css文件,先处理整体布局。我推荐使用CSS变量来管理颜色和尺寸,后期调整会非常方便:

:root { --primary-color: #ff4757; --secondary-color: #2f3542; --glass-color: rgba(255, 255, 255, 0.2); --text-light: #ffffff; } body { margin: 0; height: 100vh; display: flex; justify-content: center; align-items: center; background: url('bg.jpg') center/cover no-repeat; font-family: 'Microsoft YaHei', sans-serif; }

背景图片建议使用高分辨率图片,我这里用了bg.jpg。实际项目中你可以用CSS渐变或者多个背景图叠加创造更复杂的效果。flex布局确保内容始终居中显示,vh单位让页面撑满整个视口。

3.2 毛玻璃效果实现

倒计时容器我采用了现在流行的毛玻璃效果:

.countdown-wrapper { backdrop-filter: blur(10px); background: var(--glass-color); border-radius: 15px; padding: 2rem; box-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.37); border: 1px solid rgba(255, 255, 255, 0.18); } .time-box { display: inline-block; margin: 0 15px; text-align: center; } .time-box span:first-child { font-size: 3rem; font-weight: bold; color: var(--text-light); text-shadow: 0 0 10px rgba(0, 0, 0, 0.5); }

backdrop-filter是实现毛玻璃效果的关键属性,但要注意兼容性问题。我给数字添加了文字阴影增强可读性,并使用了较大的字号突出显示。每个time-box采用inline-block布局,方便水平排列。

4. JavaScript动态逻辑实现

4.1 核心倒计时算法

在script.js中,我们先定义目标日期和更新函数:

// 设置目标时间为2025年1月1日零点 const targetDate = new Date('2025-01-01T00:00:00').getTime(); function updateCountdown() { 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); // 更新DOM document.getElementById('days').textContent = formatTime(days); document.getElementById('hours').textContent = formatTime(hours); document.getElementById('minutes').textContent = formatTime(minutes); document.getElementById('seconds').textContent = formatTime(seconds); // 倒计时结束处理 if (distance < 0) { clearInterval(countdownInterval); document.querySelector('.countdown-container').innerHTML = '<h2>新年快乐!</h2>'; } } // 格式化时间显示,保证两位数 function formatTime(time) { return time < 10 ? `0${time}` : time; } // 立即执行一次避免初始延迟 updateCountdown(); const countdownInterval = setInterval(updateCountdown, 1000);

这段代码有几个优化点:使用formatTime函数保证始终显示两位数;立即执行一次函数避免首次加载时的1秒延迟;结束时的处理用innerHTML替换整个容器内容。

4.2 性能优化技巧

在实际项目中,我推荐使用requestAnimationFrame代替setInterval:

let lastUpdate = 0; function smoothUpdate(timestamp) { if (timestamp - lastUpdate >= 1000) { updateCountdown(); lastUpdate = timestamp; } requestAnimationFrame(smoothUpdate); } requestAnimationFrame(smoothUpdate);

这种方式更省电,动画也更流畅。另外可以添加防抖处理,防止页面隐藏时(比如切换标签页)不必要的计算:

document.addEventListener('visibilitychange', () => { if (document.hidden) { clearInterval(countdownInterval); } else { updateCountdown(); countdownInterval = setInterval(updateCountdown, 1000); } });

5. 高级功能扩展

5.1 添加动画效果

让数字变化时有弹跳动画,先在CSS中添加:

@keyframes bounce { 0%, 100% { transform: scale(1); } 50% { transform: scale(1.2); } } .time-box span:first-child { /* 已有样式 */ transition: all 0.3s ease; } .bounce { animation: bounce 0.5s ease; }

然后修改JavaScript:

function animateElement(id) { const element = document.getElementById(id); element.classList.remove('bounce'); void element.offsetWidth; // 触发重绘 element.classList.add('bounce'); } // 在updateCountdown函数中调用 animateElement('seconds'); // 其他单位根据需要调用

5.2 响应式设计调整

针对移动设备调整样式:

@media (max-width: 768px) { .countdown-wrapper { padding: 1rem; width: 90%; } .time-box { margin: 0 5px; } .time-box span:first-child { font-size: 2rem; } }

5.3 添加进度条

可以在底部添加一个时间进度条:

<div class="progress-container"> <div class="progress-bar" id="progress"></div> </div>

CSS样式:

.progress-container { width: 100%; height: 5px; background: var(--glass-color); margin-top: 20px; border-radius: 5px; } .progress-bar { height: 100%; background: var(--primary-color); border-radius: 5px; width: 0%; transition: width 0.5s ease; }

JavaScript更新:

// 在updateCountdown函数中添加 const totalDuration = new Date('2025-01-01') - new Date('2024-01-01'); const elapsed = totalDuration - distance; const progressPercent = (elapsed / totalDuration) * 100; document.getElementById('progress').style.width = `${progressPercent}%`;
http://www.cnnetsun.cn/news/1770223.html

相关文章:

  • Verdi里看功耗波形:用PTPX Time-Based模式分析门级网表实战
  • TranslucentTB终极指南:Windows任务栏透明效果完整解决方案
  • 为什么你的.NET 9边缘服务在Raspberry Pi 5上启动慢400ms?——基于JIT预编译+LLVM IR优化的3层根因定位法
  • 5步掌握抖音无水印下载终极指南:从零到批量处理高效方案
  • 告别乱码:EncodingChecker批量编码检测工具全解析
  • 基于Matlab Simulink的微电网模型仿真平台:风光储微电网与永磁风机并网仿真研究
  • 2026年苏州商用净水服务全景观察:如何选择真正省心的长期伙伴?
  • SDMatte与前端面试题结合:实现一个在线图片抠图编辑器
  • 基于ETHERCAT总线的H5U伺服控制程序框架,适用于汇川以及其他品牌的PLC,清晰易懂,是...
  • 从视频到3D模型:手把手教你用3D Gaussian Splatting在Ubuntu 22.04上重建自己的手办
  • 实战指南 — 基于TCGA的差异表达分析全流程与可视化呈现
  • Job调度延迟超标?深度解析Unity 2022.3+ Scheduler线程池饥饿问题,附可落地的4层负载均衡补丁代码
  • WarcraftHelper:魔兽争霸III现代化兼容性优化方案
  • 别让任务切换拖后腿:利用Cortex-M4的Lazy Stacking优化RTOS性能
  • 百度网盘提取码智能解析架构:自动化资源获取的技术实现原理
  • 从CHIME认证失败到一次性通过:C# FHIR服务器部署全链路检查清单(含IIS模块冲突、TLS1.2强制协商、XDR网关穿透等17个隐蔽项)
  • 如何用Save Image as Type实现Chrome图片格式一键转换:完整指南
  • 5个核心策略解决Windows更新故障
  • 93.91%压缩率背后的技术革命:CompressO如何解决企业级视频处理的效率困境
  • Jenkins 学习总结换
  • Docker+SyncTV+cpolar三件套:手把手教你搭建私人同步影院(附固定域名技巧)
  • GBase 8a 临时表使用边界和中间结果落地策略
  • 在超大数据集下 DuckDB 与 MySQL 查询速度对比拥
  • py之图片转gif工具代码
  • 从VASP数据到LAMMPS模拟:手把手教你用DeePMD-kit搭建材料计算新流程
  • NumPy 基础知识
  • 园区管理不用愁,人脸识别打造高效智慧园区
  • 华一拼团热度背后:中小商家的「流量狂欢」与「经营基本功」思考
  • 赛博朋克2077存档修改器:新手快速上手完整指南
  • Mac微信消息本地留存解决方案全攻略:打造个人数据安全屏障