
本教程将指导您如何修改基于javascript canvas的圆形进度条,使其能够直接显示目标百分比,而非通过动画逐步增长。我们将分析现有动画机制,并提供优化方案,实现进度条内容的即时渲染,以满足非动画显示的需求,从而提升用户体验并简化代码逻辑。
在Web开发中,使用HTML5 Canvas绘制圆形进度条是一种常见需求。通常,为了展示进度从0到某个目标值的动态过程,我们会采用定时器(如setInterval)来逐步更新绘制角度,从而创建动画效果。
原始代码示例展示了这种动画机制:
window.onload = function() {
var can = document.getElementById('canvas'),
spanProcent = document.getElementById('procent'),
c = can.getContext('2d');
var posX = can.width / 2,
posY = can.height / 2,
fps = 1000 / 200, // 帧率
procent = 0,
oneProcent = 360 / 100, // 1%对应的角度
result = oneProcent * 64; // 目标百分比对应的总角度
c.lineCap = 'round';
arcMove(); // 调用动画函数
function arcMove(){
var deegres = 0; // 初始角度为0
var acrInterval = setInterval (function() {
deegres += 1; // 每次增加1度,实现动画
c.clearRect( 0, 0, can.width, can.height ); // 清除画布
procent = deegres / oneProcent; // 计算当前百分比
spanProcent.innerHTML = procent.toFixed(); // 更新显示百分比
// 绘制背景圆环
c.beginPath();
c.arc( posX, posY, 70, (Math.PI/180) * 270, (Math.PI/180) * (270 + 360) );
c.strokeStyle = '#b1b1b1';
c.lineWidth = '10';
c.stroke();
// 绘制进度圆弧
c.beginPath();
c.strokeStyle = '#3949AB';
c.lineWidth = '10';
c.arc( posX, posY, 70, (Math.PI/180) * 270, (Math.PI/180) * (270 + deegres) );
c.stroke();
if( deegres >= result ) clearInterval(acrInterval); // 达到目标角度后停止动画
}, fps);
}
}在这段代码中,arcMove 函数内的 setInterval 每隔 fps 毫秒执行一次。每次执行,deegres 变量会递增,并重新绘制进度条。这个递增过程就是动画的来源。当 deegres 达到 result(目标百分比对应的角度)时,定时器被清除,动画停止。
有时,我们可能不希望进度条有动画效果,而是要求它在加载时立即显示最终的百分比状态。例如,在页面加载完成后直接显示数据统计结果,无需用户等待动画完成。在这种情况下,上述的动画逻辑就显得多余且可能影响用户体验。
立即学习“Java免费学习笔记(深入)”;
要实现即时显示,核心思想是移除逐步增加角度的动画机制,直接在初始化时将进度条绘制到最终状态。
我们将对原始的 arcMove 函数进行重构,使其不再依赖 setInterval。
window.onload = function() {
var can = document.getElementById('canvas'),
spanProcent = document.getElementById('procent'),
c = can.getContext('2d');
var posX = can.width / 2,
posY = can.height / 2,
oneProcent = 360 / 100, // 1%对应的角度
targetPercentage = 64, // 目标百分比
targetDegrees = oneProcent * targetPercentage; // 目标百分比对应的总角度
c.lineCap = 'round'; // 设置线条端点样式为圆形
// 直接调用绘制函数,传入目标角度和百分比
drawProgressBar(targetDegrees, targetPercentage);
/**
* 绘制圆形进度条和百分比文本
* @param {number} degrees - 进度条应达到的角度
* @param {number} percentage - 进度条应显示的百分比
*/
function drawProgressBar(degrees, percentage){
c.clearRect( 0, 0, can.width, can.height ); // 清除画布
spanProcent.innerHTML = percentage.toFixed(); // 更新显示百分比
// 绘制背景圆环
c.beginPath(); // 开始一条新路径
c.arc( posX, posY, 70, (Math.PI/180) * 270, (Math.PI/180) * (270 + 360) );
c.strokeStyle = '#b1b1b1'; // 背景圆环颜色
c.lineWidth = '10'; // 线宽
c.stroke(); // 绘制路径
// 绘制进度圆弧
c.beginPath(); // 开始一条新路径
c.strokeStyle = '#3949AB'; // 进度圆弧颜色
c.lineWidth = '10'; // 线宽
c.arc( posX, posY, 70, (Math.PI/180) * 270, (Math.PI/180) * (270 + degrees) );
c.stroke(); // 绘制路径
}
}以下是实现即时显示圆形进度条的完整HTML、CSS和JavaScript代码。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Canvas 即时圆形进度条</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="canvas-wrap">
<canvas id="canvas" width="300" height="300"></canvas>
<span id="procent"></span>
</div>
<script src="script.js"></script>
</body>
</html>:root {
background: #fff;
}
body {
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
margin: 0;
font-family: sans-serif;
}
span#procent {
display: block;
position: absolute;
left: 50%;
top: 50%;
font-size: 50px;
transform: translate(-50%, -50%);
color: #3949AB;
}
span#procent::after {
content: '%';
}
.canvas-wrap {
position: relative;
width: 300px;
height: 300px;
/* 居中 Canvas 容器 */
display: flex;
justify-content: center;
align-items: center;
}window.onload = function() {
var can = document.getElementById('canvas'),
spanProcent = document.getElementById('procent'),
c = can.getContext('2d');
// Canvas 中心点坐标
var posX = can.width / 2,
posY = can.height / 2,
oneProcent = 360 / 100, // 1%对应的角度
targetPercentage = 64, // 目标百分比,可以根据实际需求修改
targetDegrees = oneProcent * targetPercentage; // 目标百分比对应的总角度
c.lineCap = 'round'; // 设置线条端点样式为圆形
// 页面加载后立即绘制进度条到目标状态
drawProgressBar(targetDegrees, targetPercentage);
/**
* 绘制圆形进度条和百分比文本的函数
* @param {number} degrees - 进度条应达到的角度(0-360)
* @param {number} percentage - 进度条应显示的百分比(0-100)
*/
function drawProgressBar(degrees, percentage){
// 每次绘制前清除整个画布,确保内容刷新
c.clearRect( 0, 0, can.width, can.height );
// 更新中间的百分比文本
spanProcent.innerHTML = percentage.toFixed();
// 绘制背景圆环 (灰色)
c.beginPath(); // 开始绘制一条新路径
// arc(x, y, radius, startAngle, endAngle, anticlockwise)
// 270度(-90度)作为起始点,绘制一整圈 (360度)
c.arc( posX, posY, 70, (Math.PI/180) * 270, (Math.PI/180) * (270 + 360) );
c.strokeStyle = '#b1b1b1'; // 设置描边颜色
c.lineWidth = '10'; // 设置线宽
c.stroke(); // 描边路径
// 绘制进度圆弧 (蓝色)
c.beginPath(); // 开始绘制一条新路径
c.strokeStyle = '#3949AB'; // 设置描边颜色
c.lineWidth = '10'; // 设置线宽
// 从270度开始,绘制到目标角度
c.arc( posX, posY, 70, (Math.PI/180) * 270, (Math.PI/180) * (270 + degrees) );
c.stroke(); // 描边路径
}
}通过本教程,我们学习了如何将一个基于JavaScript Canvas的动画圆形进度条改造为即时显示模式。核心在于移除 setInterval 这样的动画定时器,并直接计算并绘制进度条的最终状态。这种方法简化了代码逻辑,减少了不必要的计算开销,并能够根据实际需求快速响应,立即向用户展示最终的进度结果。
以上就是JavaScript Canvas:实现即时显示而非动画的圆形进度条的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号