views:

28

answers:

1

Hello,

i'm trying to the authorize to drag out an object only on the right or bottom side of his containment and cannot do it properly whitout stop dragging the element.

My code:

<!DOCTYPE html>
<html>
<head>
  <style>
  #parent { height: 500px; width: 500px; border: 1px black solid; }
  #images { height: 100px; width: 100px; background-color:orange; }
  </style>
  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.js"&gt;&lt;/script&gt;
  <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.5/jquery-ui.js"&gt;&lt;/script&gt;
</head>
<body>
<div id="parent">
    <div id="images"></div>
</div>
<script>
$(document).ready(function() {
    $("#images").draggable({
        containment: $("#parent"),
        drag: function(event, ui) {
            var helper = ui.helper, pos = ui.position;
            if(pos.left + parseInt(helper.outerWidth(), 10) == parseInt($("#parent").css("width"), 10)) {
                $("#parent").animate({width: "+=100"});
            }
            if(pos.top + parseInt(helper.outerHeight(), 10) == parseInt($("#parent").css("height"), 10)) {
                $("#parent").animate({height: "+=100"});
            }
        }
    });
});
</script>
</body>
</html>

Have you an idea how about refreshing the containment size in order to continue dragging on the right or bottom side ?

Thanks !

+1  A: 

Simple solution (see DEMO):

<!DOCTYPE html>
<html>
<head>
  <style>
  #parent { height: 300px; width: 300px; border: 1px black solid; position: relative; left: 0; }
  #images { height: 100px; width: 100px; background-color:orange; }
  </style>
  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.js"&gt;&lt;/script&gt;
  <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.5/jquery-ui.js"&gt;&lt;/script&gt;
</head>
<body>
<div id="parent">
    <div class="container">
        <div id="images"></div>
    </div>
</div>
<script>
$(document).ready(function() {
    var
        $document = $(document),
        $parent = $("#parent"),
        $container = $(".container", $parent),
        offset = $container.offset(),
        scrollbarSafety = 15; // use this to avoid dragging outside of window, thus creating scrollbars and wreaking all kinds of havoc on draggables containment checks

    $container
        .width($document.width() - offset.left - scrollbarSafety)
        .height($document.height() - offset.top - scrollbarSafety);

    $("#images")
            .draggable(
            {
                containment: $container,
                drag:
                    function(event, ui)
                    {
                        var
                            $draggee = $(this),
                            draggeePosition = $draggee.position(),
                            shouldWidth = draggeePosition.left + $draggee.width(),
                            shouldHeight = draggeePosition.top + $draggee.height();
                        if($parent.width() < shouldWidth)
                        {
                            $parent.width(shouldWidth);
                        }
                        if($parent.height() < shouldHeight)
                        {
                            $parent.height(shouldHeight);
                        }
            }
            }
        );
});
</script>
</body>
</html>
Thomas