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

NextJS项目中CSS Animation关键帧动画不生效问题求助

核心问题及修复方案

问题1:动画名大小写不匹配,导致找不到对应关键帧

你在.hiOut类中引用的动画名是fadeOut(字母O大写),但定义@keyframes时用的是fadeout(字母o小写),CSS Modules 对标识符大小写敏感,因此转译后两个名称无法对应,动画自然无法触发。

问题2:淡出动画的关键帧逻辑写反

你当前定义的fadeout关键帧是从透明度0变到1,和淡入逻辑完全一致,就算匹配到动画也看不到淡出效果。

问题3:淡入动画未设置停留状态

.hi类没有加animation-fill-mode: forwards,淡入动画结束后会回退到你定义的初始opacity:0状态,不符合正常的淡入展示需求。


修复后的样式代码

.hi {
    display: inline-block;
    /* 合写动画属性:动画名 时长 延迟 播放次数 结束后保持最后一帧状态 */
    animation: fadein 1s .1s 1 forwards;
    opacity: 0;
}

.hiOut {
    display: inline-block;
    animation: fadeOut 3s .1s 1 forwards;
    border: 1px solid red;
}

@keyframes fadein {
    from { opacity: 0; }
    to   { opacity: 1; }
}

/* 统一动画名大小写,调整淡出逻辑为从透明度1变到0 */
@keyframes fadeOut {
    0% { opacity: 1; }
    100% { opacity: 0; }
}

可选优化:调整动画结束回调逻辑

你当前的onAnimationEnd逻辑不分动画类型,只要动画结束就切回.hi类,会导致淡出动画结束后重新触发淡入。可以按需求调整:

import styles from '../../styles/Hi.module.css'
import {useEffect, useState} from 'react';

const Hi = ({children, extraClass, navigateAway}) => {
    const [className, setClassName] = useState(styles.hi);

    useEffect(()=>{
        if(navigateAway) {
           setClassName(styles.hiOut)
        }
    },[navigateAway]);

    return (
        <span 
          onAnimationEnd={()=>{
            // 只有淡入动画结束才切换状态,淡出动画结束不切回
            if(className !== styles.hiOut) {
              setClassName(`${styles.hi} ${styles.done}`)
            }
          }} 
          className={className}
        >
          {children}
        </span>
    );
};

export default Hi;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 11:48:03