Pong游戏左Paddle下移IF语句异常:按下向下键第二次时逻辑失效
搞定你的Pong左Paddle移动问题!
先说说问题出在哪
你碰到的两个麻烦——第二次按向下键IF语句失效、出现53.00001%这种奇怪的小数top值,其实是两个常见的前端坑在搞鬼:
- 浏览器渲染的浮点精度问题:CSS的百分比位置在浏览器内部计算时,可能因为浮点运算的精度误差,生成带多位小数的数值,这属于正常的渲染细节,但会干扰你的判断逻辑。
- 字符串和数值比较搞混了:你直接拿
style.top的字符串(比如'53.00001%')和'100%'做比较,但字符串是按字符顺序比的——'5'的ASCII码比'1'大,所以浏览器会认为'53.00001%' > '100%',这就导致你的IF条件明明逻辑上应该成立,实际却不执行,和你打印的数值完全矛盾!
直接上修复后的代码
核心思路就是把百分比字符串转成数值来处理,同时兼容初始top是CSS类设置的情况(这时候style.top可能是空的):
// 获取左Paddle的DOM元素 const leftPaddleRef = document.getElementById('left-paddle'); // 监听键盘按下事件 document.addEventListener('keydown', (e) => { if (e.key === 'ArrowDown') { // 第一步:获取当前top的数值(处理两种情况:inline样式或CSS类设置的top) let currentTop = parseFloat(leftPaddleRef.style.top); if (isNaN(currentTop)) { // 如果inline style为空,就拿浏览器实际渲染的样式值 const computedStyle = window.getComputedStyle(leftPaddleRef); currentTop = parseFloat(computedStyle.top); } // 第二步:设置每次移动的步长(你可以自己调整这个数值) const moveStep = 3; // 第三步:计算新的top值,用Math.min确保不会超过100%的边界 const newTop = Math.min(currentTop + moveStep, 100); // 第四步:更新Paddle的位置 leftPaddleRef.style.top = `${newTop}%`; // 调试用的打印(换成console.log比alert友好,不会打断操作) console.log(`当前top值:${leftPaddleRef.style.top}`); } });
为什么这么改就好用了?
- 数值化处理:用
parseFloat()把带%的字符串转成纯数字,这样比较和计算都不会出错,不管有多少位小数都能正确判断。 - 兼容初始样式:如果你的Paddle初始top是写在CSS类里(不是直接写在div的
style属性里),leftPaddleRef.style.top会是空的,这时候getComputedStyle()能拿到浏览器实际渲染的top值,解决初始值获取不到的问题。 - 边界自动控制:用
Math.min(currentTop + moveStep, 100)直接把新top值限制在100%以内,省掉了容易出问题的IF判断,逻辑更简洁可靠。
这样改完之后,不管按多少次向下键,Paddle都会乖乖移动到底部就停,再也不会出现IF语句失效的情况啦!
内容的提问来源于stack exchange,提问作者linus
相关产品推荐
相关产品推荐

