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

JS使用setTimeout实现文字滑动动画首次触发transition属性不生效问题

问题原因

首次触发动画时transition不生效是两个核心问题导致的:

  • 你的.text元素没有设置初始的opacity和left属性值,浏览器默认的属性值不是可计算过渡的明确数值,第一次修改属性时无法计算过渡起始值,会直接跳变到目标状态,看不到动画效果。
  • 首次触发时你才动态给元素添加transition属性,浏览器没有足够的时间将该属性应用到元素上就同时修改了过渡属性,也会导致过渡失效。后续触发时元素已经挂载了transition属性,就可以正常执行动画。

解决方案

第一步:修改CSS代码,补充初始属性和过渡规则

直接将过渡规则和初始状态写在CSS中,避免动态赋值的时序问题:

.story .box .right-part .text-container .text {
    line-height: 1.25;
    position: relative;
    /* 新增以下属性 */
    opacity: 1;
    left: 0;
    transition: all 0.5s;
}

第二步:优化JS代码,删除冗余逻辑

删掉JS中动态设置transition的那行代码,同时修正一处逻辑笔误:

function slide_animation(direction){
    // Init
    let text = document.querySelector(".story .box .right-part .text");
    let text_html = text.innerHTML;
    let text_slide = [
        "Text n°1",
        'Text n°2',
        'Text n°3'
    ];
    let current_slide = 0;

    // Looking for the current_slide
    for(let i=0;i<text_slide.length;i++){
        if (text_slide[i]==text_html){current_slide = i};
    }

    // Calculating the next slide position
    if (direction=='right'){
        if (current_slide >= text_slide.length-1){
            current_slide = 0;
        }
        else {current_slide+=1;}
    }
    else {
        if (current_slide <= 0){
            current_slide = text_slide.length-1;
        }
        else {
            // 修正原笔误:current_slide = current_slide-=1; 改为下方写法
            current_slide -=1;
        }
    }

    // Animation
    setTimeout(()=>{
        text.style.opacity = 0;
        text.style.left = '100px';  
    },250);


    setTimeout(()=>{
        text.innerHTML = text_slide[current_slide];
        text.style.opacity = 1;
        text.style.left = '0px';
    },750)
}

修改完成后首次触发动画即可正常生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 16:06:03