- VueJS 教程
- VueJS - 首页
- VueJS - 概览
- VueJS - 环境设置
- VueJS - 简介
- VueJS - 实例
- VueJS - 模板
- VueJS - 组件
- VueJS - 计算属性
- VueJS - 侦听器
- VueJS - 绑定
- VueJS - 事件
- VueJS - 渲染
- VueJS - 过渡与动画
- VueJS - 指令
- VueJS - 路由
- VueJS - Mixins
- VueJS - 渲染函数
- VueJS - 响应式界面
- VueJS - 例子
- VueJS 有用资源
- VueJS - 快速指南
- VueJS - 有用资源
- VueJS - 讨论
VueJS - 过渡和动画
在本章中,我们将讨论 VueJS 中提供的过渡和动画功能。
过渡
VueJS 提供了多种方法将过渡应用于 HTML 元素,当它们在 DOM 中添加/更新时。VueJS 有一个内置的过渡组件,需要将其包裹在需要过渡的元素周围。
语法
<transition name = "nameoftransition"> <div></div> </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 时才显示文本元素。我们已将 p 标签用过渡元素包裹,如下面的代码片段所示。
<transition name = "fade"> <p v-show = "show" v-bind:style = "styleobj">Animation Example</p> </transition>
过渡的名称为 fade。VueJS 为过渡提供了一些标准类,这些类的名称以过渡的名称为前缀。
以下是过渡的一些标准类:
v-enter - 此类最初在元素更新/添加之前调用。这是初始状态。
v-enter-active - 此类用于定义进入过渡阶段的延迟、持续时间和缓动曲线。这是整个进入阶段的活动状态,并且在整个进入阶段都可用。
v-leave - 触发离开过渡时添加,移除。
v-leave-active - 在离开阶段应用。过渡完成后将其移除。此类用于在离开阶段应用延迟、持续时间和缓动曲线。
每个类都将以过渡的名称为前缀。我们已将过渡的名称指定为 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 是一起定义的,它在开始和离开阶段应用过渡。不透明度属性在 2 秒内更改为 0。
持续时间在 .fade_enter_active 和 .fade_leave_active 中定义。最终阶段在 .fade_enter、.fade_leave_to 中定义。
浏览器中的显示如下。
单击按钮后,文本将在两秒内淡出。
两秒后,文本将完全消失。
让我们考虑另一个示例,其中有一个图像,当单击按钮时它会在 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>
过渡的名称为 shiftx。使用以下代码片段,transform 属性用于使用 100px 将图像沿 x 轴移动。
<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>
以下是输出。
单击按钮后,图像将向右移动 100px,如下面的屏幕截图所示。
动画
动画的应用方式与过渡相同。动画也有一些类需要声明才能生效。
让我们考虑一个例子来了解动画是如何工作的。
示例
<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>
要应用动画,有一些与过渡相同的类。在上面的代码中,我们有一个用 p 标签包含的图像,如下面的代码片段所示。
<transition name = "shiftx"> <p v-show = "show"><img src = "images/img.jpg" style = "width:100px;height:100px;" /></p> </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>
该类以过渡名称为前缀,即 shiftx-enter-active 和 .shiftx-leave-active。动画使用从 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);} }
以下是输出。
单击按钮后,它会从 0 旋转到 360 度并消失。
自定义过渡类
VueJS 提供了一个自定义类的列表,可以将其作为属性添加到过渡元素。
- enter-class
- enter-active-class
- leave-class
- leave-active-class
当我们想要使用外部 CSS 库(如 animate.css)时,自定义类基本上就会发挥作用。
示例
<html> <head> <link href = "https://cdn.jsdelivr.net.cn/npm/[email protected]" 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;">Example</span></p> </transition> </div> <script type = "text/javascript"> var vm = new Vue({ el: '#animate', data: { show: true } }); </script> </body> </html>
输出
输出
输出
上面的代码中应用了两个动画。一个 enter-active-class = “animated swing”,另一个 leave-active-class = ”animated bounceIn”。我们正在使用自定义动画类来应用来自第三方库的动画。
显式过渡持续时间
我们可以使用 VueJS 在元素上应用过渡和动画。Vue 等待 transionend 和 animationend 事件来检测动画或过渡是否完成。
有时过渡会导致延迟。在这种情况下,我们可以显式应用持续时间,如下所示。
<transition :duration = "1000"></transition> <transition :duration = "{ enter: 500, leave: 800 }">...</transition>
我们可以像上面那样在过渡元素上使用带 : 的 duration 属性。如果需要分别为进入和离开指定持续时间,可以像上面代码片段中那样进行操作。
JavaScript 钩子
可以使用 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>
输出
在上面的示例中,我们正在使用过渡元素上的 js 方法执行动画。
过渡上的方法应用如下:
<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 }) } }
在每个方法中应用所需的过渡。在单击按钮时以及动画完成后,都会应用一个不透明度动画。第三方库用于动画。
在过渡上添加了一个属性 v-bind:css = "false",这样做是为了让 Vue 理解这是一个 JavaScript 过渡。
初始渲染时的过渡
为了在开始时添加动画,我们需要将“appear”属性添加到过渡元素。
让我们看一个例子来更好地理解它。
示例
<html> <head> <link href = "https://cdn.jsdelivr.net.cn/npm/[email protected]" 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 Example</h1> </transition> <transition appear appear-class = "custom-appear-class" appear-active-class = "animated swing"> <h1>Swing - Animation Example</h1> </transition> <transition appear appear-class = "custom-appear-class" appear-active-class = "animated rubberBand"> <h1>RubberBand - Animation Example</h1> </transition> </div> <script type = "text/javascript"> var vm = new Vue({ el: '#animate', data: { show: true } }); </script> </body> </html>
在上面的示例中,我们使用了来自 animate.css 库的三个不同的动画。我们已将 appear 添加到过渡元素。
执行上述代码后,浏览器中的输出如下。
组件上的动画
我们可以使用以下代码包装组件的过渡。我们在这里使用了动态组件。
示例
<html> <head> <title>VueJs Instance</title> <script type = "text/javascript" src = "js/vue.js"></script> <link href = "https://cdn.jsdelivr.net.cn/npm/[email protected]" 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>