使用setTimeout实现网页Logo随机间隔闪烁效果遇问题求助
Logo随机闪烁/发光效果修正方案
你的代码思路没问题,但几个细节问题导致效果不符合预期,以下是修正后的代码和问题说明:
问题分析
- 变量名冲突:全局声明的
glow变量被循环函数内的var glow覆盖,导致闪烁状态逻辑混乱 - 错误使用
setInterval:你需要的是闪烁开启后持续一段时间再关闭,而setInterval会反复切换状态,这不是你要的效果 - 触发逻辑不完整:原代码只在等待随机时间后执行了一次
flash,没有控制闪烁的持续时长
修正后的代码
// 全局控制闪烁状态 let isGlowing = false; const logoElement = document.querySelector("#logo"); // 切换闪烁状态的函数 function toggleGlow() { isGlowing = !isGlowing; if (isGlowing) { // 开启发光效果 logoElement.style.textShadow = "-2px -2px 0.1em #fff, -2px -2px 0.1em #fff, 2px 2px 0.1em #fff, -2px -2px 0.3em #fff, 2px 2px 0.5em #fff"; } else { // 关闭发光效果 logoElement.style.textShadow = "0 0 0"; } } // 循环触发闪烁的函数 (function loop() { // 生成4-7秒的随机等待时间(毫秒) const randomWaitTime = Math.floor(Math.random() * (7000 - 4000 + 1)) + 4000; // 闪烁持续时间,这里设为700毫秒,可按需调整 const glowDuration = 700; setTimeout(() => { // 开启闪烁 toggleGlow(); // 持续指定时间后关闭闪烁,然后进入下一轮循环 setTimeout(() => { toggleGlow(); loop(); }, glowDuration); }, randomWaitTime); })();
关键修改说明
- 重命名全局状态变量为
isGlowing,避免和定时器变量冲突 - 提前获取
#logo元素,不用每次调用函数都重新查询,提升性能 - 用嵌套的
setTimeout实现:先等待随机时间,开启闪烁,再等待指定时长后关闭闪烁,然后进入下一轮循环 - 修正随机数生成逻辑,确保4000-7000毫秒(4-7秒)的范围是闭区间,避免出现小于4秒的情况
内容的提问来源于stack exchange,提问作者aristotles
相关产品推荐
相关产品推荐

