VueJS 过渡&动画

在本章中,我们将讨论VueJS中可用的Transition和Animation功能。

Transition过渡

当在DOM中添加/更新HTML元素时,VueJS提供了多种方法来将Transition(过渡动画)应用于HTML元素,
VueJS具有内置的Transition组件。

<transition name="nameoftransition">
   <div></div>
</transition>

让我们考虑一个示例,以了解Transition的工作原理。

<html>
   <head>
      <title>VueJs Instance</title>
      <script type = "text/javascript" src = "js/vue.js"></script>
   </head>
   <body>
      <style>
         .fade-enter-active, .fade-leave-active {
            transition: opacity 2s
         }
         .fade-enter, .fade-leave-to /* .fade-leave-active below version 2.1.8 */ {
            opacity: 0
         }
      </style>
      <div id = "databinding">
         <button v-on:click = "show=!show">Click Me</button>
         <transition name = "fade">
            <p v-show = "show" v-bind:style = "styleobj">Animation Example</p>
         </transition>
      </div>
      <script type = "text/javascript">
         var vm = new Vue({
            el: '#databinding',
            data: {
               show:true,
               styleobj :{
                  fontSize:'30px',
                  color:'red'
               }
            },
            methods : {
            }
         });
      </script>
   </body>
</html>

创建了一个名为clickme的按钮,使用该按钮可以将show变量的值从true更改为false,反之亦然。 p标签仅在变量为true时显示文本元素。我们已经用Transition元素包装了p标签,如下面的代码所示。

 < transition name = "fade">
   <p v-show = "show" v-bind:style = "styleobj">Animation Example</p>
</transition>

Transition 的名称是 fade 。
VueJS提供了一些用于Transition的标准类,并且这些类的前缀是Transition的名称。

以 下是一些Transition的标准类-

  • v-enter - 在updated/added元素之前首先调用此类,它是起始状态。
  • v-enter-active - 此类用于delay,duration和easing curve 活动状态。
  • v-leave - 用于离开Transition时triggered,removed。
  • v-leave-active - Transition完成后将其删除,此类用于在离开阶段delay,duration和easing curve 。

以 上每个类都将以Transition名称作为前缀。我们将Transition的名称设置为fade,因此类的名称变为 .fade_enter,.fade_enter_active,.fade_leave,.fade_leave_active 。

它们在以下代码中定义。

   < style>
   .fade-enter-active, .fade-leave-active {
      transition: opacity 2s
   }
   .fade-enter, .fade-leave-to /* .fade-leave-active below version 2.1.8 */ {
      opacity: 0
   }
</style>

.fade_enter_active 和.fade_leave_active一起定义,并且在开始和离开阶段应用过度。
opacity属性在2秒内更改为0。

持续时间在.fade_enter_active和.fade_leave_active中定义。最后阶段在.fade_enter,.fade_leave_to中定义。

浏览器中的显示如下。

1604673093806

单击该按钮,文本将在两秒钟内消失。
1604673100006

两秒钟后,文本将完全消失。

让我们考虑另一个示例,其中有一个图像,当单击按钮时,它在x轴上移动。

<html>
   <head>
      <title>VueJs Instance</title>
      <script type = "text/javascript" src = "js/vue.js"></script>
   </head>
   <body>
      <style>
         .shiftx-enter-active, .shiftx-leave-active {
            transition: all 2s ease-in-out;
         }
         .shiftx-enter, .shiftx-leave-to /* .fade-leave-active below version 2.1.8 */ {
            transform :  translateX(100px);
         }
      </style>
      <div id = "databinding">
         <button v-on:click = "show=!show">Click Me</button>
         <transition name = "shiftx">
            <p v-show = "show">
               <img src = "images/img.jpg" style = "width:100px;height:100px;" />
            </p>
         </transition>
      </div>
      <script type = "text/javascript">
         var vm = new Vue({
            el: '#databinding',
            data: {
               show:true
            },
            methods : {
            }
         });
      </script>
   </body>
</html>

Transition的名称是 shiftx 。使用下面的代码,可以使用transform属性将x轴上的图像移动100px。

 < style>
   .shiftx-enter-active, .shiftx-leave-active {
      transition: all 2s ease-in-out;
   }
   .shiftx-enter, .shiftx-leave-to /* .fade-leave-active below version 2.1.8 */ {
      transform :  translateX(100px);
   }
</style>

以 下是输出。

1604673108566

单击按钮后,图像将向右移动100px,如以下屏幕截图所示。

1604673108566

Animation动画

Animation的应用与Transition相同。动画还具有需要声明的类才能产生效果。

让我们考虑一个示例,以查看动画的工作原理。

