HH123_3 2023-12-09 10:12 采纳率: 86.8%
浏览 6
已结题

CSS问题:transitionend事件为什么没有触发?

CSS问题:transitionend事件为什么没有触发?

1. 在window对象上注册keydown事件,当按A键,会给元素(#A)的classListi添加一个playing类名,这会产生一个transition效果。
2. 在这个元素(#A)上注册一个transitionend事件,当transition过程结束的时候,从classList移除playing

问题: 当我长按A键之后松开,playing并没有被移除?console.log查看了一下,只有刚开始触发了几次transitionend,之后就没有了?

代码可以在codesandbox查看并运行。

  • 写回答

1条回答 默认 最新

  • 俊刚、 2023-12-09 10:48
    关注

    在你的代码中,长按A键后再次按下A键确实没有触发效果。这是因为在playSound函数中,只有按下键盘的事件会触发添加playing类的操作,而不会检查是否已经存在playing类。因此,当你再次按下A键时,虽然代码执行了添加playing类的操作,但由于元素已经存在该类,所以没有触发过渡效果。

    <!DOCTYPE html>
    <html lang="en">
        <head>
            <meta charset="UTF-8" />
            <title>JS Drum Kit</title>
            <link rel="stylesheet" href="style.css" />
            <link rel="icon" href=" https://fav.farm/ ✅" />
            <style>
                body {
                    min-height: 100vh;
                    display: grid;
                    place-content: center;
                }
                #A {
                    width: 100px;
                    height: 100px;
                    color: white;
                    background: rgba(0, 0, 0, 0.4);
                    text-shadow: 0 0 0.5rem black;
                    border: 2px solid black;
                    display: grid;
                    place-content: center;
                    font-size: 2rem;
                    transition: all 0.07s ease;
                }
                .playing {
                    transform: scale(1.1);
                    border-color: #ffc600;
                    box-shadow: 0 0 1rem #ffc600;
                }
            </style>
        </head>
        <body>
            <div data-key="A" id="A">A</div>
            <script>
                let timer
                function removeTransition(e) {
                    console.log('transitionend', e)
                    if (e.propertyName !== 'transform') return
                    e.target.classList.remove('playing')
                }
                function playSound(e) {
                    console.log('key down')
                    if (e.code !== 'KeyA') return
                    elemA.classList.remove('playing')
                    setTimeout(() => {
                        elemA.classList.add('playing')
                    }, 10)
                }
                const elemA = document.querySelector('#A')
                window.addEventListener('keydown', playSound)
                window.addEventListener('keyup', () => {
                    console.log('key up')
                    clearInterval(timer)
                })
                elemA.addEventListener('transitionend', removeTransition)
            </script>
        </body>
    </html>
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 12月18日
  • 已采纳回答 12月10日
  • 创建了问题 12月9日

悬赏问题

  • ¥15 黄永刚的晶体塑性子程序中输入的材料参数里的晶体取向参数是什么形式的?
  • ¥20 数学建模来解决我这个问题
  • ¥15 计算机网络ip分片偏移量计算头部是-20还是-40呀
  • ¥15 stc15f2k60s2单片机关于流水灯,时钟,定时器,矩阵键盘等方面的综合问题
  • ¥15 YOLOv8已有一个初步的检测模型,想利用这个模型对新的图片进行自动标注,生成labellmg可以识别的数据,再手动修改。如何操作?
  • ¥30 NIRfast软件使用指导
  • ¥20 matlab仿真问题,求功率谱密度
  • ¥15 求micropython modbus-RTU 从机的代码或库?
  • ¥15 django5安装失败
  • ¥15 Java与Hbase相关问题