<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script src="./js/vue.js"></script>
</head>
<body>
<div id="test">
<button @click="show = !show">
Toggle
</button>
<transition
v-on:before-enter="beforeEnter"
v-on:enter="enter"
v-on:after-enter="afterEnter"
v-on:leave="leave"
>
<div v-show="show" ref="oDiv" style="width:200px;height:200px">
Demo
</div>
</transition>
</div>
<script>
new Vue({
el: '#test',
data: {
show: false
},
methods: {
beforeEnter(el) {
el.style.opacity = 0.6
el.style.transformOrigin = 'left'
el.style.transform = 'translate3d(2px, 4px, 0) scale(4)'
},
enter(el, done) {
this.$refs.oDiv.style.background = 'red'
this.$nextTick(() => {
el.style.opacity = 1
el.style.transition = 'all 10.4s'
el.style.transform = 'translate3d(0, 0, 0) scale(1)'
})
el.addEventListener('transitionend', done)
},
afterEnter(el) {
this.$refs.oDiv.style.transition = ''
},
leave(el, done) {
// 这句如果加的话就有动画了
// this.$refs.oDiv.style.width = '200px'
}
</script>
</body>
</html>
比如这样,我的理解是beforeEnter相当于过渡类名中的v-enter,enter相当于v-enter-active, 结果却没有动画效果,请问这是什么原因,谢谢!
下面是写在app的子组件,不加任何el.clientHeight或者offsetHeight,只是加了this.$nextTick()异步执行,然后就有动画了,更奇怪的是我在leave钩子里都没写异步,就像上文那样写还是有过渡leave效果
<div ref="test" style="width:200px;height:200px;background:red"></div>
beforeEnter(el) {
this.$refs.test.style.transform = 'translate3d(2px, 3px, 0) scale(0.1)'
this.$refs.test.test.style.opacity = 0
},
enter(el, done) {
this.$nextTick(() => {
this.$refs.test.style.transition = 'all 10.4s'
this.$refs.test.style.transform = 'translate3d(0, 0, 0) scale(1)'
this.$refs.test.test.style.opacity = 1
})
this.$refs.test.addEventListener('transitionend', done)
},
afterEnter() {
this.$nextTick(() => {
this.$refs.test.style.transition = ''
})
},
leave(el, done) {
this.$refs.test.style.transition = 'all 0.4s'
this.$refs.test.style[transform] = 'translate3d(2px, 5px, 0) scale(4)'
this.$refs.test.addEventListener('transitionend', done)
}
我们改写为原生的js整个执行机制应该类似于这样
// css
// html
// js