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

如何为已设置入场动画的modal实现相同效果的反向隐藏动画

实现方案

1. 调整CSS代码

把原来写死在.modal上的动画拆分,避免默认加载就触发动画,同时直接复用现有keyframes实现反向效果,不需要重写动画帧:

/* 基础modal样式,保留你原有的fixed、z-1、宽高、背景等所有样式,只调整动画相关配置 */
.modal {
  animation-duration: 1s;
  animation-timing-function: ease;
  animation-fill-mode: forwards;
}
/* 入场动画类 */
.modal-show {
  animation-name: myAnim;
  animation-direction: normal;
}
/* 退场动画类,仅修改动画方向为反向,复用同一套关键帧 */
.modal-hide {
  animation-name: myAnim;
  animation-direction: reverse;
}
@keyframes myAnim {
  0% {
    opacity: 0;
    transform: translateX(-50px);
  }
  100% {
    opacity: 1;
    transform: translateX(0);
  }
}

2. 编写JS交互逻辑

核心注意点:退场时不能直接加hidden类,需要等反向动画执行完毕后再隐藏元素,否则动画会被直接打断不生效:

const modal = document.getElementById('myModal');
const toggleBtn = document.getElementById('myBtn');
// 初始状态和你的默认类保持一致,默认有hidden类所以初始为隐藏状态
let isModalVisible = false;

toggleBtn.addEventListener('click', () => {
  if (isModalVisible) {
    // 触发退场逻辑
    modal.classList.add('modal-hide');
    // 监听动画结束事件,执行完再隐藏元素
    modal.addEventListener('animationend', () => {
      modal.classList.add('hidden');
      // 清理动画类,避免下次入场动画冲突
      modal.classList.remove('modal-show', 'modal-hide');
      isModalVisible = false;
    }, { once: true }) // 配置once避免重复绑定事件
  } else {
    // 触发入场逻辑
    modal.classList.remove('hidden');
    modal.classList.add('modal-show');
    isModalVisible = true;
  }
})

可选优化

如果要避免动画执行过程中重复点击按钮导致逻辑混乱,可以新增isAnimating状态锁,动画执行过程中忽略按钮点击即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 22:27:07