我有一组元素显示/隐藏/重新排列过渡组,没什么特别的。
.cross-fade-leave-active {
transition: transform $fadeSpeed ease-in-out, opacity $fadeSpeed ease-in-out;
position: absolute;
}
.cross-fade-enter-active {
transition: opacity $fadeSpeed ease-in-out $fadeSpeed;
}
.cross-fade-enter-from,
.cross-fade-leave-to {
opacity: 0;
}
.cross-fade-move{
transition: transform $fadeSpeed ease-in $fadeSpeed, opacity $fadeSpeed ease-in-out;
}
这很好用,除非在动态高度父容器是元素流的一部分的情况下。父级立即捕捉到 FLIP 动画的最后阶段,而过渡组的内容则顺利完成它们的工作。
虽然从功能上讲它为什么会发生是有道理的,但它远非理想。
有没有一种直接的方法可以连接到 Vue FLIP 动画以获取父级的 First 和 Last 属性,这样我就可以设置过渡的最大高度?
我的尝试
<div :ref="`container${i}`" :style="{'max-height': containers[`container${i}`]}">
<transition-group name="cross-fade"
@after-enter="clearMaxHeight(`container${i}`)"
@after-leave="clearMaxHeight(`container${i}`)"
@before-enter="maxHeight(`container${i}`)"
@enter="maxHeight(`container${i}`)"
@before-leave="maxHeight(`container${i}`)"
@leave="maxHeight(`container${i}`)"
>
//...conditional elements
</transition-group>
</div>
maxHeight(ref){
let container = this.$refs[ref];
this.containers[ref] = container.clientHeight + 'px';
},
clearMaxHeight(ref){
this.containers[ref] = 'none';
},
从理论上讲,我认为before-enter
或者before-leave
会在转换之前捕获元素的高度,这将锁定父级的第一个高度。然后enter
或leave
将在元素从流中添加/删除后立即捕获新元素,并给出 Last 高度。最后,当动画完成后,只需将最大高度设置回无,这样它就可以正常运行。
但这不是那样的。即使过渡时间增加到 5 秒,我也看到 max-height 在一瞬间被设置为一个数字,然后立即回到“无”。也许我误解了 Vue 动画钩子的生命周期,但是文档在确切的执行上似乎有点稀疏。