编程语言
首页 > 编程语言> > javascript – 无法在模态弹出窗口内交换时定位元素

javascript – 无法在模态弹出窗口内交换时定位元素

作者:互联网

我在模态弹出窗口中有两个可拖动的div,当我拖放时,div的位置在动画期间会下降.我无法将其排除.

HTML

<title>
  Swapping of tiles with Animation</title>

<body>
  <button type="button" class="btn btn-info btn-lg" data-toggle="modal" data-target="#myModal">Open Modal</button>

  <!-- Modal -->
  <div id="myModal" class="modal fade" role="dialog">
    <div class="modal-dialog">

      <!-- Modal content-->
      <div class="modal-content">
        <div class="modal-header">
          <button type="button" class="close" data-dismiss="modal">&times;</button>
          <h4 class="modal-title">Modal Header</h4>
        </div>
        <div class="modal-body">
          <p>Some text in the modal.</p>
          <div class='droppable'>
            <div class="draggable">Draggable 1</div>
          </div>
          <div class='droppable'>
            <div class="draggable">Draggable 2</div>
          </div>
        </div>
        <div class="modal-footer">
          <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
        </div>
      </div>

    </div>
  </div>

JavaScript的

$(document).ready(function() {
  window.startPos = window.endPos = {};

  makeDraggable();

  $('.droppable').droppable({
    hoverClass: 'hoverClass',
    drop: function(event, ui) {
      var $from = $(ui.draggable),
        $fromParent = $from.parent(),
        $to = $(this).children(),
        $toParent = $(this);

      window.endPos = $to.offset();

      swap($from, $from.offset(), window.endPos, 200);
      swap($to, window.endPos, window.startPos, 1000, function() {
        $toParent.html($from.css({
          position: 'relative',
          left: '',
          top: '',
          'z-index': ''
        }));
        $fromParent.html($to.css({
          position: 'relative',
          left: '',
          top: '',
          'z-index': ''
        }));
        makeDraggable();
      });
    }
  });

  function makeDraggable() {
    $('.draggable').draggable({
      zIndex: 99999,
      revert: 'invalid',
      start: function(event, ui) {
        window.startPos = $(this).offset();
      }
    });
  }

  function swap($el, fromPos, toPos, duration, callback) {
    $el.css('position', 'absolute')
      .css(fromPos)
      .animate(toPos, duration, function() {
        if (callback) callback();
      });
  }
});

Fiddle Here

解决方法:

将元素的位置值更改为绝对值并且希望将其置于同一位置时,应使用.position()而不是.offset().

由于您将元素的位置更改为绝对,因此您正在处理positioned element(即“计算的位置属性为相对,绝对,固定或粘性的元素”).当您设置定位元素的top css属性时,您指定“元素的上边距边缘与其包含块的上边缘之间的距离”(不是文档的上边缘).包含块是最接近的祖先,也是定位元素. JQuery将包含块称为offset parent.

.offset()函数获取元素“相对于文档”的坐标时,.position()函数获得“相对于偏移父元素”的坐标.

您要动画的元素的偏移父级是具有“modal-body”类的元素. (它是最接近的祖先,它是一个定位元素.它的位置值是相对的.)你实际上并不需要确定偏移的父级,因为.position()函数将为你确定它.

jsfiddle

这个jsfiddle与原始的相同,除了每次调用.offset()都被替换为.position().

标签:jquery,javascript,css,jquery-ui,jquery-ui-draggable
来源: https://codeday.me/bug/20190608/1199265.html