JavaScript完成物体的匀速和变速运动。用JavaScript代码表达
基于new bing的编写参考:
// 获取元素节点
var obj = document.getElementById("obj");
// 匀速运动
function uniformMove(targetPos, speed) {
var startPos = parseInt(obj.style.left) || 0; // 初始位置
var distance = targetPos - startPos; // 移动距离
var duration = distance / speed; // 移动时间
var start = null;
function step(timestamp) {
if (!start) start = timestamp; // 记录起始时间
var progress = timestamp - start; // 计算已经经过的时间
obj.style.left = startPos + (progress / duration) * distance + "px"; // 计算当前位置
if (progress < duration) { // 如果未到达终点,则继续移动
window.requestAnimationFrame(step); // 递归调用
}
}
window.requestAnimationFrame(step);
}
// 变速运动
function variableMove(targetPos, duration, easing) {
var startPos = parseInt(obj.style.left) || 0;
var distance = targetPos - startPos;
var start = null;
function step(timestamp) {
if (!start) start = timestamp; // 记录起始时间
var progress = timestamp - start; // 计算已经经过的时间
var percent = Math.min(progress / duration, 1.0); // 计算百分比(进度)
// 根据缓动函数计算当前位置
var pos = easing(percent) * distance + startPos;
obj.style.left = pos + "px";
if (progress < duration) { // 如果未到达终点,则继续移动
window.requestAnimationFrame(step); // 递归调用
}
}
window.requestAnimationFrame(step);
}
// 缓动函数,这里使用了简单的线性函数
function linear(t) {
return t;
}
// 示例:匀速运动
uniformMove(200, 50); // 目标位置为200,速度为50px/s
// 示例:变速运动
variableMove(400, 1000, linear); // 目标位置为400,时间为1000ms,缓动函数为线性函数
比如通过的DOM方法removeChild()或replaceChild()删除节点。最常见的还是使用innerHTML整体替换页面的某一部分。这时候,被innerHTML删除的元素上如果有事件处理程序,也不会被垃圾收集程序正常清理。
所以,如果在得知某个元素会被删除之前,应手动删除它的事件处理程序,比如btn.onclick = null;//删除事件处理程序
,事件委托也有助于解决这个问题,如果得知某个元素要被innerHTML替代的时候,就不要给该元素添加事件处理程序了,将其添加到更高层级的节点上即可。
实现匀速运动:
let obj = document.getElementById('obj'); // 获取要运动的物体
let speed = 50; // 设置运动速度,单位px/s
let distance = 500; // 设置运动距离,单位px
let time = distance / speed * 1000; // 计算运动时间,单位ms
let startX = obj.offsetLeft; // 获取起始位置
let endX = startX + distance; // 计算终止位置
let startTime = new Date().getTime(); // 获取开始时间
let timer = setInterval(function() {
let t = new Date().getTime() - startTime; // 计算已经运动的时间
if (t >= time) { // 到达终点停止运动
clearInterval(timer);
obj.style.left = endX + 'px';
return;
}
let x = startX + t / time * distance; // 计算当前位置
obj.style.left = x + 'px'; // 移动物体
}, 10);
实现变速运动:
let obj = document.getElementById('obj'); // 获取要运动的物体
let speed = 50, acceleration = 2; // 设置初始速度和加速度,单位px/s 和 px/s²
let distance = 500; // 设置运动距离,单位px
let time = Math.sqrt(distance / acceleration * 2) + speed / acceleration; // 计算运动时间,单位ms
let startX = obj.offsetLeft; // 获取起始位置
let endX = startX + distance; // 计算终止位置
let startTime = new Date().getTime(); // 获取开始时间
let timer = setInterval(function() {
let t = new Date().getTime() - startTime; // 计算已经运动的时间
if (t >= time) { // 到达终点停止运动
clearInterval(timer);
obj.style.left = endX + 'px';
return;
}
let x = startX + acceleration * Math.pow(t / 1000, 2) / 2; // 计算当前位置
if (x > endX) { // 到达终点停止加速
x = endX;
acceleration = 0;
}
obj.style.left = x + 'px'; // 移动物体
}, 10);