<html>
   <head>
      <title>VueJs Instance</title>
      <script type = "text/javascript" src = "js/vue.js"></script>
   </head>
   <body>
      <style>
         .shiftx-enter-active {
            animation: shift-in 2s;
         }
         .shiftx-leave-active {
            animation: shift-in 2s reverse;
         }
         @keyframes shift-in {
            0%   {transform:rotateX(0deg);}
            25%  {transform:rotateX(90deg);}
            50%  {transform:rotateX(120deg);}
            75%  {transform:rotateX(180deg);}
            100% {transform:rotateX(360deg);}
         }
      </style>
      <div id = "databinding">
         <button v-on:click = "show=!show">Click Me</button>
         <transition name = "shiftx">
            <p v-show = "show">
               <img src = "images/img.jpg" style = "width:100px;height:100px;" />
            </p>
         </transition>
      </div>
      <script type = "text/javascript">
         var vm = new Vue({
            el: '#databinding',
            data: {
               show:true
            },
            methods : {
            }
         });
      </script>
   </body>
</html>

要应用动画,有与Transition相同的类。在上面的代码中,我们将图像包含在p标签中,如以下代码所示。

<transition name = "shiftx">
   <p v-show = "show"><img src = "images/img.jpg" style = "width:100px;height:100px;" /></p>
</transition>

Transition的名称是 shiftx 。应用的类如下:

 < style>
   .shiftx-enter-active {
      animation: shift-in 2s;
   }
   .shiftx-leave-active {
      animation: shift-in 2s reverse;
   }
   @keyframes shift-in {
      0%   {transform:rotateX(0deg);}
      25%  {transform:rotateX(90deg);}
      50%  {transform:rotateX(120deg);}
      75%  {transform:rotateX(180deg);}
      100% {transform:rotateX(360deg);}
   }
</style>

该 类的前缀为Transition名称,即shiftx-enter-active和.shiftx-leave-active。Animation的关键帧定义为0%到100%。在每个关键帧处定义了一个转换,如以下代码所示。

 @keyframes shift-in {
   0%   {transform:rotateX(0deg);}
   25%  {transform:rotateX(90deg);}
   50%  {transform:rotateX(120deg);}
   75%  {transform:rotateX(180deg);}
   100% {transform:rotateX(360deg);}
}

以下是输出。

1604673149806

单击该按钮时,它会从0旋转到360度,然后消失。

1604673157125

自定义过渡类

VueJS提供了一系列自定义类,可以将它们作为属性添加到Transition元素中。

  • enter-class
  • enter-active-class
  • leave-class
  • leave-active-class

自定义类基本上在我们要使用外部CSS库(例如animate.css)时起作用。

<html>
   <head>
      <link href = "https://cdn.jsdelivr.net/npm/animate.css@3.5.1" rel = "stylesheet" type = "text/css">
      <script type = "text/javascript" src = "js/vue.js"></script>
   </head>
   <body>
      <div id = "animate" style = "text-align:center">
         <button @click = "show=!show"><span style = "font-size:25px;">Animate</span></button>
         <transition
            name = "custom-classes-transition"
            enter-active-class = "animated swing"
            leave-active-class = "animated bounceIn">
            <p v-if = "show"><span style = "font-size:25px;">例</span></p>
         </transition>
      </div>
      <script type = "text/javascript">
         var vm =  new Vue({
            el: '#animate',
            data: {
               show: true
            }
         });
      </script>
   </body>
</html>

运行上面代码输出

1604673164549
1604673168229
1604673173789

上面的代码中应用了两个动​​画。一个enter-active-class =”Animation swing”,另一个leave-active-class=”AnimationbounceIn”。

过渡持续时间

我们使用VueJS在元素上应用Transition和Animation。
Vue等待transionend和animationend事件检测Animation或Transition是否完成。

有时Transition可能会导致延迟。在这种情况下,我们可以如下明确地应用持续时间。

<transition :duration = "1000"></transition>
<transition :duration = "{ enter: 500, leave: 800 }">...</transition>

我们可以将duration属性与Transition元素上的:一起使用,如上所示。如果需要分别指定进入和离开的持续时间,可以按照上面的代码所示进行。

JavaScript钩子

可以将Transition类称为使用JavaScript事件的方法。让我们考虑一个更好理解的例子。

