I am trying to jQuery UI sortable work with zoom CSS property on body. But it's not allowing me to drag and drop correctly on the right position.
Drag only working with half area, if user try to drag and drop from empty area on right side(Black area in my case) it's not working
https://codepen.io/VijayDhanvai/pen/poqxEzQ
Red area where drop not working

$(function () {
var zoomScale = $("body").css("zoom");
console.log(typeof zoomScale, zoomScale.toString());
var canvasHeight = $("#sortable").height();
var canvasWidth = $("#sortable").width();
$("#sortable").sortable({
sort: function (e, ui) {
var changeLeft = ui.position.left - ui.originalPosition.left;
var changeTop = ui.position.top - ui.originalPosition.top;
var sortIndex =
$("#sortable .ui-sortable-placeholder").index() + 30;
var newLeft =
ui.originalPosition.left +
changeLeft / zoomScale -
ui.item.parent().offset().left;
var newTop =
ui.originalPosition.top +
changeTop / zoomScale -
ui.item.parent().offset().top +
sortIndex;
ui.helper.css({
left: newLeft,
top: newTop,
});
},
});
});
$(function () {
var zoomScale = $("body").css("zoom");
console.log(typeof zoomScale, zoomScale.toString());
var canvasHeight = $("#sortable").height();
var canvasWidth = $("#sortable").width();
$("#sortable").sortable({
sort: function (e, ui) {
var changeLeft = ui.position.left - ui.originalPosition.left;
var changeTop = ui.position.top - ui.originalPosition.top;
var sortIndex =
$("#sortable .ui-sortable-placeholder").index() + 30;
var newLeft =
ui.originalPosition.left +
changeLeft / zoomScale -
ui.item.parent().offset().left;
var newTop =
ui.originalPosition.top +
changeTop / zoomScale -
ui.item.parent().offset().top +
sortIndex;
ui.helper.css({
left: newLeft,
top: newTop,
});
},
});
});
.ui-sortable-placeholder,
.ui-sortable-helper {
visibility: visible !important;
background-color: black !important;
}
.ui-sortable-placeholder td,
.ui-sortable-helper td {
background-color: aqua;
}
table {
/* width: 100%; */
border-spacing: collapse;
border-spacing: 0;
}
td {
padding: 0px;
min-width: 100%;
border: solid 1px #ddd;
}
body {
zoom: 1.3;
}
<link rel="stylesheet" href="http://code.jquery.com/ui/1.9.2/themes/base/jquery-ui.css" />
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js"></script>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.10/jquery-ui.min.js"></script>
<script type="text/javascript" src="https://github.com/borbit/jquery.viewport/raw/master/jquery.viewport.js"></script>
<script type="text/javascript" src="https://github.com/borbit/jquery.scraggable/raw/master/jquery.scraggable.js"></script>
<table>
<thead>
<tr>
<th>Month</th>
<th>Savings</th>
</tr>
</thead>
<tbody id="sortable">
<tr>
<td>January</td>
<td>$100</td>
</tr>
<tr>
<td>February</td>
<td>$80</td>
</tr>
<tr>
<td>January</td>
<td>$100</td>
</tr>
<tr>
<td>February</td>
<td>$80</td>
</tr>
<tr>
<td>January</td>
<td>$100</td>
</tr>
<tr>
<td>February</td>
<td>$180</td>
</tr>
</tbody>
</table>
Possible Causes
The behavior of jQuery UI
sortableis comparing the mouse position with the element offsets. However, It seems that offset values of children elements won't be affected byzoomif settingzoomon a parent element. (Safari CSS Reference has mentioned it slightly.)By the way, according to Mozilla document of zoom, CSS
zoomis non-standard. It means it has possibility of different behaviors in variable browsers. If it's possible, try not to use CSSzoom.Solution: nested zooming
In your case, it works well to get the width after zooming if
zoomset on<td>. So I try to set nestedzoomto simulate the view of settingzoomon<body>:If you do above, you don't have to calculate
helperelement by yourself:Here is demo: https://codepen.io/LyreneLiu/pen/PoXyQYx