前端问题1:当我常按按键之后,样式去不掉了,为什么?
这是一个架子鼓项目,当我们按指定键的时候,playing
类名会添加到指定的元素上,并且播放特定的音效。当然,我们并不希望该playing
类名所对应的元素一直都存在,所以又添加了一个新的响应事件针对动画完成的完成的时候,去掉该类名。
但是,当我常按按键一段时间后,该样式去不掉了,为什么?
该项目来自于Javascript30,github地址
关键部分如下所示:
.playing {
transform: scale(1.1);
border-color: #ffc600;
box-shadow: 0 0 1rem #ffc600;
}
function removeTransition(e) {
if (e.propertyName !== 'transform') {
return;
}
e.target.classList.remove('playing');
}
const keys = Array.from(document.querySelectorAll('.key'));
keys.forEach(key => key.addEventListener('transitionend', removeTransition));
该回答引用ChatGPT4与博主@晓码自在合作编写:
这是一个常见的前端问题。原因是:
当你快速连续触发 transitionend 事件时,浏览器无法在事件触发之间移除 .playing 类。所以该类仍然存在,样式也就不会消失。
有几种解决方法:
在 transitionend 事件里设置一个定时器,延迟移除类名。例如:
js
function removeTransition(e) {
if (e.propertyName !== 'transform') return;
setTimeout(() => e.target.classList.remove('playing'), 200);
}
200ms的延时可以给浏览器足够的时间在两次事件之间移除类名。
在 transitionend 事件中首先检查 .playing 类名是否存在,存在才移除:
js
function removeTransition(e) {
if (e.propertyName !== 'transform' || !e.target.classList.contains('playing'))
return;
e.target.classList.remove('playing');
}
这可以避免在类名已经被移除后再次移除引起的错误。
transitioncancel 事件会在新 transition 启动时取消现有的 transition。可以这样使用:
js
keys.forEach(key => {
key.addEventListener('transitionend', removeTransition);
key.addEventListener('transitioncancel', removeTransition);
})
transitioncancel 事件可以确保在新一轮 transition 触发前,旧的 transition 和类名已被移除。
这些是解决重复快速触发 transition 而导致类名无法被移除的常用方法。我个人推荐使用 选项2,在事件中首先检查类名是否存在,这是一种简单高效的解决方案。
答案参考ChatGPT Plus版,整理汇总。希望能帮助你解决问题
在你描述的情况下,样式无法去掉的原因可能是因为 transitionend
事件没有被正确触发。这可能是由于两种情况引起的:
按键事件频率过高:如果你快速按下按键,并且按下的频率超过了样式的过渡时间,那么 transitionend
事件可能不会触发。这样就会导致样式类名无法移除。你可以尝试增加过渡时间或者调整按键事件的处理逻辑来解决这个问题。
按键事件冲突:可能存在其他事件或操作与按键事件冲突,导致 transitionend
事件无法正常触发。你可以检查代码中是否有其他事件或操作与样式类名的移除有冲突,并进行相应的调整。
此外,还有一些可能的调试方法和建议:
playing
类名,并查看是否有其他错误或警告信息。removeTransition
函数中使用 console.log
输出相关信息,以便跟踪事件的触发和样式类名的移除情况。希望这些提示能够帮助你解决问题。如有需要,请提供更多相关代码和错误信息,以便更具体地定位和解决问题。