【问题标题】:Unable to position the elements while swapping inside a modal popup在模式弹出窗口内交换时无法定位元素
【发布时间】:2016-08-31 10:35:31
【问题描述】:

我在一个模态弹出窗口中有两个可拖动的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

【问题讨论】:

    标签: javascript jquery css jquery-ui jquery-ui-draggable


    【解决方案1】:

    当您将元素的position 值更改为absolute 并且您希望将其定位在同一位置时,您应该使用.position() 而不是.offset()

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

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

    您正在制作动画的元素的偏移父级是具有“modal-body”类的元素。 (它是最接近的祖先元素,它是定位元素。它的 position 值为 relative。)您实际上并不需要确定偏移父节点,因为 .position() 函数将为您确定它。

    jsfiddle

    这个 jsfiddle 和原来的一样,除了对 .offset() 的每个调用都被替换为对 .position() 的调用。

    【讨论】:

    • 它运行良好,我也检查了 IE11 浏览器
    • 一点点视觉改进,至少对于 Chrome 和 FF,可以添加属性cursor: grabcursor: grabbing 让用户知道它是一个可拖动元素。 demo
    • @John S 谢谢你很晚才回复
    • @RicardoRuiz 很棒的改进。谢谢,我正在使用它。
    【解决方案2】:

    将位置从绝对更改为固定。

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

    【讨论】:

    • 仍然不能完美交换。
    【解决方案3】:

    不确定这是否是您正在寻找的东西,但这是一个选项(尽管是一个 hacky 选项)。

    我尝试了解问题的根本原因,但无法做到,因此想到了一个解决问题的方法。 用这个改变你的功能交换。

     function swap($el, fromPos, toPos, duration, callback) {
    
    $el.css('position', 'fixed')
      .css(fromPos)
      .css('margin-top','-10px')
      .animate(toPos, duration, function() {
        if (callback) callback();       
        $el.css('margin-top','0px');
      });
    

    }

    另一个建议,增加第一阶段的动画持续时间。 像这样swap($from, $from.offset(), window.endPos, 1000);

    【讨论】:

      猜你喜欢
      • 2022-01-04
      • 1970-01-01
      • 2018-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-09
      • 1970-01-01
      • 2018-12-12
      相关资源
      最近更新 更多