Vue.js按钮切换上下移动动画实现求助
解决方案
问题根源
- 使用
<transition mode="out-in">会导致元素先后执行过渡(先完成离开动画,再执行进入动画),无法实现两个按钮同步移动的效果; - CSS选择器
button-leave-to缺少开头的点号(应为.button-leave-to),导致离开动画样式不生效; - 混用
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
相关产品推荐
相关产品推荐

