共计 2406 个字符,预计需要花费 7 分钟才能阅读完成。
Vue transition 过渡动画使用钩子函数
钩子函数
- 将钩子函数绑定在 transition 标签上之后
<transition
v-on:before-enter="beforeEnter"
v-on:enter="enter"
v-on:after-enter="afterEnter"
v-on:enter-cancelled="enterCancelled"
v-on:before-leave="beforeLeave"
v-on:leave="leave"
v-on:after-leave="afterLeave"
v-on:leave-cancelled="leaveCancelled"
>
<!-- ... -->
</transition>
- 在 Vue 实例中的 methods 定义钩子函数的方法
- 在这里踩到了一个坑
after-enter 函数一直没有触发,花了很久时间才得到解决,这里用了 Vue 官方推荐的插件 Velocity.js, 现在就让我们聊聊这个问题
原来有问题的代码
enter(el, done){Velocity(el, { translateX: '150px',translateY : '450px'}, {duration: 1000})
Velocity(el,{opacity: 1},{duration: 1000}, {complete: done})
// setTimeout(() => {
// el.offsetWidth
// el.style.transform = "translate(150px,450px)";
// el.style.transition = "all 2s easy";
// done()
// }, 20)
},
上面代码的动画效果没有问题,但是 after-enter 方法却一直没有触发后面通过调试后发现
Velocity(el,{opacity: 1},{duration: 1000}, {complete: done})
改为
Velocity(el,{opacity: 1},{complete: done})
或者
elocity(el,{opacity: 1},{duration: 1000 , complete: done})
after-enter 方法就触发了,那么对比官方给的例子
<!--
Velocity works very much like jQuery.animate and is
a great option for JavaScript animations
-->
<script src="https://cdnjs.cloudflare.com/ajax/libs/velocity/1.2.3/velocity.min.js"></script>
<div id="example-4">
<button @click="show = !show">
Toggle
</button>
<transition
v-on:before-enter="beforeEnter"
v-on:enter="enter"
v-on:leave="leave"
v-bind:css="false"
>
<p v-if="show">
Demo
</p>
</transition>
</div>
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: '1.4em'}, {duration: 300})
Velocity(el, { fontSize: '1em'}, {complete: done})
},
leave: function (el, done) {Velocity(el, { translateX: '15px', rotateZ: '50deg'}, {duration: 600})
Velocity(el, { rotateZ: '100deg'}, {loop: 2})
Velocity(el, {
rotateZ: '45deg',
translateY: '30px',
translateX: '30px',
opacity: 0
}, {complete: done})
}
}
})
分析
做出其他尝试后,发现只要传了 4 个参数后,我的 after-enter 方法就不会触发,所以个人觉得 在 Vue translition 中 Velocity(…args)只能传三个参数 ,在结合 Velocity() 的 Arguments 的参数(源于 https://www.cnblogs.com/guand…)
{
width: "500px", // 动画属性 宽度到 "500px" 的动画
property2: value2 // 属性示例
}, {
/* Velocity 动画配置项的默认值 */
duration: 400, // 动画执行时间
easing: "swing", // 缓动效果
queue: "", // 队列
begin: undefined, // 动画开始时的回调函数
progress: undefined, // 动画执行中的回调函数(该函数会随着动画执行被不断触发)complete: undefined, // 动画结束时的回调函数
display: undefined, // 动画结束时设置元素的 css display 属性
visibility: undefined, // 动画结束时设置元素的 css visibility 属性
loop: false, // 循环
delay: false, // 延迟
mobileHA: true // 移动端硬件加速(默认开启)}
结论
在 Vue 的钩子函数中 Velocity()的第一个参数是 el,第二个为动画属性项的定义,第三个参数为动画配置项的定义,Velocity 的用法即:
Velocity(el,obj1,obj2)
obj1,obj2 的属性请看上面的参数
end
正文完
发表至:无分类
2019-07-13