Chart.js 是一个简单、灵活的 JavaScript 图表库,用于在网页上创建交互式图表,本文将详细介绍如何使用 Chart.js 实现一个自定义的进度条,并允许用户通过拖动来调整进度。
引入 Chart.js

我们需要在 HTML 文件中引入 Chart.js 库,你可以通过 CDN 或者下载文件到本地来引入。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Custom Progress Bar with Chart.js</title>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
</head>
<body>
<canvas id="progressBarCanvas"></canvas>
<script src="app.js"></script>
</body>
</html>创建基本的 HTML 结构
我们在body 中添加一个canvas 元素,用于绘制进度条,我们创建一个script 标签来引用我们的 JavaScript 文件。
编写 JavaScript 代码
我们在app.js 文件中编写 JavaScript 代码来实现拖动功能。
document.addEventListener('DOMContentLoaded', function() {
const canvas = document.getElementById('progressBarCanvas');
const ctx = canvas.getContext('2d');
// 设置画布大小
canvas.width = 500;
canvas.height = 100;
// 初始化进度值
let progress = 0;
// 创建 Chart.js 实例
const progressBar = new Chart(ctx, {
type: 'bar',
data: {
labels: ['Progress'],
datasets: [{
label: '# of Votes',
data: [progress],
backgroundColor: 'rgba(75, 192, 192, 0.2)',
borderColor: 'rgba(75, 192, 192, 1)',
borderWidth: 1
}]
},
options: {
scales: {
y: {
beginAtZero: true,
ticks: {
stepSize: 1,
max: 100
}
},
x: {
display: false
}
},
plugins: {
legend: {
display: false
}
},
interaction: {
mode: 'index',
axis: 'y',
intersect: false
},
layout: {
padding: {
left: 50,
right: 50,
top: 50,
bottom: 50
}
}
}
});
// 监听鼠标事件
canvas.addEventListener('mousedown', handleMouseDown);
canvas.addEventListener('mousemove', handleMouseMove);
canvas.addEventListener('mouseup', handleMouseUp);
canvas.addEventListener('mouseleave', handleMouseUp);
let isDragging = false;
let startX = 0;
let startY = 0;
function handleMouseDown(event) {
isDragging = true;
startX = event.offsetX;
startY = event.offsetY;
}
function handleMouseMove(event) {
if (!isDragging) return;
const deltaX = event.offsetX startX;
const newProgress = Math.min(Math.max(progress + deltaX / 5, 0), 100); // 确保进度值在0到100之间
progressBar.data.datasets[0].data[0] = newProgress;
progressBar.update();
}
function handleMouseUp() {
isDragging = false;
}
});样式调整(可选)
为了使进度条看起来更美观,我们可以添加一些 CSS 样式。
/* app.css */
canvas {
border: 1px solid #ccc;
}在HTML 文件中链接 CSS 文件:
<link rel="stylesheet" href="app.css">
完整代码示例
以下是完整的 HTML、CSS 和 JavaScript 代码示例。
HTML (index.html)

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Custom Progress Bar with Chart.js</title>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<link rel="stylesheet" href="app.css">
</head>
<body>
<canvas id="progressBarCanvas"></canvas>
<script src="app.js"></script>
</body>
</html>CSS (app.css)
canvas {
border: 1px solid #ccc;
}JavaScript (app.js)
document.addEventListener('DOMContentLoaded', function() {
const canvas = document.getElementById('progressBarCanvas');
const ctx = canvas.getContext('2d');
// 设置画布大小
canvas.width = 500;
canvas.height = 100;
// 初始化进度值
let progress = 0;
// 创建 Chart.js 实例
const progressBar = new Chart(ctx, {
type: 'bar',
data: {
labels: ['Progress'],
datasets: [{
label: '# of Votes',
data: [progress],
backgroundColor: 'rgba(75, 192, 192, 0.2)',
borderColor: 'rgba(75, 192, 192, 1)',
borderWidth: 1
}]
},
options: {
scales: {
y: {
beginAtZero: true,
ticks: {
stepSize: 1,
max: 100
}
},
x: {
display: false
}
},
plugins: {
legend: {
display: false
}
},
interaction: {
mode: 'index',
axis: 'y',
intersect: false
},
layout: {
padding: {
left: 50,
right: 50,
top: 50,
bottom: 50
}
}
}
});
// 监听鼠标事件
canvas.addEventListener('mousedown', handleMouseDown);
canvas.addEventListener('mousemove', handleMouseMove);
canvas.addEventListener('mouseup', handleMouseUp);
canvas.addEventListener('mouseleave', handleMouseUp);
let isDragging = false;
let startX = 0;
let startY = 0;
function handleMouseDown(event) {
isDragging = true;
startX = event.offsetX;
startY = event.offsetY;
}
function handleMouseMove(event) {
if (!isDragging) return;
const deltaX = event.offsetX startX;
const newProgress = Math.min(Math.max(progress + deltaX / 5, 0), 100); // 确保进度值在0到100之间
progressBar.data.datasets[0].data[0] = newProgress;
progressBar.update();
}
function handleMouseUp() {
isDragging = false;
}
});FAQs
Q1: 如何更改进度条的颜色?
A1: 你可以通过修改backgroundColor 和borderColor 属性来更改进度条的颜色。
backgroundColor: 'rgba(255, 99, 132, 0.2)', borderColor: 'rgba(255, 99, 132, 1)',
这将把进度条的颜色改为红色,你可以使用任何有效的 CSS 颜色值。
Q2: 如何使进度条响应不同的设备尺寸?
A2: 你可以使用百分比或视口单位(如vw 和vh)来设置画布的大小,使其在不同设备上自适应。

canvas.width = window.innerWidth * 0.8; // 宽度为视口宽度的80% canvas.height = window.innerHeight * 0.2; // 高度为视口高度的20%
还可以使用媒体查询(Media Queries)来进一步优化布局。
各位小伙伴们,我刚刚为大家分享了有关“chartjs自己拖动进度条”的知识,希望对你们有所帮助。如果您还有其他相关问题需要解决,欢迎随时提出哦!