我有一些代码来演示这个问题.

JSFIDDLE

我有一个可以拖动的元素,效果很好.我包含了一个按钮,允许用户"放大".这是当它出错的时候.

问题是,单击zoom 按钮后,draggablecontainment部分不再遵守父项的左/顶部/宽度和高度约束.它仍然受到限制,但受到意想不到的边界位置的限制.

<body style="padding:50px">
    <button id="btn">Zoom in</button>
    <div id="wrapper" style="background-color:aliceblue;padding:50px;">
    <div id="innerWrapper" style="background-color: ivory; min-height: 200px; width: 400px; ">
        <div id="draggable" style="background-color:burlywood;max-width:100px;">Move me</div>
        </div>
    </div>

    <script src="https://code.jquery.com/jquery-3.7.1.min.js" integrity="sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo=" crossorigin="anonymous"></script>
    <script src="https://code.jquery.com/ui/1.13.2/jquery-ui.min.js" integrity="sha256-lSjKY0/srUM9BE3dPm+c4fBo1dky2v27Gdjm2uoZaL0=" crossorigin="anonymous"></script>

    <script>
        $("#draggable").draggable({containment:"#innerWrapper"});  

        const btn = document.getElementById("btn");
        btn.addEventListener("click", zoom);

        function zoom() {
            document.getElementById("innerWrapper").style.transform = "scale(1.2,1.2)";
        }
    </script>
</body>

事实上,每次单击提供的zoom 按钮时,它都会更改包容边界.

我try 将drag event callback添加到可拖动中,但仍然无法知道如何解决这个问题

推荐答案

这种情况发生是因为scale(),它在某些组合中表现得很奇怪,其中之一是当您在容器内有一个可拖动元素时,该容器是scaled,所以里面的元素不会更新它的实际大小,即使您将可拖动元素destroydisableenable.

因此,您可以做的就是计算自己的容器尺寸:

const draggableElement = $("#draggable")
let containmentArea = $("#innerWrapper");
let percent = 1


draggableElement.draggable({
  cursor: "move",
  drag: dragFix,
});


function dragFix(event, ui) {
  var contWidth = containmentArea.width(),
    contHeight = containmentArea.height();
  ui.position.left = Math.max(0, Math.min(ui.position.left / percent, contWidth - ui.helper.width()));
  ui.position.top = Math.max(0, Math.min(ui.position.top / percent, contHeight - ui.helper.height()));
}


function setScale(scalePercentage) {
  percent = scalePercentage;
  $("#innerWrapper").css({
    'transform': 'scale(' + percent + ')',
    '-moz-transform': 'scale(' + percent + ')',
    '-webkit-transform': 'scale(' + percent + ')',
    '-ms-transform': 'scale(' + percent + ')'
  })
}


const btn = document.getElementById("btn");
btn.addEventListener("click", function() {
  setScale(1.2)
});
#wrapper {
  width: 100%;
  height: 300px;
  overflow: auto;
}

#innerWrapper {
  width: 250px;
  height: 250px;
  position: relative;
  -webkit-transform-origin: 0 0;
  -moz-transform-origin: 0 0;
  transform-origin: 0 0;
  -ms-transform-origin: 0 0;
}

#draggable {
  display: inline;
  position: absolute;
  top: 10px;
  left: 10px;
}
<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js"></script>

<button id="btn">Zoom in</button>
<div id="wrapper" style="background-color:aliceblue;padding:50px;">
  <div id="innerWrapper" style="background-color: ivory; min-height: 200px; width: 400px; ">
    <div id="draggable" style="background-color:burlywood;max-width:100px;">Move me</div>
  </div>
</div>

Fiddle Version

Notes:

1 -您只能使用tranformtransform-only,我这样做是为了表明您可以使用所有transform种类型

2 -为了在单击可拖动元素时不会出现故障,您需要将其设置为absolute和包装器relative

Jquery相关问答推荐

在正则表达式字符括号中包含连字符?

确定元素是否是其父元素的最后一个子元素

如何在 jquery 中从这个日期减go 一周?

jQuery scrollTop 在 Chrome 中不工作但在 Firefox 中工作

模态窗口中的 Twitter Bootstrap Datepicker

删除索引后的所有项目

为什么找不到我的 json 文件?

如何使用jQuery在弹出窗口中预览输入类型=文件中的选定图像?

如何将数组传递给 jQuery .data() 属性

JQuery Ajax Post 导致 500 内部服务器错误

判断复选框是否未选中单击 - jQuery

jQuery $(".class").click(); - 多个元素,点击事件一次

Url.Action 在我的 url 中放了一个 &,我该如何解决这个问题?

如何使用 jQuery 删除 cookie?

从客户端的对象数组中获取最新日期的优雅方法是什么?

jQuery位置href

jQuery - 从元素内部 Select 元素

如何在 ReactJS 中使用 JQuery

jquery ui Dialog:无法在初始化之前调用对话框上的方法

为什么我应该创建异步 WebAPI 操作而不是同步操作?