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

如何实现网页文本闪烁变色?网页闹钟定时触发剩余时间闪烁效果

网页闹钟15分钟间隔闪烁效果实现方案

原有代码核心问题

  • id大小写不匹配:JS中获取的元素id是Remainclock,CSS选择器写的是#RemainClock(C大写),样式无法正常匹配生效
  • 剩余时间计算逻辑错误:时间差计算后多余的取模、转字符串操作,导致15分钟整数倍的判断逻辑完全失效
  • 缺少定时器清理逻辑:触发条件满足时反复创建setInterval,会导致动画卡顿、到停止时间也无法关闭闪烁
  • 无闪烁状态标记:没有判断当前是否已经在执行闪烁,会重复触发效果造成逻辑混乱

修正后的CSS代码

统一id大小写,用CSS动画实现闪烁效果,性能远高于JS手动修改样式:

/* id和JS、HTML保持一致,全部用小写c */
#Remainclock {
    font-family: 'Orbitron', sans-serif;
    font-size: 5vw;
    background-image: linear-gradient(180deg,
        rgba(99,253,136,1) 0%,
        rgba(51,197,142,1) 50%,
        rgba(39,97,116,1) 100%);
    background-clip: text;
    -webkit-background-clip: text;
    -moz-background-clip: text;
    -webkit-text-fill-color: transparent; 
    -moz-text-fill-color: transparent;
    transition: all 0.2s ease;
}
/* 闪烁效果类,触发时动态添加 */
#Remainclock.blink-effect {
    animation: blink 1s infinite;
}
/* 闪烁变色动画:红/黄渐变交替+透明度变化 */
@keyframes blink {
    0%, 100% {
        background-image: linear-gradient(180deg,
            rgba(255,87,87,1) 0%,
            rgba(255,52,52,1) 50%,
            rgba(180,20,20,1) 100%);
        opacity: 1;
    }
    50% {
        background-image: linear-gradient(180deg,
            rgba(255,235,59,1) 0%,
            rgba(255,193,7,1) 50%,
            rgba(214,130,16,1) 100%);
        opacity: 0.7;
    }
}

修正后的JS代码

修复时间计算逻辑,增加定时器防重复和自动清理逻辑:

// 全局存储闪烁定时器id,方便后续销毁
let blinkTimer = null;
// 确保pDateTime是你预设的闹钟响铃时间,为全局可访问的Date对象

function blinking()
{
    const remainClockEl = document.getElementById("Remainclock");
    // 计算当前剩余毫秒数
    const remainMs = pDateTime.getTime() - new Date().getTime();
    // 向上取整算剩余分钟数,避免差几秒到整15分钟时提前/漏触发
    const remainingMinutes = Math.ceil(remainMs / 60000);

    // 触发条件:剩余分钟为15的正整数倍、当前没有在执行闪烁
    if(remainingMinutes % 15 === 0 && remainingMinutes > 0 && !blinkTimer) {
        // 添加闪烁类启动效果
        remainClockEl.classList.add('blink-effect');
        // 每秒检查一次是否到停止时间
        blinkTimer = setInterval(() => {
            const currentRemainMs = pDateTime.getTime() - new Date().getTime();
            const currentRemainMinutes = Math.ceil(currentRemainMs / 60000);
            // 剩余分钟不再是15的倍数时,移除效果、清理定时器
            if(currentRemainMinutes % 15 !== 0) {
                remainClockEl.classList.remove('blink-effect');
                clearInterval(blinkTimer);
                blinkTimer = null;
            }
        }, 1000)
    }
}

// 主逻辑每秒执行一次检查即可,不要在blinking函数内部重复创建定时器
setInterval(blinking, 1000);

效果说明

  • 剩余时间为15、30、45、60……整15倍数分钟时,自动触发红黄色交替闪烁效果
  • 闪烁持续整1分钟,等剩余时间走到14、29、44……分钟时自动停止,恢复原本的绿色渐变样式
  • 做了定时器防重复处理,不会出现页面卡顿、闪烁无法停止的问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 16:42:16