环形倒计时核心是svg的配合stroke-dasharray和stroke-dashoffset动态控制描边进度,需用js计算周长(2×π×r)并设置初始偏移,通过transform="rotate(-90)"将起点移至顶部实现顺时针收缩,用requestanimationframe更新offset,且须显式判断归零避免浮点误差。

环形倒计时不是靠 <progress></progress> 或 CSS 动画“假装”出来的,核心是用 SVG 的 <circle></circle> 配合 stroke-dasharray 和 stroke-dashoffset 控制描边绘制进度,再用 JavaScript 实时更新偏移量。纯 CSS 方案无法精确控制倒计时逻辑(比如暂停、重置、回调),面试时若只写 CSS 会被追问“怎么绑定时间结束事件?”
SVG 圆环路径怎么算周长?别硬写 250
硬编码 stroke-dasharray="250" 是常见错误——圆环半径一变就错。必须用 JS 动态计算:r 是 <circle></circle> 的 r 属性值,周长 = 2 * Math.PI * r。这个值要存为变量,后续所有偏移计算都基于它。
示例关键代码:
const circle = document.querySelector('circle');
const radius = parseFloat(circle.getAttribute('r'));
const circumference = 2 * Math.PI * radius;
circle.style.strokeDasharray = `${circumference} ${circumference}`;
circle.style.strokeDashoffset = circumference;
倒计时怎么让圆环从上顶点顺时针收拢?
默认起点在圆环右侧(3 点钟方向),需用 transform="rotate(-90)" 把起点转到顶部;再配合 stroke-dashoffset 从最大值递减,视觉上就是顺时针收缩。
使用 PptxGenJS 和 Python 解析,将结构化的 HTML/CSS 幻灯片内容转换为原生、可编辑的 PowerPoint(.pptx)演示文稿。
注意点:
-
rotate(-90)必须加在<circle></circle>上,不能只加在父<svg></svg> - JS 中每次更新前先设
strokeDashoffset = circumference,再根据剩余时间按比例减去对应偏移量 - 用
requestAnimationFrame而非setInterval,避免动画掉帧导致“卡顿感”
怎么处理 0 秒时的边界问题?
当倒计时归零,strokeDashoffset 应等于 0,但浮点运算可能残留极小值(如 0.000001),导致圆环不完全消失。必须显式判断:
if (remaining
circle.style.strokeDashoffset = '0';
onComplete && onComplete();
clearInterval(timer); // 或 cancelAnimationFrame
}
另外,CSS 里要禁用过渡动画:transition: stroke-dashoffset 0s;,否则归零瞬间会回弹或延迟收尾。
真正难的不是画个圆,而是让每一帧的偏移量和真实流逝时间对齐——尤其在页面切到后台再切回来时,requestAnimationFrame 会暂停,得用 Date.now() 校准已过去的时间差。这点常被忽略。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










