数据统计卡片 4 款(数字滚动 + SVG 趋势图 CSS 源码)
数据统计卡片组件源码:requestAnimationFrame 数字滚动、SVG 迷你趋势折线、今日/本周/本月周期切换、涨跌徽章,纯 CSS + 原生 JS 实现,适合后台仪表盘与数据看板。
效果演示(真实可交互)
下方为 4 张数据统计卡片:访问量、销售额、新增用户、转化率。页面加载时数字从 0 滚动到目标值;点击”今日 / 本周 / 本月”分段按钮,四张卡片联动刷新数值并带颜色闪烁反馈;每张卡片底部有一条彩色 SVG 迷你趋势折线,悬停卡片整体上浮。
完整代码
HTML 结构:每张卡片包含标签、涨跌徽章、数字(由 data-target 指定目标值)与 SVG 折线:
<div class="ds-card">
<div class="ds-top">
<span class="ds-label">访问量</span>
<span class="ds-trend up">▲ 12.4%</span>
</div>
<div class="ds-value" data-target="12860" data-decimals="0">0</div>
<svg class="ds-spark" viewBox="0 0 100 30" preserveAspectRatio="none">
<polyline points="0,24 12,20 24,22 36,14 48,16 60,10 72,12 84,6 100,8" />
</svg>
</div>
核心 CSS:SVG 折线用 CSS 变量控制每张卡片的专属颜色,涨跌徽章用透明背景色块区分:
.ds-spark polyline { stroke: var(--ds-grad); stroke-width: 2; fill: none; }
.ds-card:nth-child(2) .ds-spark { --ds-grad: #43e97b; }
.ds-trend.up { color: #43e97b; background: rgba(67, 233, 123, .12); }
.ds-trend.down { color: #ff6b9d; background: rgba(255, 107, 157, .12); }
原生 JS 数字滚动(requestAnimationFrame + easeOutCubic):
function countTo(el, target, decimals) {
const t0 = performance.now(), dur = 900;
const ease = t => 1 - Math.pow(1 - t, 3);
function step(now) {
const t = Math.min((now - t0) / dur, 1);
el.textContent = (target * ease(t)).toFixed(decimals);
if (t < 1) requestAnimationFrame(step);
}
requestAnimationFrame(step);
}
periodBtns.forEach(btn => {
btn.addEventListener('click', () => {
applyPeriod(btn.dataset.p); // 今日/本周/本月数据切换
});
});
参数说明
| 参数 | 默认值 | 说明 |
|---|---|---|
data-target | — | 数字滚动目标值,支持小数(如 3.42) |
data-decimals | 0 | 保留小数位数,千分位自动格式化 |
data-prefix / suffix | 空 | 数字前后缀,如 ¥、% |
| 滚动时长 | 900ms | 单次数值动画时长 |
| 缓动函数 | easeOutCubic | 先快后慢,视觉更自然 |
周期数据 MAP | 3 组 | 今日/本周/本月三套数值 |
兼容性与性能
- 数字滚动用
requestAnimationFrame驱动,与屏幕刷新率同步,比setInterval更平滑省电 - 数字使用
font-variant-numeric: tabular-nums等宽数字,滚动过程不产生宽度抖动 - SVG 折线为静态图形,无逐帧更新,渲染开销极低
- 动画期间仅更新文本节点,不触发布局;切换周期时用
animating标志防止连点导致动画叠加
常见问题
Q: 数值是假的吗?怎么接真实接口? 是演示数据。接入时用接口返回值替换 MAP 或直接调用 countTo(el, realValue, decimals) 即可,滚动逻辑通用。
Q: 折线图想换成柱状图或面积图? SVG 部分可替换为 <rect> 柱状或给 polyline 加 stroke 渐变 + 半透明填充形成面积图,卡片骨架无需改动。
Q: 数字滚动太快/太慢怎么调? 修改 dur 变量(默认 900ms),或换成 easeOutQuart 等更陡峭的缓动曲线。
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(缓动曲线)等属性即可,代码中有注释说明。