8.动画

一使用方法

1.设置一个开始动画的初始效果(因为当前的效果为结束的效果)

.v-enter,
.v-leave-to {
  opacity: 0;
  transform: translateX(80px);
}

2.设置动画的过度时间

.v-enter-active,
.v-leave-active {
  transition: all 0.5s ease;
} 

3.使用 Vue 提供的 transition 包裹要进行动画的元素

<transition>
      <h3 v-if="flag">这是一个H3!!</h3>
</transition>

4.可以通过标签属性 name 来指定不同动画

可以使用 transition 的name属性来自定义类名

    .my-enter,
    .my-leave-to {
      opacity: 0;
      transform: translateY(80px);
    }

    .my-enter-active,
    .my-leave-active {
      transition: all 0.5s ease;
    }

    <transition name="my">
      <h3 v-if="flag2">这是一个H3!!</h3>
    </transition>

5.使用第三方类库实现动画

引入animate库(动画库)https://daneden.github.io/animate.css/?

<link rel="stylesheet" href="./lib/animate.css">

使用 transition 的 enter-active-class 和 leave-active-class 来指定 animate 对应的动画类,类名前面需要加 animated

<transition enter-active-class="animated bounceInLeft" leave-active-class="animated bounceOutRight">
    <h3 v-if="flag">这是一个H3!!</h3>
  </transition>

也可以将 animated 抽取到做动画的子标签内。transition 内用 :duration 来设置动画时长。或者用

duration ="{enter:500,leave:300}" 

分别设置入场和出场动画时长

<>
<transition enter-active-class="bounceInLeft" leave-active-class="bounceOutRight" :duration="400">
  <h3 v-if="flag" class="animated">这是一个H3!!</h3>
</transition>

6.半场动画的实现

使用3个钩子函数来控制动画
在 transition 标签内 利用 @before-enter @enter @after-enter 来绑定钩子函数

@before-enter 动画入场之前执行,配置起始的效果
@enter 动画入场之后执行,配置借宿的效果,以及过程(和动画时间)
@after-enter 动画播放完毕之后,重置动画参数,隐藏元素等操作

<transition @before-enter="beforeEnter" @enter="enter" @after-enter="afterEnter">
      <div class="ball" v-show="flag"></div>
</transition>

<script>
 vm = new Vue({
            el: '#app',
            data: { },
            methods: {
              //钩子函数的第一个参数el 表示 要执行动画的DOM原生的 js 对象
              beforeEnter(el) {
              //beforeEnter 动画入场之前执行,此时动画尚未开始
              //设置动画起始位置
                el.style.transform = "translate(0px,0px)";
              },
              enter(el, done) {
                //beforeEnter 动画开始之后执行,这里可以设置小球完成动画之后结束状态
                //设置动画起始位置
                //可以认为el.offsetWidth会强制刷新动画
                el.offsetWidth
                el.style.transform = "translate(150px,450px)";
                el.style.transition = "all 1s ease";
                //这里的done其实就是afterEnter函数,也就是说done是 afterEnter 函数的引用
                //如果不掉用会出现延时
                //意思就是直接执行结束的函数
                done();
              },
              afterEnter(el) {
                //beforeEnter 动画入场之前执行,此时动画尚未开始
                console.log('OK');
                this.flag = false;
              }
  }
});
</script>

这里如果重复将flage设为ture会出现一个bug,就是动画会出现卡顿。

//这里新增一个钩子 before-leave
<transition @before-enter="beforeEnter" @enter="enter" @after-enter="afterEnter" @before-leave="leave">
      <div class="ball" v-show="flag"></div>
</transition>

<script>
    var vm = new Vue({
      el: "#app",
      data: {
        flag: false,
        click: true,
      },
      methods: {
        playAnimation() {
          if (this.click === true) {
            this.flag = true;
            this.click = false;
          }
        },
        //钩子函数的第一个参数el 表示 要执行动画的DOM原生的 js 对象
        beforeEnter(el) {
          //beforeEnter 动画入场之前执行,此时动画尚未开始

          //设置动画起始位置
          el.style.transform = "translate(0px,0px)";
        },
        enter(el, done) {
          //beforeEnter 动画开始之后执行,这里可以设置小球完成动画之后结束状态

          //设置动画起始位置

          //可以认为el.offsetWidth会强制刷新动画
          el.offsetWidth
          el.style.transform = "translate(150px,450px)";
          el.style.transition = "all 1s ease";
          //这里的done其实就是afterEnter函数,也就是说done是 afterEnter 函数的引用
          //如果不掉用回出现延时
          done();
        },
        afterEnter(el) {
          //beforeEnter 动画入场之前执行,此时动画尚未开始
          this.flag = false;
        },
        //利用新增的钩子函数控制是否可以再次播放
        leave() {
          console.log('OK');
          this.click = true;
        }
      }
    });
  </script>

列表动画

利用 <transition-group appear tag="ul"> 来替换原来的ul标签

1.css配置方式和之前一致:

.v-enter,
.v-leave-to {
    opacity: 0;
    transform: translateX(80px);
}
    
.v-enter-active,
.v-leave-active {
    transition: all 0.5s ease;
}

在实现列表过度动画时,需要过度的元素是通过v-for循环渲染出来 不能使用transiton 包裹,需要使用 transitonGroup
给transition-group 添加 appear 熟悉实现入场效果
可以通过 tag 熟悉来制定 transition-group 渲染成什么标签

<transition-group appear tag="ul">
    <li v-for="(item,i) in list" :key="item.id" @click='del(i)'>
        ID: {{item.id}} , 名字: {{item.name}}
    </li>
</transition-group> -->
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 本文章是一个系列,如果有兴趣可以看看以下文章:AppleWatch开发入门(1)——界面布局AppleWatch开...
    小道萧兮阅读 7,959评论 0 5
  • 卡耐基-《人性的弱点》1 人性的弱点首先讲的是待人处事的一个基本的技巧。其实也就是不要批评,要多赞美,然后就是还要...
    西米ximena阅读 1,864评论 0 1
  • 从做兼职到现在也快一个月了,有刚来时候的不舍。有离别时候的痛心,但无论是什么样的。 距我离开还有十几天...
    不焦不燥阅读 1,207评论 0 1
  • 寒雪洒落人间 冷非凡, 白梅行中望仓天。 不理飘雪,不耐凡尘, 走至桥头边, 起手接花走。 人影渐渐来, 蓦是说书人。
    邂逅君阅读 3,641评论 0 1
  • 我喜欢摄影 喜欢拍风和日丽 喜欢镜头里每一个光影的交错; 我也喜欢写文字 写欢喜雀跃时的澎湃激昂 写情感失意时的内...
    風一庚阅读 3,770评论 2 9

友情链接更多精彩内容