10 行代码!Vue 实现炫酷的 TodoList 动画效果

Vue
313
0
0
2023-01-08

1. 前言

今天的分享是基于 TodoList 已有功能,在添加 todo 和删除 todo 时的样式上增加动画效果的优化。

2. 动态效果图

先来看下优化后的动态效果图,优化代码中选择的是上下模式的匀速淡入淡出,当然你也可以选择左右模式或其他炫酷的动画效果模式。http://mpvideo.qpic.cn/0bc3seabkaaaa4aelaudczrvbeodcwiqafia.f10002.mp4?

3. 动画核心代码

(1). MyList.vue组件

<template> 
    <ul class="todo-main"> 
        <transition-group name="todo" appear> 
            <MyItem 
                v-for="todoObj in todos" 
                :key="todoObj.id" 
                :todo="todoObj"
            /> 
        </transition-group> 
    </ul>
</template>

<script> 
    import MyItem from "./MyItem" 
    export default {
        name:'MyList',
        components:{MyItem},
        //声明接收App传递过来的数据 
        props:['todos']
    }
</script>

<style scoped>
    .todo-main {
        margin-left: 0px;
        border: 1px solid #dddddd;
        border-radius: 2px;
        padding: 0px;
    }

    .todo-empty {
        height: 40px;
        line-height: 40px;
        border: 1px solid #dddddd;
        border-radius: 2px;
        padding-left: 5px;
        margin-top: 10px;
    }

    .todo-enter-active{
        animation: todo 0.5s linear;
    }

    .todo-leave-active{
        animation: todo 0.5s linear;
    }

    @keyframes todo {
        from{
            transform: translateY(-100%);
        }
        to{
            transform: translateY(0px);
        }
    }
</style>

(2). 动画核心代码

<template> 
  <transition-group name="todo" appear> 
      <MyItem 
          v-for="todoObj in todos" 
          :key="todoObj.id" 
          :todo="todoObj"
      /> 
  </transition-group>
</template>

<style>
  .todo-enter-active{
        animation: todo 0.5s linear;
    }

  .todo-leave-active{
        animation: todo 0.5s linear;
    }

  @keyframes todo {
      from{
          transform: translateY(-100%);
      }
      to{
          transform: translateY(0px);
      }
    }
</style>

PS:

这里用到的标签是transition-group而不是transition,是因为 MyList 组件需要循环遍历 MyItem 组件中的每一条 item 进行渲染,最终是一个组而不是单条 item 数据。

4. 动画属性说明

(1).transition-group标签属性name="todo"是和Scope样式相对应的

如果在transition-group标签里没有添加name属性,则Scope中默认样式名称为v-enter-activev-leave-active

img

img

(2).Scope中样式里动画名称需与keyframes的名称保持一致

img

(3).transition-group标签里的属性appear其实是:appear="true"的简写形式,作用是当页面一加载时就有动画效果。

5. 小结

不论静态或是动态的样式,很多时候都不需要自己手动实现,不仅耗时可能还做不出满意的效果。

建议参考第三方集成好的样式库,下载引入就能用,这里分享一个好用的样式库:animate.css (https://animate.style/)

简单介绍下用法,感兴趣的小伙伴可以自行探索更多样式!

<template> 
  <div> 
      <transition-group 
          name="animate_animated animate_bounce" 
          enter-active-class="animate_swing" 
          leave-active-class="animate_backOutUp" 
          appear> 
        <h1>Hello World!</h1> 
      </transition-group> 
  </div>
</template>

<script> 
    import 'animate.css' 
    export default {
        name:'Style',
        data(){
          return {
            a:0
        }
      }
    }
</script>

Step1. 下载

使用命令npm install animate.css下载

Step2. 引入

Script标签中使用命令import 'animate.css'引入

Step3. 使用

参见上述代码块中transition-group标签属性name,enter-active-class,leave-active-class