当前位置:首页 > VUE

vue实现展开动画

2026-02-22 10:38:31VUE

使用 Vue 的 Transition 组件实现展开动画

Vue 提供了内置的 Transition 组件,可以方便地实现元素的展开和折叠动画。以下是一个基本示例:

<template>
  <div>
    <button @click="isExpanded = !isExpanded">Toggle</button>
    <Transition name="expand">
      <div v-if="isExpanded" class="content">
        This is the content that will expand and collapse
      </div>
    </Transition>
  </div>
</template>

<script>
export default {
  data() {
    return {
      isExpanded: false
    }
  }
}
</script>

<style>
.expand-enter-active,
.expand-leave-active {
  transition: height 0.5s ease;
  overflow: hidden;
}

.expand-enter-from,
.expand-leave-to {
  height: 0;
}

.expand-enter-to,
.expand-leave-from {
  height: 100px; /* 设置为内容实际高度或使用auto */
}
</style>

动态高度展开动画

当内容高度不确定时,可以使用 JavaScript 计算高度:

<template>
  <div>
    <button @click="toggle">Toggle</button>
    <Transition
      @before-enter="beforeEnter"
      @enter="enter"
      @after-enter="afterEnter"
      @before-leave="beforeLeave"
      @leave="leave"
    >
      <div v-if="isExpanded" class="content" ref="content">
        Dynamic content height<br>
        More lines<br>
        Even more lines
      </div>
    </Transition>
  </div>
</template>

<script>
export default {
  data() {
    return {
      isExpanded: false
    }
  },
  methods: {
    toggle() {
      this.isExpanded = !this.isExpanded
    },
    beforeEnter(el) {
      el.style.height = '0'
    },
    enter(el) {
      el.style.height = `${el.scrollHeight}px`
    },
    afterEnter(el) {
      el.style.height = 'auto'
    },
    beforeLeave(el) {
      el.style.height = `${el.scrollHeight}px`
    },
    leave(el) {
      setTimeout(() => {
        el.style.height = '0'
      })
    }
  }
}
</script>

<style>
.content {
  transition: height 0.5s ease;
  overflow: hidden;
}
</style>

使用 CSS Grid 实现展开动画

CSS Grid 也可以实现平滑的展开效果:

<template>
  <div class="grid-container">
    <button @click="isExpanded = !isExpanded">Toggle</button>
    <div class="grid-item" :class="{ expanded: isExpanded }">
      Content that expands
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      isExpanded: false
    }
  }
}
</script>

<style>
.grid-container {
  display: grid;
  grid-template-rows: auto 0fr;
  transition: grid-template-rows 0.5s ease;
}

.grid-item {
  overflow: hidden;
}

.expanded {
  grid-template-rows: auto 1fr;
}
</style>

使用第三方库(如 VueUse)

VueUse 提供了 useTransition 组合式 API 来实现更复杂的动画:

<template>
  <div>
    <button @click="isExpanded = !isExpanded">Toggle</button>
    <div :style="style">
      Content with VueUse transition
    </div>
  </div>
</template>

<script>
import { ref } from 'vue'
import { useTransition } from '@vueuse/core'

export default {
  setup() {
    const isExpanded = ref(false)
    const height = useTransition(isExpanded, {
      duration: 500,
      transition: [0.75, 0, 0.25, 1]
    })

    const style = computed(() => ({
      height: `${height.value * 100}px`,
      overflow: 'hidden'
    }))

    return { isExpanded, style }
  }
}
</script>

注意事项

  • 确保动画元素有 overflow: hidden 属性
  • 对于动态内容,需要在动画前获取元素的实际高度
  • 使用 requestAnimationFrame 可以优化动画性能
  • 考虑添加 will-change: height 属性提升动画性能
  • 移动端设备可能需要添加 -webkit-overflow-scrolling: touch

vue实现展开动画

标签: 动画vue
分享给朋友:

相关文章

vue实现图片

vue实现图片

Vue 实现图片功能的方法 静态图片引入 在 Vue 项目中,可以通过 src 属性直接引入静态图片。图片通常放在 public 或 assets 目录下。 <template> &…

vue实现tap

vue实现tap

Vue 实现 Tap 事件 在移动端开发中,Tap 事件比 Click 事件更常用,因为 Click 事件有 300ms 延迟。以下是几种在 Vue 中实现 Tap 事件的方法。 使用第三方库 安…

vue拖动实现

vue拖动实现

实现 Vue 拖动功能的方法 使用 HTML5 拖放 API 在 Vue 中可以利用 HTML5 的原生拖放 API 实现拖动功能。通过 draggable 属性标记可拖动元素,结合 @dragsta…

lua 实现vue

lua 实现vue

在 Lua 中实现类似 Vue 的响应式框架需要模拟 Vue 的核心功能,包括数据绑定、模板渲染和依赖追踪。以下是实现的关键思路和代码示例: 响应式数据绑定 使用 Lua 的 __index 和 _…

自实现vue

自实现vue

实现 Vue 的核心功能 要实现一个简化版的 Vue,需要理解其核心功能:数据响应式、模板编译、虚拟 DOM 和组件系统。以下是关键步骤的分解: 数据响应式 Vue 使用 Object.define…

vue实现分步

vue实现分步

Vue 实现分步功能 在 Vue 中实现分步功能可以通过多种方式完成,以下是几种常见的方法: 使用动态组件 通过动态组件切换不同的步骤内容,结合 v-if 或 component 标签实现分步逻辑。…