canvas绘制地球围绕太阳转、月球围绕地球转

本文介绍了一个使用HTML5 Canvas技术实现的太阳系动态模拟示例。通过JavaScript绘制并动态更新太阳、地球和月亮的位置,展示它们之间的相对运动。代码详细解释了如何设置画布、图像加载、旋转和绘制,以及如何利用requestAnimationFrame进行动画更新。这是一个结合了HTML、CSS和JavaScript的前端开发实践案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

素材(放到img中,与html同级):
太阳
太阳
地球
地球
月亮
月亮

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style type="text/css">
			body {
				background-color: #99CCFF;
			}

			#canvas {
				background-color: #fff;
				color: rgba(255, 0, 0, 1);
				position: absolute;
				top: 0;
				left: 0;
				right: 0;
				bottom: 0;
				margin: auto;

			}
		</style>
	</head>
	<body>
		<canvas id="canvas">
			您的浏览器不支持,canvas标签
		</canvas>
		<script type="text/javascript">
			// 获取画布
			var canvas = document.getElementById('canvas');

			// 设置画布的宽高
			canvas.width = 300;
			canvas.height = 300;
			// 获取画笔
			var ctx = canvas.getContext('2d');

			// 创建图像对象
			var sun = new Image();
			var moon = new Image();
			var earth = new Image();


			// 初始化图像对象的路径
			function init() {
				sun.src = './img/canvas_animation_sun.png'
				moon.src = './img/canvas_animation_moon.png'
				earth.src = './img/canvas_animation_earth.png';
				window.requestAnimationFrame(draw);
			}

			function draw() {
				// 清空画布,不清除会叠加绘制(会出现锯齿)
				ctx.clearRect(0, 0, canvas.width, canvas.height);
				// 绘制背景(太阳)
				// ctx.drawImage(sun,0,0,canvas.width,canvas.height);
				// 设置样式(轨道边框,阴影样式)
				ctx.fillStyle = "rgba(0,0,0,0.4)";
				ctx.strokeStyle = "rgba(0,153,255,0.4)";
				ctx.save();
				ctx.translate(150, 150);

				var time = new Date();
				// 绘制地球

				/* 
					秒
					((2*Math.PI)/60)*time.getSeconds(); 360/60=6°
					毫秒
					((2*Math.PI)/60000)*time.getMilliseconds(); 360/6000=0.06°
				 */
				ctx.rotate(((2 * Math.PI) / 60) * time.getSeconds() + ((2 * Math.PI) / 60000) * time.getMilliseconds());
				ctx.translate(105, 0);
				// 绘制阴影
				ctx.fillRect(0, -12, 50, 24);
				ctx.drawImage(earth, -12, -12);


				// 绘制月球
				ctx.save();
				/*
					秒
					((2*Math.PI)/60)*time.getSeconds(); 360/6=60°
					毫秒
					((2*Math.PI)/60000)*time.getMilliseconds(); 360/6000=0.006°
				 */
				ctx.rotate(((2 * Math.PI) / 6) * time.getSeconds() + ((2 * Math.PI) / 6000) * time.getMilliseconds());
				ctx.translate(0, 28.5);
				ctx.drawImage(moon, -3.5, -3.5);


				ctx.restore();
				ctx.restore();
				// 绘制轨道(地球围绕轨道旋转)
				ctx.beginPath();
				ctx.arc(150, 150, 105, Math.PI * 2, false);
				ctx.stroke();
				window.requestAnimationFrame(draw);

				// 设置图形混合模式
				ctx.globalCompositeOperation = 'destination-over'; //新内容在原内容的下方绘制
				// 绘制背景(太阳)
				ctx.drawImage(sun, 0, 0, canvas.width, canvas.height);
			}
			init();
		</script>
	</body>
</html>

制作整理不易,以上内容均为原创(参考了部分官方文档和老师整理的案例)。如要引用请附上本文链接,如有疑问可以在评论区畅所欲言,作者看到会第一时间回复,欢迎交流!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

么贺贵

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

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

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

打赏作者

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

抵扣说明:

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

余额充值