JavaScript 实现简单运动:匀速运动、变速运动与多物体运动

JavaScript 实现简单运动:匀速运动、变速运动与多物体运动

运动基础

在JavaScript中,GS运动的核心机制是通过不断改变元素的CSS样式来实现运动效果。这种运动的关键在于两个方面:样式和不断改变。例如,通过改变元素的left属性,可以让元素不断向右移动。这种不断改变是通过定时器(setInterval)来实现的。

// 定时器示例

setInterval(() => {

console.log("定时器执行中...");

}, 30); // 每30毫秒执行一次

获取样式

在实现运动时,获取元素的样式是一个重要步骤。由于不同浏览器获取样式的方式不同,我们需要编写一个兼容的函数来获取元素的样式。

// 获取样式兼容函数

function getCSSStyle(obj, name) {

if (obj.currentStyle) { // IE浏览器

return obj.currentStyle[name];

} else { // 非IE浏览器

return window.getComputedStyle(obj, null)[name];

}

}

通过这个函数,我们可以获取到元素的非行间样式,例如left属性的值。

匀速运动

匀速运动的核心是速度恒定不变。通过定时器不断改变元素的left属性值,可以让元素以固定的速度移动。

代码实现

let timer = null; // 定时器变量

function startMove(obj, target) {

clearInterval(timer); // 清除定时器,避免重复点击

timer = setInterval(() => {

let current = parseInt(getCSSStyle(obj, "left")); // 获取当前left值

let speed = (target > current) ? 10 : -10; // 计算速度

if (Math.abs(target - current) <= Math.abs(speed)) {

obj.style.left = target + "px"; // 到达目标值,停止运动

clearInterval(timer);

} else {

obj.style.left = (current + speed) + "px"; // 更新left值

}

}, 30); // 每30毫秒执行一次

}

常见问题(FAQ)

问题 答案

为什么点击多次开始按钮会导致速度变快? 每次点击都会创建一个新的定时器,旧的定时器仍在运行,导致速度叠加。解决方法是点击前清除旧的定时器。

为什么需要清除定时器? 清除定时器可以避免重复创建定时器,确保每次点击只运行一个定时器。

为什么需要将定时器变量声明为全局变量? 如果定时器变量是局部变量,无法在其他函数中清除,导致无法停止运动。

变速运动(缓冲运动)

变速运动的核心是速度不断变化,速度与距离成正比。距离期望值越远,速度越快;距离期望值越近,速度越慢。

代码实现

function startBufferMove(obj, target) {

clearInterval(timer); // 清除旧的定时器

timer = setInterval(() => {

let current = parseInt(getCSSStyle(obj, "left")); // 获取当前left值

let speed = (target - current) / 7; // 计算速度

speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed); // 取整

if (current === target) {

clearInterval(timer); // 到达目标值,停止运动

} else {

obj.style.left = (current + speed) + "px"; // 更新left值

}

}, 30); // 每30毫秒执行一次

}

常见问题(FAQ)

问题 答案

为什么变速运动中需要取整? 像素值不能为小数,取整可以确保运动的平滑性。

为什么速度计算公式是 (target - current) / 7? 这是一个缩放系数,可以根据需要调整,系数越大,运动越慢。

为什么需要判断 current === target? 判断是否到达目标值,避免运动不停止。

多物体运动

多物体运动的核心是每个运动物体都有一个独立的定时器,定时器作为物体的属性来管理。

代码实现

function startMultiMove(obj, target) {

clearInterval(obj.timer); // 清除当前物体的定时器

obj.timer = setInterval(() => {

let current = parseInt(getCSSStyle(obj, "height")); // 获取当前高度

let speed = (target - current) / 7; // 计算速度

speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed); // 取整

if (current === target) {

clearInterval(obj.timer); // 到达目标值,停止运动

} else {

obj.style.height = (current + speed) + "px"; // 更新高度

}

}, 30); // 每30毫秒执行一次

}

常见问题(FAQ)

问题 答案

为什么多物体运动中需要为每个物体单独设置定时器? 避免多个物体共用一个定时器导致运动冲突。

为什么需要将定时器作为物体的属性? 通过将定时器绑定到物体的属性上,可以方便地管理每个物体的定时器。

为什么需要在鼠标移入和移出时分别调用函数? 确保物体在鼠标移入时开始运动,在鼠标移出时恢复原样。

相似概念对比

概念 匀速运动 变速运动 多物体运动

核心 速度恒定 速度变化 每个物体独立定时器

实现 固定速度 根据距离计算速度 定时器作为物体属性

适用场景 简单运动 平滑运动 多个物体同时运动

通过本文的讲解,您可以掌握JavaScript中GS运动的核心机制,包括匀速运动、变速运动和多物体运动的实现方式。

🎀 相关推荐

青岛籍电影人黄晓明:欢迎大家来华表奖
🎯 棋牌365大厅

青岛籍电影人黄晓明:欢迎大家来华表奖

📅 07-09 👀 3752
比特现金怎么样?比特币现金是世界上最好货币?
🎯 beat365娱乐网址

比特现金怎么样?比特币现金是世界上最好货币?

📅 07-12 👀 3879
昵图作品自审规则及处罚机制
🎯 best365体育正不正规

昵图作品自审规则及处罚机制

📅 08-27 👀 3705