活动卡片(实时倒计时 + 报名按钮状态 CSS 源码)
活动卡片组件源码:渐变日期徽章、活动标签与详情、实时天时分秒倒计时、报名按钮成功态切换与人数统计,纯 CSS + 原生 JS 实现,适合活动页与会议宣传位。
效果演示(真实可交互)
下方为活动卡片:左上角渐变日期徽章展示”09月09日”,正文包含活动标签与简介,中部为天/时/分/秒四段倒计时,每秒刷新;点击”立即报名”按钮会变为绿色”✓ 报名成功”状态,报名人数同步 +1。
粤喵前端组件大会 2026
聚焦组件化开发与动效实践:8 位讲师分享真实项目踩坑经验,现场还有组件源码工作坊与自由交流环节,报名即送粤喵组件站年度会员。
完整代码
HTML 结构:卡片包含日期徽章、标题与时间地点、标签行、活动描述、倒计时区块与报名操作区:
<div class="ev-card">
<div class="ev-head">
<div class="ev-date"><b>09</b><span>09月</span></div>
<div class="ev-title-box">
<h3>粤喵前端组件大会 2026</h3>
<p>📅 2026-09-09 14:00 · 📍 广州琶洲会展中心</p>
</div>
</div>
<div class="ev-count">
<div class="ev-unit"><b>0</b><span>天</span></div>
<span class="ev-colon">:</span>
<div class="ev-unit"><b>0</b><span>时</span></div>
<!-- 分 / 秒 同理 -->
</div>
<button class="ev-btn">立即报名</button>
<span>已有 1,286 人报名</span>
</div>
核心 CSS:倒计时数字使用渐变文字 + 等宽数字(tabular-nums)防止每秒跳动时宽度抖动;报名成功态切换为绿色:
.ev-num {
font-size: 28px; font-weight: 800; font-variant-numeric: tabular-nums;
background: linear-gradient(180deg, #fff, #9db4ff);
-webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent;
}
.ev-btn.done {
background: linear-gradient(135deg, #43e97b, #38f9d7); color: #0d3b2a;
cursor: default;
}
原生 JS 倒计时与报名逻辑:
const TARGET = new Date('2026-09-09T14:00:00+08:00');
function tick() {
const diff = Math.max(0, TARGET - Date.now());
days.textContent = pad(Math.floor(diff / 86400000));
hours.textContent = pad(Math.floor(diff / 3600000) % 24);
mins.textContent = pad(Math.floor(diff / 60000) % 60);
secs.textContent = pad(Math.floor(diff / 1000) % 60);
}
tick();
setInterval(tick, 1000);
regBtn.addEventListener('click', () => {
if (regBtn.classList.contains('done')) return;
regBtn.classList.add('done');
regBtn.textContent = '✓ 报名成功';
joined.textContent = '已有 ' + (++count).toLocaleString('en-US') + ' 人报名';
});
参数说明
| 参数 | 默认值 | 说明 |
|---|---|---|
目标时间 TARGET | 2026-09-09 14:00 | 倒计时截止时间,改为任意 new Date() 即可 |
| 刷新频率 | 1000ms | 每秒更新一次秒位 |
| 报名人数初始值 | 1286 | 演示数据,生产从接口读取 |
| 成功态文案 | ✓ 报名成功 | 报名后的按钮状态,防止重复提交 |
| 数字渐变 | #fff → #9db4ff | 倒计时数字的纵向渐变 |
兼容性与性能
- 倒计时基于
Date.now()差值计算,不受系统时区影响,跨时区观众看到的时间一致 setInterval每秒仅更新 4 个文本节点,开销极小;页面隐藏时可暂停以节省资源- 渐变文字在不支持
background-clip: text的浏览器中自动降级为白色数字 - 报名成功态用 class 切换,重复点击有防重复保护
常见问题
Q: 活动结束后倒计时显示什么? 组件会定格在 0 天 0 时 0 分 0 秒,此时可搭配”活动已结束”文案或跳转回放链接。
Q: 时间从服务器获取怎么处理? 用接口返回的服务器时间戳计算差值(serverTime - Date.now() 校准),避免用户本地时钟不准导致倒计时偏差。
Q: 报名人数需要防重复点击吗? 已内置:按钮变为 done 状态后再次点击直接 return;生产环境还应接入后端接口做幂等校验。
Q: 可以商用吗? 可以,粤喵自研原创组件,免费商用无需署名,替换活动信息与目标时间即可上线。
许可与来源
- 许可证:自研原创 —— 粤喵自研原创,可免费用于个人与商业项目,无需署名。查看来源公示与许可清单
- 来源:粤喵团队原创自研(从效果思路到代码实现均为独立完成,未直接复制第三方代码)
- 首次发布:2026-09-01 · 最近更新:2026-09-01
- 修改日志:2026-09-01 首次发布;2026-09-13 补充许可证与来源标注、复制按钮说明与法务页入口
- 纠错:联系页面 / min@cactus.asia,2 个工作日内核实处理
常见问题
这个组件可以商用吗?
可以。本组件为粤喵自研原创,可免费用于个人和商业项目,无需署名。
浏览器兼容性如何?
支持所有现代浏览器(Chrome / Firefox / Safari / Edge 最新版本)。旧版 IE 不支持 CSS 动画相关特性。
怎么修改动画参数?
直接调整 CSS 中的 animation-duration(时长)、animation-timing-function(缓动曲线)等属性即可,代码中有注释说明。