作者:情人有意_119 | 来源:互联网 | 2022-12-28 13:01
回忆匀速运动:ykx+b;这里的各参数表示的含义:k:其实是速度,总路程总时间x:表示经过的时间b:表示一开始所在的位置y:表示当经过的时间是x的时候,走过的路程用函数表示
回忆匀速运动:
y = kx + b;
这里的各参数表示的含义:
k:其实是速度,总路程/总时间
x:表示经过的时间
b:表示一开始所在的位置
y:表示当经过的时间是x的时候,走过的路程
用函数表示
/**
* @param {[type]} start [开始位置]
* @param {[type]} alter [改变的距离]
* @param {[type]} curTime [已运行的时间]
* @param {[type]} dur [总时间]
* @return {[type]} [返回当前时间的所在位置]
*/
function linear(start, alter, curTime, dur) {
return start + alter / dur * curTime;
}
现在想让一个盒子用500ms从left=10匀速运动到20.
这里有一个问题,就是如果500ms的时候,对应的距离大于20,那么则调整为等于20
先把准备工作做好
var start = 10,
target = 20,
dur = 500;
var alter = target - start,
curTime = 0;
var y = 0;
// interval 影响curTime值
var interval = 11;
然后用两种定时方式实现
setInterval:
var timer = window.setInterval(animate, interval);
function animate () {
curTime += interval;
y = linear(start, alter, curTime, dur);
console.log(y);
if (y >= target) {
y = target;
box.style.left = y + "px";
window.clearInterval(timer);
timer = null;
return;
}
box.style.left = y + "px";
}
setTimeout:
var timer = window.setTimeout(animate, interval);
function animate () {
window.clearTimeout(timer);
curTime += interval;
y = linear(start, alter, curTime, dur);
console.log(y);
if (y >= target) {
y = target;
box.style.left = y + "px";
timer = null;
return;
}
box.style.left = y + "px";
timer = window.setTimeout(animate, interval);
}
但是因为setInterval有累积效应,所以为了更好的效果,一般用setTimeout ,如上述代码看到的,学会将setInterval转化为setTimeout
(回调函数第一行加清除,最后一行加启动)
以下只写setTimeout
html结构 和 css样式
贴下全部代码
索性将这一套变成定义成方法,这样单方向的匀速运动基本都能用了
以上情况只是 target>start,那么包含小于和等于的情况,对于最终的animate
function animate() {
window.clearTimeout(timer);
way = way || linear;
y = way(start, alter, curTime, dur);
// 这里开始判断target和start的大小
if (target = start) {
return;
}
if (target > start) {
curTime += interval;
y >= target && afterTarget();
} else if (target > start) {
curTime -= interval;
y <= target && afterTarget();
} else {
return;
}
console.log(y);
// 超出范围之后,清除定时器,重置属性
function afterTarget() {
y = target;
// 加单位,这里默认加px,如果是别的,加第二个参数即可
ele.style[attr] = addPx(y);
timer = null;
return;
}
ele.style[attr] = addPx(y);
timer = window.setTimeout(animate, interval);
}