HTML:
<div id="pane">
<div id="box"></div>
</div>
CSS:
#pane {
position:relative;
width:300px; height:300px;
border:2px solid red;
}
#box {
position:absolute; top:140px; left:140px;
width:20px; height:20px;
background-color:black;
}
JavaScript:
var pane = $('#pane'),
box = $('#box'),
w = pane.width() - box.width(),
d = {},
x = 3;
function newv(v,a,b) {
var n = parseInt(v, 10) - (d[a] ? x : 0) + (d[b] ? x : 0);
return n < 0 ? 0 : n > w ? w : n;
}
$(window).keydown(function(e) { d[e.which] = true; });
$(window).keyup(function(e) { d[e.which] = false; });
setInterval(function() {
box.css({
left: function(i,v) { return newv(v, 37, 39); },
top: function(i,v) { return newv(v, 38, 40); }
});
}, 20);
explicaciones variables:
w
- la máxima izquierda/superior valor que el cuadro puede tener (para mantenerse dentro de los límites)
x
- la distancia (en px) que se mueve el cuadro en cada intervalo
d
- este objeto almacena la información sobre qué tecla se está presionando. Por ejemplo, mientras el usuario mantiene presionada la tecla FLECHA IZQUIERDA, d['37']
es true
. De lo contrario, es false
. Por cierto, 37
es el código de tecla para la tecla FLECHA IZQUIERDA y este valor se almacena en la propiedad e.which
del objeto de evento. El objeto d
se está actualizando en cada evento keydown
y keyup
.
Un setInterval que se ejecuta cada 20 ms, actualiza las propiedades CSS izquierda y superior del elemento box. Los nuevos valores se calculan a través de la función newv
.
La función newv
calculará el nuevo valor a la izquierda/arriba basado en a) el valor anterior v
yb) el objeto d
.
La expresión n < 0 ? 0 : n > w ? w : n
asegura que el nuevo valor está en los límites permitidos (que son 0 to w
). Si n es < 0, se devolverá cero. Si n es> w, se devolverá w.
Actualización: Este código tiene la misma funcionalidad que el código original anterior. La única diferencia es que utilicé nombres más significativos para mis variables y argumentos. Como puede ver, se ve horrible: la versión original es claramente mejor. :P
var pane = $('#pane'),
box = $('#box'),
maxValue = pane.width() - box.width(),
keysPressed = {},
distancePerIteration = 3;
function calculateNewValue(oldValue, keyCode1, keyCode2) {
var newValue = parseInt(oldValue, 10)
- (keysPressed[keyCode1] ? distancePerIteration : 0)
+ (keysPressed[keyCode2] ? distancePerIteration : 0);
return newValue < 0 ? 0 : newValue > maxValue ? maxValue : newValue;
}
$(window).keydown(function(event) { keysPressed[event.which] = true; });
$(window).keyup(function(event) { keysPressed[event.which] = false; });
setInterval(function() {
box.css({
left: function(index ,oldValue) {
return calculateNewValue(oldValue, 37, 39);
},
top: function(index, oldValue) {
return calculateNewValue(oldValue, 38, 40);
}
});
}, 20);
1) Crear HTML y CSS con posición absoluta 'div'. 2) Se presionan las teclas de flecha de seguimiento. 3) Cambie las propiedades CSS 'top' y' left' de div según corresponda. ¿Con cuál de estos tienes problemas? – Phrogz
Número 2 porque no sé cómo puedo vincular las teclas de flecha a un div – Opoe
Has publicado un ejemplo en tu pregunta ... con código ... ¿qué necesitas de nosotros? – Rabbott