<style>
#box{
width:100px;
height:100px;
background-color: red
}
</style>
</head>
<body>
<div id="app">
<input type="checkbox" v-model="show">
<!-- 在transition标签中使用js动画 需要使用enter事件和leave事件,分别表示入场动画事件和离场动画事件 -->
<transition
@enter="aniEnter"
@leave="aniLeave"
>
<div id="box" v-show="show"></div>
</transition>
</div>
<script src="vue.js"></script>
<script>
new Vue({
el:"#app",
data:{
show:false
},
methods:{
// 动画事件绑定的函数有两个参数 分别是做动画的元素对象和动画结束时的回调函数。
aniEnter(el,cb){
// console.log(arguments)
el.style.opacity=0;
let opa=0
function next(){
requestAnimationFrame(function(){
opa+=0.01;
el.style.opacity=opa;
if(opa>=1){
cb();
}
else{
next()
}
})
}
next()
},
aniLeave(el,cb){
// console.log("leave事件")
// 在动画事件绑定的函数中使用js代码执行动画,并在动画结束时调用cb回调函数。
let opa=1;
function next(){
requestAnimationFrame(function(){
opa-=0.01;
el.style.opacity=opa;
if(opa<=0){
cb();
el.style.opacity=1;
}
else{
next()
}
})
}
next()
}
}
})
</script>
</body>