Hey there, I have a page with the jQuery Draggable() enabled on #person
and that #person
is constrained to #map
.
(link to plugin:
Unfortunately, jQuery UI Draggable doesn't expose any methods to manually change the element's position. You will have to track the #person's position manually when moving it with the keyboard, and stop moving it when it is about to exceed the bounds of the #map.
You can use jQuery methods such as .offset() and .position() methods to find reliable positions for elements.
For instance:
$(document).bind(
'keydown',
function(event) {
switch(event.which) {
case 37: {
var character = $(characterName);
var map = $('#map');
if((character.offset().left - 40) > map.offset().left) {
character.animate(
{
left: '-=40'
},
250,
function(){}
);
}
break;
}
}
}
);
If someone feels a bit lazy, this is what I just coded (simplified):
$('body').on('keypress', handleKeys);
function handleKeys(e) {
var position,
draggable = $('#draggable'),
container = $('#container'),
distance = 1; // Distance in pixels the draggable should be moved
position = draggable.position();
// Reposition if one of the directional keys is pressed
switch (e.keyCode) {
case 37: position.left -= distance; break; // Left
case 38: position.top -= distance; break; // Up
case 39: position.left += distance; break; // Right
case 40: position.top += distance; break; // Down
default: return true; // Exit and bubble
}
// Keep draggable within container
if (position.left >= 0 && position.top >= 0 &&
position.left + draggable.width() <= container.width() &&
position.top + draggable.height() <= container.height()) {
draggable.css(position);
}
// Don't scroll page
e.preventDefault();
}