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

如何解决CSS交叉淡入淡出动画页面加载时元素重叠问题?

问题:交叉淡入淡出动画初始加载时元素重叠,如何设置初始仅显示一个元素?

我用以下代码实现多个元素的交叉淡入淡出动画,每个xfader_*类对应列表中的元素。动画运行正常,但页面首次加载时所有元素重叠显示,几秒后才恢复正常。请问怎么设置才能让页面初始状态只显示一个元素?

现有CSS代码:

@keyframes xfade {    0% {        opacity: 1;        }    31.25% {        opacity: 1;        }    33.33333% {        opacity: 0;        }    97.91666% {        opacity: 0;        }    100% {        opacity: 1;        }    }
.xfader_0 {    animation: xfade 48s linear 0s infinite;    opacity: 1;    }
.xfader_1 {    animation: xfade 48s linear 16s infinite;    }
.xfader_2 {    animation: xfade 48s linear 32s infinite;    }

动画应用示例HTML:

<div id='p1r0rmks2Otr' class='cell rmks' style='top:0px;position:absolute;'>
    <div id='p1r0rmks2' class='cell rmks p1r0rmks2animLeft'>
         <div id='p1r0rmks2Inr' class='cell rmks xfader_2'>
         ૈપોૂગેુદગલુદલૈગૂપૂપગેૂીોલેતોબૂપગેગેોૂાોેૂદિ્ગિલાા્</div>
    </div>
</div>
<div id='p1r0rmks1Otr' class='cell rmks' style='top:0px;position:absolute;'>
    <div id='p1r0rmks1' class='cell rmks p1r0rmks1animLeft'>
         <div id='p1r0rmks1Inr' class='cell rmks xfader_1'>
         Flight 5678 has been cancelled</div>
    </div>
</div>
<div id='p1r0rmks0Otr' class='cell rmks' style='top:0px;position:absolute;'>
    <div id='p1r0rmks0' class='cell rmks p1r0rmks0animLeft'>
         <div id='p1r0rmks0Inr' class='cell rmks xfader_0'>
         Departure Gate 1234 Out of Service</div>
    </div>
</div>

解决方案:

问题出在页面加载时,动画还未开始执行(或浏览器渲染动画有短暂延迟),除了xfader_0设置了opacity:1,其他元素的默认opacity为1(浏览器默认样式),所以会全部显示导致重叠。只需给非初始显示的元素设置初始透明即可:

修改后的CSS代码(基础版):

@keyframes xfade {
    0% { opacity: 1; }
    31.25% { opacity: 1; }
    33.33333% { opacity: 0; }
    97.91666% { opacity: 0; }
    100% { opacity: 1; }
}

/* 初始仅显示第一个元素,其余默认隐藏 */
.xfader_0 {
    animation: xfade 48s linear 0s infinite;
    opacity: 1;
}
.xfader_1 {
    animation: xfade 48s linear 16s infinite;
    opacity: 0;
}
.xfader_2 {
    animation: xfade 48s linear 32s infinite;
    opacity: 0;
}

更简洁的写法(批量设置版):

@keyframes xfade {
    0% { opacity: 1; }
    31.25% { opacity: 1; }
    33.33333% { opacity: 0; }
    97.91666% { opacity: 0; }
    100% { opacity: 1; }
}

/* 所有xfader元素初始透明,统一绑定动画 */
[class^="xfader_"] {
    animation: xfade 48s linear infinite;
    opacity: 0;
}

/* 单独设置第一个元素初始可见,以及各元素的动画延迟 */
.xfader_0 {
    opacity: 1;
    animation-delay: 0s;
}
.xfader_1 {
    animation-delay: 16s;
}
.xfader_2 {
    animation-delay: 32s;
}

这样页面加载时,只有xfader_0元素是可见的,其他元素初始透明,动画会在对应的延迟时间点自动切换元素的显示状态,完全不影响后续的交叉淡入淡出循环效果。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 14:25:47