You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue.js按钮切换上下移动动画实现求助

解决方案

问题根源

  1. 使用<transition mode="out-in">会导致元素先后执行过渡(先完成离开动画,再执行进入动画),无法实现两个按钮同步移动的效果;
  2. CSS选择器button-leave-to缺少开头的点号(应为.button-leave-to),导致离开动画样式不生效;
  3. 混用position: relative的top属性和transform: translateY,动画逻辑冲突,且top会触发页面重排,性能不如transform。

修复后的代码

Vue模板部分

<transition-group name="button">
  <div 
    class="accordion-item" 
    key="user-button"
    v-show="isActive"
  >
    <h2 class="accordion-header">
      <button class="d-flex bg-white mx-auto">
        <a @click="isActive = !isActive">User</a>
      </button>
    </h2>
  </div>
  <div 
    class="accordion-item" 
    key="view-button"
    v-show="!isActive"
  >
    <h2 class="accordion-header">
      <button class="d-flex bg-white mx-auto">
        <a @click="isActive = !isActive">View</a>
      </button>
    </h2>
  </div>
</transition-group>

CSS样式部分

.accordion-item {
  position: absolute;
  width: 100%;
}

.button-leave-active,
.button-enter-active {
  transition: transform 0.8s ease;
}

/* User按钮点击后向下离开 */
.button-leave-from {
  transform: translateY(0);
}
.button-leave-to {
  transform: translateY(60px);
}

/* View按钮同时向上进入 */
.button-enter-from {
  transform: translateY(-60px);
}
.button-enter-to {
  transform: translateY(0);
}

核心调整说明

  • 替换为<transition-group>:支持多元素同时执行过渡动画,满足两个按钮同步移动的需求;
  • 添加唯一key:Vue需通过key识别每个元素,才能正确触发过渡效果;
  • 设置绝对定位:让两个按钮重叠在同一位置,避免切换时出现布局跳动;
  • 分离动画方向:离开的按钮(如点击User后的User按钮)向下移动,进入的按钮(View)向上移动,匹配需求;
  • 修复CSS语法错误:补全button-leave-to的点号,确保样式生效;
  • 使用transform实现动画:性能优于top,动画更流畅。

内容的提问来源于stack exchange,提问作者16_018_RHR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 05:10:19