课程名称: 2022持续升级 Vue3 从入门到实战 掌握完整知识体系
课程章节: Vue 中的动画
主讲老师: Dell
今天学习的内容包括:
在tarnsition type中
transition以过度为准
nimation以动画为准
duration(秒(1000))不以动画过度里时间为准。
可以输入对象
可以对Enter和Leave的时长进行控制
不用CSS动画效果
JS动画效果
before-enter动画开始之前
enter开始执行动画
after-enter当动画结束之后
el为元素
done函数,告诉系统动画已结束
clearInterval(animation)清楚动画
@keyframes 动画关键帧属性
0%, 25%… 表示动画执行的阶段百分比
动画只需要定义 v-enter-active / v-leave-active
//单元素,单组件的入场出场动画 const app = Vue.createApp({ data(){ return { show:false } }, methods:{ hanleClick() { this.show = !this.show; } }, template:` <div> <transition> <div v-if="show"> hello world </div> </transition> <button @click = "handleClick">切换</button> </div> ` }); /*固定写法,入场,执行中,结束,隐藏*/ @keyframes shake{ 0% { transform:translateX( -100px ) } 50% { transform:translateX( -50px ) } 100% { transform:translateX( 0px ) } } .v-enter-form { opacity:0; } .v-enter-active{ transition : opacity 3s ease-out } .v-enter-to { opacity:1; } /*这一步可以省略*/ .v-leave-from{ opacity:1; } .v-leave-active{ transition : opacity 3s ease-in } .v-leave-to{ opacity:1; }
自定义class名可以使用第三方的网站,例如animate.style
Vue transtion组件类名可以用animate.css里面的动画类名去做
示例代码:
template: 、 <div> <transition enter-active-class="aninate_animated animste_bounce"> leave-active-class-"aninate_aninated anjmate_bounce" > <div v-show="show">hello world</div> </transition> <button @click="handleclick">切换</button> <div> 、
template: <div> <transition enter-active-class="hello" leave-active-clasp="bye" > <div v-show="show">hello world</div> </transition> <button @click="handleClick">切换</button> </div>
JS通过钩子控制transition标签的动画
methods:{ handleClick(){ this.show=!this.show; }, handleBeforeEnter(el){ el.style.color ="red"; }, handleEnterActive(el,done){ const animation = setInterval(() => { const color=el.style.color; if(color==='red'){ el.style.color= 'green'; } else { el.style.color='red'; } }, 1000) setTimeout(() => { clearInterval(animation); done(); }, 3000)
用JS动画之前先关掉CSS动画,以及JS的入场JS动画钩子和出场动画钩子函数
<transition :css="false" @before-enter="handleBeforeEnter" @enter="handleEnterActive" @after-enter="handleEnterEnd" @before-leave= @leave= @leave-after= > <div v-show="show">hello world</div> </transition>
done回调的使用、after-enter之前先调用done()才有效果
template:、 <div> <transition :css="false" @before-enter="handleBeforeEnter" @enter="hand leEnterActvie" > <div v-show="show">hello world</div> </transition> <button @click="handleClick">切换</button> </div> 、
transiton 组件通过:css=false 关掉css控制动画的能力
课程名称: 2022持续升级 Vue3 从入门到实战 掌握完整知识体系
课程章节: Vue 中的动画
主讲老师: Dell
今天学习的内容包括:
在tarnsition type中
transition以过度为准
nimation以动画为准
duration(秒(1000))不以动画过度里时间为准。
可以输入对象
可以对Enter和Leave的时长进行控制
不用CSS动画效果
JS动画效果
before-enter动画开始之前
enter开始执行动画
after-enter当动画结束之后
el为元素
done函数,告诉系统动画已结束
clearInterval(animation)清楚动画
@keyframes 动画关键帧属性
0%, 25%… 表示动画执行的阶段百分比
动画只需要定义 v-enter-active / v-leave-active
//单元素,单组件的入场出场动画 const app = Vue.createApp({ data(){ return { show:false } }, methods:{ hanleClick() { this.show = !this.show; } }, template:` <div> <transition> <div v-if="show"> hello world </div> </transition> <button @click = "handleClick">切换</button> </div> ` }); /*固定写法,入场,执行中,结束,隐藏*/ @keyframes shake{ 0% { transform:translateX( -100px ) } 50% { transform:translateX( -50px ) } 100% { transform:translateX( 0px ) } } .v-enter-form { opacity:0; } .v-enter-active{ transition : opacity 3s ease-out } .v-enter-to { opacity:1; } /*这一步可以省略*/ .v-leave-from{ opacity:1; } .v-leave-active{ transition : opacity 3s ease-in } .v-leave-to{ opacity:1; }
自定义class名可以使用第三方的网站,例如animate.style
Vue transtion组件类名可以用animate.css里面的动画类名去做
示例代码:
template: 、 <div> <transition enter-active-class="aninate_animated animste_bounce"> leave-active-class-"aninate_aninated anjmate_bounce" > <div v-show="show">hello world</div> </transition> <button @click="handleclick">切换</button> <div> 、
template: <div> <transition enter-active-class="hello" leave-active-clasp="bye" > <div v-show="show">hello world</div> </transition> <button @click="handleClick">切换</button> </div>
JS通过钩子控制transition标签的动画
methods:{ handleClick(){ this.show=!this.show; }, handleBeforeEnter(el){ el.style.color ="red"; }, handleEnterActive(el,done){ const animation = setInterval(() => { const color=el.style.color; if(color==='red'){ el.style.color= 'green'; } else { el.style.color='red'; } }, 1000) setTimeout(() => { clearInterval(animation); done(); }, 3000)
用JS动画之前先关掉CSS动画,以及JS的入场JS动画钩子和出场动画钩子函数
<transition :css="false" @before-enter="handleBeforeEnter" @enter="handleEnterActive" @after-enter="handleEnterEnd" @before-leave= @leave= @leave-after= > <div v-show="show">hello world</div> </transition>
done回调的使用、after-enter之前先调用done()才有效果
template:、 <div> <transition :css="false" @before-enter="handleBeforeEnter" @enter="hand leEnterActvie" > <div v-show="show">hello world</div> </transition> <button @click="handleClick">切换</button> </div> 、
transiton 组件通过:css=false 关掉css控制动画的能力
transiton组件 通过js钩子去做动画的实现
多个单元素标签之间的切换:
组件切换时的动画效果,一般不同时执行,可以在transition标签中设置 mode = “out-in”(先出再入)
appear初次对某一个标签进行展示的时候,也会带上动画效果
<transition mode=‘out-in’ appear> <div v-if = ‘show’>hellow world</div> <div v-else = ‘show’>bye world</div> </transition>
多个单组件之间的切换:
const app =Vue.createApp({ data(){ return { show: false} }, methods:{ handleClick(){ this.show=!this.show; }, }, components:{ ' component-a': ComponentA, 'component-b': ComponentB, }, template: <div> <transition mode="out-in" appear> <component-a v-if="show" /> <component-b v-else="show" /> </transition> <button @click="handleClick">切换</button> </div>
methods:{ handleClick(){ if(this.component === 'component-a'){ this.component = 'component-b'; }else{ this.component = 'component-a'; } }, }, components:{ 'component-a': ComponentA, ' component-b': ComponentB, }, template: <div> <transition mode="out-in" appear> <component :is="component" /> </transition> <button @click="handleClick">切换</button> </div>
列表添加动画效果标签为transition-group
v-move:除了进出的动画,其他列表标签的动画效果
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="https://unpkg.com/vue@next"></script> <style> .inline-item { display: inline-block; margin-right: 10px; width: 30px; text-align: center; font-size: 21px; font-weight: 600; } /* 入场之前元素的状态设定 */ .v-enter-from { opacity: 0; transform: translateY(30px); } .v-enter-active { /* 动画过程中执行的状态 */ transition: all .5s ease-in; } /* 入场动画结束后的元素状态 */ .v-enter-to { opacity: 1; transform: translateY(0px); } /* 如果希望元素左右移动的时候也需要有动画效果,添加固定的类名即可 */ .v-move { transition: all .5s ease-in; } .v-leave-from { opacity: 1; transform: translateY(0px); } .v-leave-active { /* 动画过程中执行的状态 */ transition: all .5s ease-in; } /* 入场动画结束后的元素状态 */ .v-leave-to { opacity: 0; transform: translateY(30px); } </style> </head> <body> <div id="root"> </div> </body> <script> const app = Vue.createApp({ data(){ return { list:[1,2,3] } }, methods:{ handleClick(){ this.list.unshift(this.list.length+1) }, handleClickRemove(){ this.list.pop() } }, template:` <transition-group> <span v-for="item in list" :key = item class="inline-item">{{item}}</span> </transition-group> <button v-on:click="handleClick">增加</button> <button v-on:click="handleClickRemove">移除</button> ` }) const vm = app.mount('#root') </script> </html>
状态动画:(通过操作数据模拟动画的效果)
/** * 使删除列表元素的时候产生动画要让删除的元素先脱离文档流,旁边的元素才能过渡过来 */ .v-leave-active { position:absolute; }
Vue 获取dom元素中的自定义属性值
方法一:
HTML<div id="app"> <button @click="getData($event,'100')">点我</button></div> JSmethods : { getData(e,num) { console.log(num); // 输出 100 } }
方法二:
HTML<div id="app"> <button data-num="100" ref="dataNum" @click="getData($event)">点我</button></div>JSmethods : { getData (e) { console.log(this.$refs.dataNum.dataset.num); // 输出 100 } }
方法三:
HTML<div id="app"> <button data-num="100" @click="getData($event)">点我</button></div>JSmethods : { getData (e) { console.log(e.target.getAttribute('data-num')); // 输出 100 } }
关于状态动画点击按钮到10停止,再次点击可以继续增加,可以在button的事件添加once,之后就失效了
<button @click.once='ChangeNumber'>切换</button>