多动画同时执行的时候设置了不同时间,时间值该怎么传,我试了下,没成功

来源:6-4 封装形变类(4)

王文辉

2021-02-24 19:49:47

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

<title>变形类</title>

<style type="text/css">

.ball{

background: linear-gradient(#ff9b9b 50%,#106dbb 50%);

width: 150px;

height: 150px;

border-radius: 50%;

}

.ballTwo{

background: linear-gradient(#ff9b9b 50%,#106dbb 50%);

width: 150px;

height: 150px;

border-radius: 50%;

}

</style>

</head>

<body>

<!-- <div class="ball"></div> -->

<div class="ballTwo"></div>

<script type="text/javascript">

class Transform{

constructor(selector) {

    this.el=document.querySelector(selector);

this._queue=[] //存放动画素组

this.defaultTime=Transform.config.defaultTime; //用户输入默认的动画执行时间

this.el.style.transition=`all ${.3}s`; //确保元素可以执行动画

this._transform={ //用来存动画播放之后的状态,避免每次都从开始执行

translate:'',

scale:'',

rotate:''

}

}

// 位移

translate(value,time){

return this._addAnimation('translate',value,time)

}

// 旋转

scale(value,time){

return this._addAnimation('scale',value,time)

}

//形变

rotate(value,time){

return this._addAnimation('rotate',value,time)

}

//暂停

sleep(value){

return this._addAnimation('sleep','',value)

//sleep接收的参数为停止时间参数,其实对应的是时间

//sleep执行无需改变transform属性,对应的是把时间传到setTimeout去实现

}

//暂停

//添加动画

_addAnimation(type,value,time=this.defaultTime){

this._queue.push({type,value,time})

return this;

}

//添加完成,可以开始执行动画了

done(){

this._start();

}

//开始动画

_start(){

//[位置,旋转,形变]按照队列的模式先进先出开始执行

//执行动画就是添加对应的transition属性变化即可属性即可

if(!this._queue.length) return

setTimeout(()=>{

const info=this._queue.shift();

// this.el.style.transition=`all ${this.defaultTime/1000}s`;//改写

this.el.style.transition=`all ${info.time/1000}s`;

this.el.style.transform=this._getTransform(info);

setTimeout(()=>{ //递归调用

this._start()

},info.time)

},0)

}

_getTransform({time,value,type}){

var tsf=this._transform;

switch(type){

case 'translate':

tsf.translate= `translate(${value})`;

break;

case 'scale':

tsf.scale= `scale(${value})`;

break;

case 'rotate':

tsf.rotate= `rotate(${value}deg)`;

break;

case 'sleep':

tsf.sleep= `sleep(${value}deg)`;

break;

default:

break;

}

return `${tsf.translate} ${tsf.scale} ${tsf.rotate}`

}

}

// 用户自定义的属性

Transform.config={

defaultTime:300

}

/* const tf=new Transform('.ball')

tf

.translate('500px,500px')

.scale(2,3000)

.translate('100px,100px')

.sleep(1000)

.scale(0.5)

.rotate(180)

.done()

*/

//继承,实现动画的同时播放

class MultiTransform extends Transform{

multi(value,time){

return this._addAnimation('multi',value,time)

}

_getTransform({time,value,type}){

var tsf=this._transform;

switch(type){

case 'translate':

tsf.translate= `translate(${value})`;

break;

case 'scale':

tsf.scale= `scale(${value})`;

break;

case 'rotate':

tsf.rotate= `rotate(${value}deg)`;

break;

case 'multi':

value.forEach(item=>{

this._getTransform(item);

});

break;

default:

break;

}

return `${tsf.translate} ${tsf.scale} ${tsf.rotate}`

}

}

const tf2=new MultiTransform('.ballTwo')

tf2.sleep(2000)

.multi([

{

type:'translate',

value:'100px,100px',

time:5000

},{

type:'scale',

value:2,

time:1000

},

{

type:'rotate',

value:180,

time:10000

}

])

.done()

</script>

</body>

</html>

tf2的,multi中的三个动画还是同时执行的

写回答

1回答

好帮手慕久久

2021-02-25

同学你好,解答如下:

.multi这个动画的意思是让元素同时做多个动画(不是依次执行multi中的过渡):

http://img.mukewang.com/climg/6037004c090648cf06940434.jpg

所以multi中的过渡,所需的时间是一样的,应该如下这样设置时间:http://img.mukewang.com/climg/603700b809ff754606080510.jpg

之所以要这样设置时间,是原因multi方法的第二个参数对应的是multi过渡的时间:

http://img.mukewang.com/climg/6037008b096edc3106790161.jpg

http://img.mukewang.com/climg/6037011f096ce14f18020330.jpg

祝学习愉快!

0

0 学习 · 10739 问题

查看课程