1 回答
TA贡献1851条经验 获得超5个赞
该代码存在多个问题,我不确定它如何处理图像。
为此,需要完成以下几件事:
确保目标元素的 CSS 已
position: absolute
设置属性。您也可以根据需要使用relative
,fixed
或。sticky
使用
getComputedStyle
而不是style
直接访问。该属性将仅包含由属性或属性设置的style
值。附加一个测量单位,就像
"px"
解析的数字一样。
这是一个最小的完整示例:
const element = document.getElementById("char");
const charStyle = getComputedStyle(element);
function moveSelection(evt) {
evt.preventDefault();
switch (evt.keyCode) {
case 37:
element.style.left = parseInt(charStyle.left) - 10 + "px";
break;
case 39:
element.style.left = parseInt(charStyle.left) + 10 + "px";
break;
case 38:
element.style.top = parseInt(charStyle.top) - 10 + "px";
break;
case 40:
element.style.top = parseInt(charStyle.top) + 10 + "px";
break;
}
}
document.addEventListener("keydown", moveSelection);
#char {
width: 50px;
height: 50px;
background: red;
position: absolute;
}
<div id="char"></div>
话虽如此,这种设计应该会给您一种反模式的印象,因为它序列化和反序列化 DOM 元素中的属性。对于创建良好的老式数据结构来说,这是一个糟糕的替代品,例如:
const character = {x: 0, y: 0, stepSize: 10 /*... more properties ...*/};
此外,让键盘直接触发角色的移动会导致重新触发笨拙并且通常不可靠的用户体验。requestAnimationFrame
对于这种情况,最好使用动画循环。键盘处理程序将打开和关闭每个键的标志,但实际上不会直接更新任何内容。动画循环将顺利处理重新定位。您的 JS 脚本将保留游戏/动画状态,并且仅在渲染帧时将其作为解耦视图转储到 DOM。这样,数据就会朝一个方向流动,您的应用程序将更易于编写和维护。
- 1 回答
- 0 关注
- 74 浏览
添加回答
举报