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

已有页面进入CSS动画,如何实现页面离开时触发动画?

在用户离开页面时触发反向/新动画的实现方案

当然可以实现,下面给你两种场景的具体实现方法:

1. 先调整CSS:拆分进入和离开动画

把原有的进入动画和新增的离开动画分开,方便JS触发:

.clean {
  content: url(/HPA/Clean.svg);
  width: 81%;
  margin-top: 39.5%;
  left: 120%;
  position: absolute;
  animation-duration: 3s;
  animation-name: enter;
  animation-fill-mode: forwards;
  transition: ease-in;
}

/* 进入页面的动画 */
@keyframes enter {
  to {
    margin-left: -110.3%;
  }
}

/* 离开页面的反向动画类 */
.clean-leave {
  animation-name: leave;
  animation-duration: 3s;
  animation-fill-mode: forwards;
}

@keyframes leave {
  to {
    left: 120%;
    margin-left: 0;
  }
}

2. 用JS监听离开事件触发动画

根据不同的“离开”场景,选择对应的事件监听:

场景一:用户关闭标签页、刷新页面

用beforeunload事件,但注意:浏览器为了导航效率,可能不会等动画完全播放完就跳转,所以动画可能只显示一部分:

const cleanEl = document.querySelector('.clean');

window.addEventListener('beforeunload', () => {
  cleanEl.classList.add('clean-leave');
  // 尝试延迟导航,效果取决于浏览器
  return new Promise(resolve => setTimeout(resolve, 3000));
});

场景二:用户切换到其他标签页(页面隐藏)

用visibilitychange事件,这种场景下动画可以完整播放,还能处理用户切回页面的重置逻辑:

const cleanEl = document.querySelector('.clean');

document.addEventListener('visibilitychange', () => {
  if (document.visibilityState === 'hidden') {
    // 页面隐藏时触发离开动画
    cleanEl.classList.add('clean-leave');
  } else {
    // 用户切回页面,重新播放进入动画
    cleanEl.classList.remove('clean-leave');
    // 重置动画需要触发重绘
    cleanEl.classList.remove('clean');
    void cleanEl.offsetWidth;
    cleanEl.classList.add('clean');
  }
});

注意事项

  • beforeunload的动画效果受浏览器限制,部分浏览器会直接跳过延迟,优先完成导航;
  • 如果你需要确保动画状态被记录(比如统计),可以配合navigator.sendBeacon在动画触发时发送数据,但动画本身的展示还是依赖浏览器行为。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 08:45:37