动画实现不了
来源:6-2 封装形变类(2)
慕婉清6323512
2020-12-27 10:15:51
# 具体遇到的问题
老师看下 为啥动不了
# 报错信息的截图
# 相关课程内容截图
# 尝试过的解决思路和结果
# 粘贴全部相关代码,切记添加代码注释(请勿截图)
在这里输入
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>index</title>
<style type="text/css">
.ball {
background: linear-gradient(#ff9b9b 50%, #106dbb 50%);
width: 100px;
height: 100px;
border-radius: 50%;
}
</style>
</head>
<body>
<div class="ball">
</div>
<script type="text/javascript">
//形变类
class Transform {
constructor(selector) {
this.el = document.querySelector(selector);
this._quene = [];
this.el.style.transition = ` all ${ .3 }s`;
}
//位移
translate(value, time) {
return this._add('translate,value,time');
}
//缩放
scale(value, time) {
return this._add('scale,value,time');
}
//形变
rotate(value, time) {
return this._add('rotate,value,time');
}
//添加动画
_add(type, value, time) {
this._quene.push({
type,
value,
time
});
return this;
}
//添加动画完成 可以开始动了
done() {
this._start();
}
//动画开始 从 _quene中把动画一个一个拿出来
_start() {
//先进先出
setTimeout(() => {
const info = this._quene.shift();
this.el.style.transform = this._getTransform(info);
}, 0);
}
_getTransform({
type,
value,
time
}) {
switch (type) {
case 'translate':
return `translate(${ value })`;
break;
case 'scale':
return `scale(${ value })`;
break;
case 'rotate':
return `rotate(${ value })`;
break;
}
}
}
const tf = new Transform(".ball");
tf
.translate('200px,200px')
.scale(2)
.done;
console.log(tf);
</script>
</body>
</html>代码,可通过选择【代码语言】突出显示
1回答
同学你好,代码的问题与修改如下:
1、this._add调用时,传入的参数不对,导致类型里面保存的信息错误。如下:

这里不要把另外两个参数也放在引号中,否则会当成一个参数(即一个字符串)。

如下修改:

2、done方法没有加括号调用,如下调用:

3、如下代码中,因为定时器只执行一次,所以拿到第一个动画之后,不会再次执行了。

所以在本次动画执行完毕之后,需要再次调用_start方法,让它继续拿后面的动画并执行。如下:
这个后面小节就会讲解了哦

祝学习愉快~
相似问题