ES6封装形变类,完成连续动画

按照国际惯例,先放效果

index.html

<!DOCTYPE html>
<html lang="en"head>
    Meta charset="UTF-8"title>index</style>
        .ball{
            background:linear-gradient(pink 50%,lightblue 50%);/*css3线性渐变*/
            width150px
            height
            border-radius50%;
        }
    bodydiv class="ball"></div>

    script>
        //形变类
        class Transform{
            constructor(selector){
                this.el=document.querySelector(selector);
                .defaultTimeTransform.config.defaultTime;设置默认动画时长
                .el.style.transition`all ${ .defaultTime }s`;设置transition才会有动画效果
                ._queue[];队列,存放每一条动画
                每次动画时,保留之前的不同类型的动画结果(直到被同类型的动画覆盖)
                ._transform{
                    rotate:"",translate:
                }
            }

            位移
            translate(value,time){
                return ._add("translate缩放
            scale(value,1)">scale旋转
            rotate(value,1)">rotate添加动画
            _add(type,time.defaultTime){
                ._queue.push({type,time});
                方便链式调用
            }

            运动队列添加完成,开始正式动画
            done(){
                if(!._queue.length) return;

                把动画从队列里拿出来,先进先出
                定时器能够解决因为浏览器渲染机制造成的动画时有时无的情况
                setTimeout(()=>{
                    const info._queue.shift();弹出队列里第一个
                    `all ${ info.time/1000 }s`;
                    .el.style.transform._getTransform(info);

                    setTimeout((){
                        .done();
                    },info.time);
                },0)
            }

            获取具体的transform动画
            _getTransform({time,type}){
                const _tsf._transform;

                switch(type){
                    case :
                        _tsf.translate`translate(${ value })`;
                        break;
                    :
                        _tsf.scale`scale(${ value })`;
                        :
                        _tsf.rotate`rotate(${ value }deg)`;
                        ;
                }
                 `${ _tsf.translate } ${ _tsf.scale } ${ _tsf.rotate }`;                
            }
        }

        静态属性
        Transform.config{
            defaultTime:300默认动画时长
        }

        修改默认时长
        Transform.config.defaultTime1000;

        继承
        class MultiTransform extends Transform{
            复合动画
            multi(value,1)">multi等待
            sleep(value){
                sleep重写父类中的同名方法
:
                        value.forEach(item{
                            ._getTransform(item);
                        })
                        :
                        实例化
        const tfnew MultiTransform(.ball);
        tf
        .translate(100px,100px)
        .scale(2)
        .sleep(500)
        .rotate(180)
        .multi([
            {
                type:0,0
            },{
                type:
            }
        ])
        .done();

        console.log(tf);
    html>

 

为了演示方便,我把代码都写到一个文件里了,大家要用的话,可以把形变类分离到单独的js文件

相关文章

前言 使用vscode开发vue项目的时候,为了编码格式的统一化,使用eslint规范进行格式化。此时通过eslint...
转载这篇ES6的箭头函数方便自己查阅。 ES6可以使用“箭头”(=&gt;)定义函数,注意是函数,不要使...
ES6介绍 ES6, 全称 ECMAScript 6.0 ,2015.06 发版。 let 和 const命令 let命令 let 命令,用来声明变...
基本概念 Generator函数有多种理解角度。从语法上,首先可以把它理解成,Generator函数是一个状态机,封...
1、新的字符串特性 标签模板: String.raw(callSite, ...substitutions) : string 用于获取“原始”字符...
Set 基本用法 ES6提供了新的数据结构Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。 Set本...