在画布范围内移动的圆点

使用HTML和JavaScript创建简单的互动球体动画
本文介绍如何利用HTML和JavaScript实现一个基本的互动球体动画,包括球体绘制、键盘控制以及边界碰撞处理。通过设置球体初始位置、大小、速度等参数,用户可以通过键盘操作控制球体在预设区域内移动,实现简单的交互体验。
<!DOCTYPE html>

<html>
<head><meta charset="utf-8"/></head>
<body onkeydown="test()">
	<canvas id="can" width="400px" height="300px" style="background:black"></canvas>
</body>
<script type="text/javascript">
	var canvas=document.getElementById("can");
	var cxt=canvas.getContext("2d");

	var ballx=20;//x轴坐标
	var bally=20;//y轴坐标
	var banjing=20;//半径
	var bu_x=400;//画布的x轴长
	var bu_y=300;//画布的y轴长
	//步长,步长不能随便定义,必须根据画布的长,宽和半径这三者综合考虑,要不就出屏
	//步长x轴范围=bu_x-2*banjing的公因子  buchang_x=400-2*20=360=1*2*2*2*3*3*5
	//步长y轴范围=bu_y-2*banjing的公因子  buchang_y=300-2*20=260=1*2*5*2*13
	//然后综合这两个公有的取出作为步长,所以公有因子为1,2,5
	var buchang=5;
	drawBall();
	function drawBall(){
		cxt.beginPath();
		cxt.arc(ballx,bally,banjing,0,360,true);
		cxt.fillStyle="red";
		cxt.fill();
		cxt.closePath();
	} 
	//a,s,d,w分别控制左,下,右,上,当触发onkeydown()事件时,
	function test(){
		var code=event.keyCode;//通过事件获取键盘ASC码的值
		switch(code){
			case 87:
				if(bally>banjing){
					bally-=buchang;break;
				}else{
					break;
				}//w,上,上边界封住
			case 68:
				if(ballx+banjing<bu_x){
					ballx+=buchang;break;
				}else{
					break;
				}//d,右,右边界封住
			case 83:
				if(bally+banjing<bu_y){
					bally+=buchang;break;
				}else{
					break;
				}//s,下
			case 65:
				if(ballx>banjing){
					ballx-=buchang;break;
				}else{
					break;
				}//a,左,左边界封住
			default:break;
		}
		cxt.clearRect(0,0,bu_x,bu_y);//清除画布,不加这句话,是另一个效果,哈哈
		drawBall();
	}

</script>
</html>


这是一个常见的需求:使用 **HTML5 Canvas** 绘制一个**半圆弧进度条**,并在进度条末端添加一个**白色圆点跟随进度变化移动**,同时在圆弧内部绘制**刻度线**。 --- ## ✅ 实现目标: 1. 画一个 **半圆弧进度条** 2. 进度条的末端有一个 **白色小圆点(indicator)** 3. 在圆弧内侧绘制 **刻度线(ticks)** 4. 支持动态更新进度值 --- ## ✅ 示例代码(使用原生 HTML5 Canvas) ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>半圆弧进度条</title> <style> canvas { background: #222; } </style> </head> <body> <canvas id="gauge" width="400" height="300"></canvas> <script> const canvas = document.getElementById('gauge'); const ctx = canvas.getContext('2d'); const centerX = canvas.width / 2; const centerY = canvas.height; // 半圆底部为圆心 const radius = 100; const startAngle = Math.PI; // -180° const endAngle = 0; // 0° const maxPercent = 100; let currentPercent = 0; function drawGauge(percent) { ctx.clearRect(0, 0, canvas.width, canvas.height); // === 1. 绘制背景圆弧(灰色) ctx.beginPath(); ctx.arc(centerX, centerY, radius, startAngle, endAngle); ctx.lineWidth = 10; ctx.strokeStyle = '#444'; ctx.stroke(); // === 2. 绘制进度圆弧(蓝色) const progressAngle = startAngle + (endAngle - startAngle) * (percent / maxPercent); ctx.beginPath(); ctx.arc(centerX, centerY, radius, startAngle, progressAngle); ctx.lineWidth = 10; ctx.strokeStyle = '#007BFF'; ctx.stroke(); // === 3. 绘制刻度线(每10%一个) for (let i = 0; i <= 100; i += 10) { const angle = startAngle + (endAngle - startAngle) * (i / 100); const innerRadius = radius - 10; const outerRadius = radius + 10; const x1 = centerX + Math.cos(angle) * innerRadius; const y1 = centerY + Math.sin(angle) * innerRadius; const x2 = centerX + Math.cos(angle) * outerRadius; const y2 = centerY + Math.sin(angle) * outerRadius; ctx.beginPath(); ctx.moveTo(x1, y1); ctx.lineTo(x2, y2); ctx.strokeStyle = '#fff'; ctx.lineWidth = 2; ctx.stroke(); } // === 4. 绘制进度指示圆点(白色圆点) const indicatorAngle = startAngle + (endAngle - startAngle) * (percent / 100); const dotRadius = 6; const dotX = centerX + Math.cos(indicatorAngle) * radius; const dotY = centerY + Math.sin(indicatorAngle) * radius; ctx.beginPath(); ctx.arc(dotX, dotY, dotRadius, 0, Math.PI * 2); ctx.fillStyle = '#fff'; ctx.fill(); } // === 动态演示:每隔一段时间更新一次进度 function animate() { if (currentPercent <= 100) { drawGauge(currentPercent); currentPercent += 1; requestAnimationFrame(animate); } } animate(); // 启动动画 </script> </body> </html> ``` --- ## 🔍 逐段解释: ### 1. 基础设置: - `centerX` 和 `centerY` 设置为画布中心偏下,构成半圆。 - `radius` 是圆弧半径。 - `startAngle` 和 `endAngle` 定义了从左到右的半圆范围(π 到 0)。 ### 2. 背景圆弧: - 使用 `ctx.arc()` 绘制灰色背景圆弧,表示整个进度条轨道。 ### 3. 进度圆弧: - 根据当前百分比计算出角度,只绘制部分圆弧。 ### 4. 刻度线: - 每隔 10% 添加一个刻度线,使用 `cos/sin` 计算坐标,从内向外画短线。 ### 5. 白色圆点: - 使用 `ctx.arc()` 绘制一个小圆点,位置由当前角度决定。 ### 6. 动画演示: - 使用 `requestAnimationFrame` 实现简单的动画效果,逐步增加进度。 --- ## ✅ 效果预览说明: | 部分 | 描述 | |------|------| | 灰色圆弧 | 固定的背景轨道 | | 蓝色圆弧 | 当前进度 | | 白色短线 | 每10%一个刻度线 | | 白色圆点 | 表示当前进度位置 | --- ## 🚀 可扩展功能建议: - 将其封装成一个组件(Vue/React) - 添加文本显示当前百分比 - 支持击或拖拽改变进度值 - 使用 SVG 替代 Canvas(更易交互和响应式) --- ##
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

King·Forward

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值