Если вы рассматриваете не использование JQuery, а чистый JS, я бы посоветовал сделать попытку ниже фрагмента.
С уважением
document.addEventListener("DOMContentLoaded", () => {
if (document.animationInitialized) {
return;
}
document.animationInitialized = true;
const movThs = document.getElementById("movThs");
const UP = "W".charCodeAt(0);
const DOWN = "S".charCodeAt(0);
const RIGHT = "D".charCodeAt(0);
const LEFT = "A".charCodeAt(0);
const XMAX = 50;
const YMAX = 50;
let x = 0;
let y = 0;
let ax = 0;
let ay = 0;
let cx = 0;
let cy = 0;
function clamp(v, min, max) {
return v < min ? min : v > max ? max : v;
}
window.requestAnimationFrame(function onAnimation() {
if (!x) {
if (ax) {
ax += -Math.sign(ax);
}
} else {
ax += x;
ax = clamp(ax, -XMAX, XMAX);
}
cx += ax / 100;
if (!y) {
if (ay) {
ay += -Math.sign(ay);
}
} else {
ay += y;
ay = clamp(ay, -YMAX, YMAX);
}
cy += ay / 100;
movThs.style.transform = `translate3d(${cx}rem,${cy}rem,0)`
window.requestAnimationFrame(onAnimation);
});
document.addEventListener("keydown", (event) => {
switch (event.which) {
case UP:
y = -1;
break;
case LEFT:
x = -1;
break;
case RIGHT:
x = 1;
break;
case DOWN:
y = 1;
break;
}
}, false);
document.addEventListener("keyup", (event) => {
switch (event.which) {
case UP:
case DOWN:
y = 0;
break;
case LEFT:
case RIGHT:
x = 0;
break;
}
}, false);
});
if (document.readyState === "complete") {
document.dispatchEvent(new Event("DOMContentLoaded"));
}
#movThs {
background-color: #ff0000;
width: 100px;
height: 100px;
position: relative;
border-radius: 90%;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="movThs"></div>