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

如何实现点击跳转链接前触发CSS过渡动画?

解决方案

你的问题在于用CSS的:active伪类无法实现点击后等待动画完成再跳转的需求——:active仅在鼠标按下链接的瞬间生效,松开鼠标后状态立刻消失,再加上你原动画设置了10秒延迟,根本来不及触发完整动画。要实现点击链接先执行过渡再跳转,必须结合JavaScript控制流程,具体步骤如下:

1. 调整CSS,新增无延迟的动画类

保留原有的自动触发动画(带10秒延迟),新增针对点击场景的无延迟动画类,确保点击后动画立即执行:

/* 自动触发:10秒后执行动画 */
.transition{
    animation: transitionIn 5s 10s;
}
.transition1{
    animation: transitionOut 5s 10s;
}

/* 点击触发:无延迟,立即执行 */
.transition-immediate{
    animation: transitionIn 5s;
}
.transition1-immediate{
    animation: transitionOut 5s;
}

/* 以下为原关键帧动画,仅修正一处语法错误(translateY(-10)补全单位px) */
@keyframes transitionIn{
    from{
        background-color: #106560;
        opacity:1;
        transform: translateX(100%);
    }
    to{
        background-color: #ffffff;
        opacity:1;
        transform: translateX(0);
    }
}

@keyframes transitionOut{
    from{
        background-color: white;
        opacity:1;
        transform: translateX(100%);
    }
    to{
        background-color: #106560;
        opacity: 1;
        transform: translateX(0);
    }
}

@keyframes fadeInUp {
    from{
      opacity: 0;
    }
    to{
      opacity:1;
      transform: translateY(0);
    }
}

@keyframes fadeInOut{
    from{
      opacity:1;
    }
    to{
      opacity:0;
      transform:translateY(-10px);
    }
}

2. 用JavaScript控制点击跳转流程

给需要触发过渡跳转的链接标记专属类,通过JS监听点击事件,阻止默认跳转、添加动画类,等待动画结束后再完成页面跳转:

JavaScript代码

// 选中所有需要过渡跳转的链接(标记了.js-transition-link类)
const transitionLinks = document.querySelectorAll('.js-transition-link');

transitionLinks.forEach(link => {
    link.addEventListener('click', function(e) {
        // 阻止默认跳转行为
        e.preventDefault();
        const targetUrl = this.href;
        // 从链接的data属性获取要触发的动画类,默认用transition-immediate
        const transitionClass = this.dataset.transition || 'transition-immediate';
        
        // 给body添加动画类,触发过渡
        document.body.classList.add(transitionClass);
        
        // 监听动画结束事件,执行跳转
        function handleAnimationEnd(e) {
            // 仅处理目标动画的结束事件,避免其他动画干扰
            if (e.animationName === 'transitionIn' || e.animationName === 'transitionOut') {
                window.location.href = targetUrl;
                // 清理事件监听和动画类,防止后续异常
                document.body.removeEventListener('animationend', handleAnimationEnd);
                document.body.classList.remove(transitionClass);
            }
        }
        
        document.body.addEventListener('animationend', handleAnimationEnd);
        
        // 保险机制:设置超时跳转,防止动画end事件未触发
        setTimeout(() => {
            window.location.href = targetUrl;
            document.body.removeEventListener('animationend', handleAnimationEnd);
            document.body.classList.remove(transitionClass);
        }, 5000); // 时长与动画时长保持一致(5秒)
    });
});

HTML链接写法

给需要过渡跳转的链接添加专属类和data-transition属性,指定要触发的动画类:

<!-- 触发transitionIn动画后跳转 -->
<a href="/your-next-page" class="js-transition-link" data-transition="transition-immediate">跳转到下一页</a>

<!-- 触发transitionOut动画后跳转 -->
<a href="/another-page" class="js-transition-link" data-transition="transition1-immediate">跳转到另一页</a>

关键说明

  • CSS无法单独实现“等待动画完成再跳转”的逻辑,必须依赖JS的事件监听和流程控制。
  • 新增无延迟的动画类是为了区分自动触发和点击触发的场景,避免点击后还要等10秒才开始动画。
  • 加入超时跳转是为了兼容部分浏览器或异常情况,确保即使动画end事件未触发,页面也能正常跳转。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 14:10:40