<html>
   <head>
      <title>VueJs Instance</title>
      <script type = "text/javascript" src = "js/vue.js"></script>
   </head>
   <body>
      <script src = "https://cdnjs.cloudflare.com/ajax/libs/velocity/1.2.3/velocity.min.js"></script>
      <div id = "example-4">
         <button @click = "show=!show">
            <span style = "font-size:25px;">Toggle</span>
         </button>
         <transition  v-on:before-enter = "beforeEnter"
            v-on:enter = "enter"
            v-on:leave = "leave"
            v-bind:css = "false">
            <p v-if = "show" style = "font-size:25px;">Animation Example with velocity</p>
         </transition>
      </div>
      <script type = "text/javascript">
         var vm = new Vue({
            el: '#example-4',
            data: {
               show: false
            },
            methods: {
               beforeEnter: function (el) {
                  el.style.opacity = 0
               },
               enter: function (el, done) {
                  Velocity(el, { opacity: 1, fontSize: '25px' }, { duration: 1000 })
                  Velocity(el, { fontSize: '10px' }, { complete: done })
               },
               leave: function (el, done) {
                  Velocity(el, { translateX: '15px', rotateZ: '50deg' }, { duration: 1500 })
                  Velocity(el, { rotateZ: '100deg' }, { loop: 2 })
                  Velocity(el, {
                     rotateZ: '45deg',
                     translateY: '30px',
                     translateX: '30px',
                     opacity: 0
                  }, { complete: done })
               }
            }
         });
      </script>
   </body>
</html>

运行上面代码输出

1604673194101

1604673198877

在上面的示例中,我们在Transition元素上使用js方法执行Animation。

Transition方法适用如下:

<transition  v-on:before-enter = "beforeEnter"
   v-on:enter = "enter"
   v-on:leave = "leave"
   v-bind:css = "false">
   <p v-if = "show" style = "font-size:25px;">Animation Example with velocity</p>
</transition>

在 v-on 上添加了前缀,以及调用该方法的事件的名称。这些方法在Vue实例中定义如下:

 methods : {
   beforeEnter: function (el) {
      el.style.opacity = 0
   },
   enter: function (el, done) {
      Velocity(el, { opacity: 1, fontSize: '25px' }, { duration: 1000 })
      Velocity(el, { fontSize: '10px' }, { complete: done })
   },
   leave: function (el, done) {
      Velocity(el, { translateX: '15px', rotateZ: '50deg' }, { duration: 1500 })
      Velocity(el, { rotateZ: '100deg' }, { loop: 2 })
      Velocity(el, {
         rotateZ: '45deg',
         translateY: '30px',
         translateX: '30px',
         opacity: 0
      }, { complete: done })
   }
}

这些方法中的每一种都将应用所需的转换。单击按钮以及完成动画后,都会应用不透明度动画 。

初 始渲染时的过渡

为了在开始时添加Animation,我们需要在Transition元素中添加” appear”属性。

让我们看一个例子,以更好地理解它。

 < html>
   <head>
      <link href = "https://cdn.jsdelivr.net/npm/animate.css@3.5.1" rel = "stylesheet" type = "text/css">
      <script type = "text/javascript" src = "js/vue.js"></script>
   </head>
   <body>
      <div id = "animate" style = "text-align:center">
         <transition
            appear
            appear-class = "custom-appear-class"
            appear-active-class = "animated bounceIn">
            <h1>BounceIn - Animation 例</h1>
         </transition>
         <transition
            appear
            appear-class = "custom-appear-class"
            appear-active-class = "animated swing">
            <h1>Swing - Animation 例</h1>
         </transition>
         <transition
            appear
            appear-class = "custom-appear-class"
            appear-active-class = "animated rubberBand">
            <h1>RubberBand - Animation 例</h1>
         </transition>
      </div>
      <script type = "text/javascript">
         var vm =  new Vue({
            el: '#animate',
            data: {
               show: true
            }
         });
      </script>
   </body>
</html>

在上面的示例中,我们使用了animate.css库中的三种不同的动画 。 我们在Transition元素中添加了外观。

执行上述代码后,浏览器将输出以下内容。

1604673207965

组件动画

我们可以使用以下代码包装组件的Transition。我们在这里使用了动态组件。

<html>
   <head>
      <title>VueJs Instance</title>
      <script type = "text/javascript" src = "js/vue.js"></script>
      <link href = "https://cdn.jsdelivr.net/npm/animate.css@3.5.1" rel = "stylesheet" type = "text/css">
   </head>
   <body>
      <div id = "databinding" style = "text-align:center;">
         <transition  appear
            appear-class = "custom-appear-class"
            appear-active-class = "animated wobble">
            <component v-bind:is = "view"></component>
         </transition>
      </div>
      <script type = "text/javascript">
         var vm = new Vue({
            el: '#databinding',
            data: {
               view: 'component1'
            },
            components: {
               'component1': {
                  template: '<div><span style = "font-
                  size:25;color:red;">Animation on Components</span></div>'
               }
            }
         });
      </script>
   </body>
</html>

运行上面代码输出
1604673215644

取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

Powered by bytekits.com,汇天下文字,成非凡梦想!!!