2013-05-05 17 views
5

Also ich habe ein div Sie bewegen sich mit Ihren Pfeiltasten, aber wie kann ich es so machen, dass es nicht außerhalb der "Grenze div" gehen kann?Wie man ein bewegliches Div in einem externen div beschränkt?

$(document).ready(function(){ 
    $(document).keydown(function(e) { 
     switch (e.which) { 
     case 37: // Left 
     $("#cube").css("left", $("#cube").offset().left - 101); 
     break; 
     case 38: // Up 
     $("#cube").css("top", $("#cube").offset().top - 11); 
     break; 
     case 39: // Right 
     $("#cube").css("left", $("#cube").offset().left - 97); 
     break; 
     case 40: // Down 
     $("#cube").css("top", $("#cube").offset().top - 7); 
     break; 
     } 
    }); 
}); 

http://jsfiddle.net/SfKHN/

+2

Ihr Code sauberer sein und laufen schneller, wenn Sie eine globale verwenden: var $ cube = $ ("# Würfel"); –

+0

@ user2291675 Ich habe eine Lösung zu Ihrem Problem hinzugefügt, werfen Sie einen Blick? – PSL

Antwort

0

Sie einfach hinzufügen, wenn Aussagen sicher, dass Sie nicht über die Grenze passiert haben zu machen. Hier ein Beispiel:

$(document).ready(function(){ 
    $(document).keydown(function(e) { 
     switch (e.which) { 

      case 38: // Up 
       if(($("#cube").offset().top - 11) >= 0) 
        $("#cube").css("top", $("#cube").offset().top - 11); 
       break; 

      case 40: // Down 
       if(($("#cube").offset().top - 7) < (400 - 50)) 
        $("#cube").css("top", $("#cube").offset().top - 7); 
       break; 
     } 
    }); 
}); 

Sie ähnliche Änderungen nach links machen würde und rechts Pfeile

0
$(document).ready(function() { 
    var $out = $('#outside'), 
     w  = $out.width(), 
     $cube = $('#cube'), 
     cw = $cube.outerWidth(); 

    $(document).up(function (e) { 
     switch (e.which) { 
      case 37: 
       $cube.css('left', function (_, left) { 
        left = parseInt(left, 10); 
        if (left !== 0) return left - cw; 
       }); 
       break; 
      case 38: 
       $cube.css('top', function (_, top) { 
        top = parseInt(top, 10); 
        if (top !== -1) return top - cw; 
       }); 
       break; 
      case 39: 
       $cube.css('left', function (_, left) { 
        left = parseInt(left, 10); 
        if (left + cw < w) return left + cw; 
       }); 
       break; 
      case 40: 
       $cube.css('top', function (_, top) { 
        top = parseInt(top, 10); 
        if (top !== 349) return top + cw; 
       }); 
       break; 
     } 
    }); 
}); 

http://jsfiddle.net/QmBNC/

2

Hier gehen Sie: - ich in FF und Chrome getestet und scheint zu sein, fein ....

Demo

Wahrscheinlich ist das nicht ganz perfekt, aber Sie können darauf aufbauen. Der Schlüssel hier ist, die Ränder des Elternteils richtig zu bekommen und sicherzustellen, dass der Würfel links/rechts/oben/unten nicht darüber hinausgeht. Die Rahmenbreite sollte ebenfalls berücksichtigt werden. Eine andere Sache ist Ihr Schritt ein Vielfaches seiner Breite/Höhe sein sollte (wie es ein Quadrat)

$(document).ready(function(){ 
    $(document).keydown(function(e) { 
     var cube = $("#cube"); 
     var leftMargin = 0; 
     var rightMargin = $('#outside').position().left + $('#outside').width() - cube.width(); 
     var topMargin =0; 
     var bottomMargin = $('#outside').position().top + $('#outside').height() - cube.height(); 
     switch (e.which) { 
     case 37: // Left 
       var newLeft = parseInt(cube.position().left - 50); 
       if(leftMargin <= newLeft) 
       { 
        cube.css("left", newLeft); 
       } 
      break; 
     case 38: // Up 
       var newTop = parseInt(cube.position().top - 50); 
       if(topMargin <= newTop) 
       { 
        cube.css("top",newTop); 
       } 
      break; 
     case 39: // Right 
       var newRight = (cube.position().left + 50); 
       if(rightMargin > newRight) 
       { 
        cube.css("left", newRight); 
       } 
      break; 
     case 40: // Down 
       var newBottom = parseInt(cube.position().top + 50); 
       if(bottomMargin > newBottom) 
       { 
        cube.css("top", newBottom); 
       } 
      break; 
     } 
    }); 
}); 
+0

Das funktioniert bei Firefox nicht richtig. – undefined

+1

+1 für diesen ausgezeichneten Code. – Christian

+0

@undefined nicht sicher, ich habe FF20 und es scheint gut zu funktionieren .. – PSL