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

如何使用CSS transition与JavaScript实现每次点击文本均淡入而非仅首次

问题原因

你的代码仅首次点击生效的核心原因是:首次点击后#data元素的opacity属性会被永久设为1,后续点击时没有发生属性值变更,自然不会触发CSS transition过渡效果。

解决方案

要实现每次点击都触发淡入,需要每次点击时先将透明度重置为0,等待浏览器确认该样式生效后,再将透明度改回1触发过渡。
注意不能连续同步设置opacity = 0和opacity = 1,浏览器会合并同一次事件循环内的样式变更,导致过渡不会被触发,这里推荐用requestAnimationFrame来等待渲染帧完成,时序更精准。

完整修正代码

<style>
/* 建议明确指定过渡属性,避免不必要的性能消耗 */
#data {
    transition: .7s opacity;
}
</style>

<h1 id="data"></h1>
<a href="#" id="clicker">click 1</a>

<script>
const dataEl = document.getElementById('data');
dataEl.style.opacity = 0;

function go(event){
    event.preventDefault();
    // 先重置透明度为0
    dataEl.style.opacity = 0;
    // 等待两个渲染帧,确保opacity=0已被浏览器应用
    requestAnimationFrame(() => {
        requestAnimationFrame(() => {
            dataEl.innerHTML = 'test';
            dataEl.style.opacity = 1;
        })
    })
}

document.getElementById('clicker').addEventListener('click', go);
</script>

简化兼容方案

如果你的场景允许极小的延迟,也可以用setTimeout实现,写法更简单:

function go(event){
    event.preventDefault();
    const dataEl = document.getElementById('data');
    dataEl.style.opacity = 0;
    setTimeout(() => {
        dataEl.innerHTML = 'test';
        dataEl.style.opacity = 1;
    }, 10)
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 21:36:04