使用Transition在Vuejs中为v-if设置动画高度

Gij*_*ese 7 css animation vue.js vuejs2

我正在使用以下代码通过将高度降低到0px来为v-if元素设置动画.动画效果很好.但问题是我要指定元素的初始高度是CSS.对于一个元素,这没关系,但我想将此动画应用于多个元素.我怎样才能解决这个问题?无论高度如何,动画效果都很好!

<transition name="fadeHeight" mode="out-in">
<div v-if="something">
<p>something over here where the height is not constant</p>
</div>
</transition>

.fadeHeight-enter-active,
.fadeHeight-leave-active {
  transition: all 0.2s;
  height: 230px;
}
.fadeHeight-enter,
.fadeHeight-leave-to
{
  opacity: 0;
  height: 0px;
}
Run Code Online (Sandbox Code Playgroud)

rya*_*ker 23

它看起来并不像你发布了所有代码,但希望我理解目标.

尝试将过渡移动到max-height属性:

.fadeHeight-enter-active,
.fadeHeight-leave-active {
  transition: all 0.2s;
  max-height: 230px;
}
.fadeHeight-enter,
.fadeHeight-leave-to
{
  opacity: 0;
  max-height: 0px;
}
Run Code Online (Sandbox Code Playgroud)

只要您将最大高度设置为大于最高元素,它就应该完成您所需要的.请注意,您可能也想使用overflow:hidden它.如果元素的实际高度有显着变化,则此解决方案可能不是最好的,因为它会使动画持续时间/延迟显得非常不同.

https://jsfiddle.net/7ap15qq0/4/

  • 这不是一个干净的动画,不应该是接受者的答案,这只是一个 CSS hack。设置较高的最大高度值会以一种方式延迟动画,并以另一种方式减少过渡时间。 (5认同)
  • 完全同意它并不完美,但它不是黑客 - 它直接回答了所提出的问题。答案已经指出了效果的潜在问题/变化,具体取决于相对于所使用的最大高度值的大小。如果您正在寻找不同的东西,这里有一些替代方案和优缺点的详细分类:https://css-tricks.com/using-css-transitions-auto-dimensions/ (3认同)

小智 8

我在这个问题上遇到了一些麻烦,而且在我看来,许多答案都很复杂。一段时间后,这就是我想出的方法来为“height:auto”内容进行平滑的高度过渡:

<template>
 <transition name="expand">
   <div v-show="isExpanded" ref="content">
     <slot />
   </div>
 </transition>
</template>

<script setup lang="ts">
import { onMounted, ref } from '@vue'

defineProps<{isExpanded: boolean}>()
const content = ref()
let height = ref()

onMounted(() => {
  height.value = `${content.value.getBoundingClientRect().height}px`
})
</script>

<style scoped lang="less">
.expand-leave-active,
.expand-enter-active {
  transition: all 350ms ease;
  overflow: hidden;
}

.expand-enter-to,
.expand-leave-from {
  height: v-bind(height);
}

.expand-enter-from,
.expand-leave-to {
  opacity: 0;
  height: 0;
}
</style>
Run Code Online (Sandbox Code Playgroud)

希望这对某人有帮助!