Zoom drag problem
When the container is zoomed a drag operation on the container jumps on the first muse move.
Open the page, then try a drag operation. The first one usually works OK. Subsequent ones jump when tried. Repeatable on Chrome and IE9.
Use 'r' to reset the zoom to 1.0 and the container drag works correctly.
HTML
<!-- Create an area where we will allow items to be moved -->
<div id=mycontainer>Press '+' to zoom in, '-' to zoom out, 'r' to reset.
<br>This pane is draggable
<!-- create a couple of boxes -->
<div class="mybox" id="source">Draggable</div>
<div class="mybox" id="dest">Draggable</div>
</div>
CSS
#mycontainer {
width: 600px;
height: 400px;
background: #ddd;
position: absolute;
top: 0;
left: 0;
float: none;
border: solid 1px;
}
.mybox {
position: absolute;
background: #fff;
border: 1px solid;
border-radius: 6px;
width: 100px;
height: 75px;
float: none;
text-align: center;
}
#source {
top: 50px;
left: 100px;
}
#dest {
top: 100px;
left: 250px;
}
body {
margin: 0px;
/* force mycontainer to edge */
overflow: hidden;
/* no scrolling of body area. Clip the contents if moved */
}
JavaScript
// global to set the zoomscale
zoomScale = 1;
// Set the zoom scale
var setZoomScale = function (zoom) {
zoomScale = zoom;
var container = $("#mycontainer");
var scaleval = 'scale(' + zoom + ',' + zoom + ')';
container.css('-ms-transform', scaleval);
container.css('-webkit-transform', scaleval);
container.css('transform', scaleval);
}
// Make the boxes draggable
// apply the stackoverflow fix
$("#source, #dest").draggable({
start: function (event, ui) {
ui.position.left = 0;
ui.position.top = 0;
},
drag: function (event, ui) {
// drag handle fix
var changeLeft = ui.position.left - ui.originalPosition.left; // find change in left
var newLeft = ui.originalPosition.left + changeLeft / ((zoomScale)); // adjust new left by our zoomScale
var changeTop = ui.position.top - ui.originalPosition.top; // find change in top
var newTop = ui.originalPosition.top + changeTop / zoomScale; // adjust new top by our zoomScale
ui.position.left = newLeft;
ui.position.top = newTop;
}
});
// make the virtual window draggable
// apply the stackoverflow fix
$("#mycontainer").draggable({
start: function (event, ui) {
ui.position.left = 0;
ui.position.top = 0;
},
drag: function (event, ui) {
// drag handle fix
var changeLeft = ui.position.left - ui.originalPosition.left; // find change in left
var newLeft = ui.originalPosition.left + changeLeft / ((zoomScale)); // adjust new left by our zoomScale
var changeTop = ui.position.top - ui.originalPosition.top; // find change in top
var newTop = ui.originalPosition.top + changeTop / zoomScale; // adjust new top by our zoomScale
ui.position.left = newLeft;
ui.position.top = newTop;
},
stop: function (event, ui) {}
});
// add a keypress handler so we can change the zoom
$(document).keypress(function (ev) {
var key =...