用Vue实现多组件动画效果

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <script src="./vue.js"></script>
    <style>
      * {
        margin: 0;
        padding: 0;
      }
      ul {
        list-style: none;
      }
      li {
        border: 1px solid red;
        width: 300px;
        height: 40px;
        display: flex;
        justify-content: space-between;
        align-items: center;
      }
      .opacity-enter,
      .opacity-leave-to {
        opacity: 0;
        transform: translateY(50px);
      }
      .opacity-enter-to,
      .opacity-leave {
        opacity: 1;
      }
      .opacity-enter-active,
      .opacity-leave-active {
        transition: all 0.5s linear;
      }
      /* v-move 和  .opacity-leave-active 搭配使用,可以实现离场标签悬浮,入场动画有过渡效果的功能*/
      .opacity-move {
        transition: all 0.5s linear;
      }
      .opacity-leave-active {
        /* 那个标签被删除,离开,就把它设置为绝对定位 */
        position: absolute;
      }
    </style>
  </head>
  <body>
    <div id="app">
      <!-- 
            1. transition-group 实现多个元素/组件的过渡效果,默认这个组件会被渲染成span表,通过tap 指定需要渲染的标签
            2. 每个 transition-group 的字节点必须有独立的key 动画才能正常工作
            3. 至少 动画/过渡的用法 和之前的transition 组件是一样的
      -->
      <!-- 
          appear: 初始渲染过渡,当页面刷新时,就需要多个标签/组件做动画,必须使用 appear 这个属性,否则动画不生效
      -->
      <h1>点击组件删除</h1>
      <transition-group tag="ul" name="opacity" appear>
        <li v-for="item ,i in items" :key="item.id" @click="deleteItem(i)">
          <span>姓名:{{ item.name }}</span>
          <span>年龄:{{ item.age }}</span>
        </li>
      </transition-group>
    </div>

    <script>
      let vm = new Vue({
        el: "#app",
        data: {
          items: [
            { id: 1, name: "张三", age: 22 },
            { id: 2, name: "张四", age: 23 },
            { id: 3, name: "张五", age: 24 },
            { id: 4, name: "张六", age: 25 },
            { id: 5, name: "张器", age: 26 },
            { id: 6, name: "张八", age: 27 },
          ],
        },
        methods: {
          deleteItem(i) {
            this.items.splice(i, 1);
          },
        },
        computed: {},
        components: {},
      });
    </script>
  </body>
</html>
 
效果如下:

 

 

posted @ 2020-12-26 10:07  阳菜  阅读(566)  评论(0)    收藏  举报