【问题标题】:make bootstrap twitter dialog modal draggable使引导 twitter 对话框模式可拖动
【发布时间】:2012-09-16 07:40:10
【问题描述】:

我正在尝试使用这个 jquery 插件使引导 twitter 对话框模式可拖动:

http://threedubmedia.com/code/event/drag#demos

但它不起作用。

var $div = $('html');
console.debug($('.drag'));
$('#modalTest')
    .drag("start", function(ev, dd) {
        dd.limit = $div.offset();
        dd.limit.bottom = dd.limit.top + $div.outerHeight() - $(this).outerHeight();
        dd.limit.right = dd.limit.left + $div.outerWidth() - $(this).outerWidth();
    })
    .drag(function(ev, dd) {
        $(this).css({
            top: Math.min(dd.limit.bottom, Math.max(dd.limit.top, dd.offsetY))
            , left: Math.min(dd.limit.right, Math.max(dd.limit.left, dd.offsetX))
        });
    }); 

你知道我该怎么做吗?

【问题讨论】:

标签: jquery twitter-bootstrap modal-dialog draggable


【解决方案1】:
$("#myModal").draggable({
    handle: ".modal-header"
}); 

它对我有用。我是从there 那里得到的。如果你感谢我,请给Andres Ilich70%

【讨论】:

  • 你必须包含 jquery.ui,因为可拖动的功能来自那里。 :)
  • 这种方式实现了拖拽工作,但是问题很大。
  • 我遇到的错误之一是溢出。当我在模态框周围拖动时,会显示一个滚动条。我在模态框上将溢出设置为隐藏。
  • 使用 jQuery UI 和 bootstrap 对我来说效果很好
  • @IdahoB 的答案对我来说效果更好,没有奇怪的拖动工件stackoverflow.com/a/39126290/2283261
【解决方案2】:

如果您不想使用 jQuery UI 或任何第三方插件,可以使用下面的代码。它只是简单的 jQuery。

此答案适用于 Bootstrap v3.x 。对于版本 4.x,请参阅下面的@User 评论

$(".modal").modal("show");

$(".modal-header").on("mousedown", function(mousedownEvt) {
    var $draggable = $(this);
    var x = mousedownEvt.pageX - $draggable.offset().left,
        y = mousedownEvt.pageY - $draggable.offset().top;
    $("body").on("mousemove.draggable", function(mousemoveEvt) {
        $draggable.closest(".modal-dialog").offset({
            "left": mousemoveEvt.pageX - x,
            "top": mousemoveEvt.pageY - y
        });
    });
    $("body").one("mouseup", function() {
        $("body").off("mousemove.draggable");
    });
    $draggable.closest(".modal").one("bs.modal.hide", function() {
        $("body").off("mousemove.draggable");
    });
});
.modal-header {
    cursor: move;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>

<div class="modal fade" tabindex="-1" role="dialog">
  <div class="modal-dialog" role="document">
    <div class="modal-content">
      <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
        <h4 class="modal-title">Modal title</h4>
      </div>
      <div class="modal-body">
        <p>One fine body&hellip;</p>
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
        <button type="button" class="btn btn-primary">Save changes</button>
      </div>
    </div><!-- /.modal-content -->
  </div><!-- /.modal-dialog -->
</div>

【讨论】:

  • 最佳答案。解决方案不依赖jQuery-ui。
  • 这可行,但在引导程序 4 中,当您开始拖动时,对话框会跳动一点。我将$draggable.closest(".modal-dialog").offset... 更改为$draggable.closest(".modal-content").offset...,现在它可以正常工作了。
【解决方案3】:

排名靠前的解决方案(由 Mizbah Ahsan 提出)不太正确……但很接近。如果您将 draggable() 应用于模态对话框元素,浏览器窗口滚动条将在您拖动模态对话框时在屏幕上拖动。解决这个问题的方法是将 draggable() 应用于 modal-dialog 类:

$(".modal-dialog").draggable({
    handle: ".modal-header"
});

谢谢!

【讨论】:

  • 您的解决方案完美运行,是我找到的最好的解决方案。
  • 不拖动滚动条的绝妙解决方法。我一直在寻找这样的解决方案。
【解决方案4】:

正如其他人所说,最简单的解决方案是在显示模态后从 jQuery UI 调用 draggable() 函数:

$('#my-modal').modal('show')
              .draggable({ handle: ".modal-header" });

但是 BootstrapjQuery UI 之间的兼容性存在一些问题,因此我们需要在 css 中进行一些附加修复:

.modal
{
    overflow: hidden;
}
.modal-dialog{
    margin-right: 0;
    margin-left: 0;
}
.modal-header{      /* not necessary but imo important for user */
    cursor: move;
}

【讨论】:

  • 这非常适合拖动,但模态框会在屏幕的左边距打开。
【解决方案5】:

使用可拖动的jquery UI,简单多了 http://jqueryui.com/draggable/

【讨论】:

    【解决方案6】:

    我这样做了:

    $("#myModal").modal({}).draggable();
    

    它使我非常标准/基本的模态可拖动。

    不确定它是如何/为什么起作用的,但确实如此。

    【讨论】:

    • 您可以向单个 jquery 选择添加大量选项和事件。在可拖动之后执行 .hide() 它将隐藏。我认为您不需要模态选项中的括号。
    【解决方案7】:

    对于鼠标光标(使用 jQuery UI):

    $('#my-modal').draggable({
        handle: ".modal-header"
    });
    

    对于触摸光标(使用 jQuery):

    var box = null;
    var touchobj = null;
    var position = {'x':0, 'y':0};
    var positionbox = {'x':0, 'y':0};
    
    // init touch
    $('.modal-header').on('touchstart', function(e){
        box = $(this).closest('.modal-dialog');
        touchobj = e.changedTouches[0];
    
        // take position touch cursor
        position['x'] = touchobj.pageX;
        position['y'] = touchobj.pageY;
    
        //take original position box to move with touch
        positionbox['x'] = parseInt(box.css('left'));
        positionbox['y'] = parseInt(box.css('top'));
    
        e.preventDefault();
    });
    
    // on move touch
    $('.modal-header').on('touchmove', function(e){
        var dist = {'x':0, 'y':0};
        touchobj = e.changedTouches[0];
    
        // we calculate the distance of move
        dist['x'] = parseInt(touchobj.clientX) - position['x'];
        dist['y'] = parseInt(touchobj.clientY) - position['y'];
    
        // we apply the movement distance on the box
        box.css('left', positionbox['x']+dist['x'] +"px");
        box.css('top', positionbox['y']+dist['y'] +"px");
    
        e.preventDefault();
    });
    

    2种方案的添加是兼容的

    【讨论】:

      【解决方案8】:

      在我自己的情况下,我必须先设置backdrop 并设置topleft 属性,然后才能在模态对话框上应用draggable 函数。也许它可能会帮助某人;)

      if (!($('.modal.in').length)) {       
      $('.modal-dialog').css({
           top: 0,
           left: 0
         });
      }
      $('#myModal').modal({
        backdrop: false,
         show: true
      });
      
      $('.modal-dialog').draggable({
        handle: ".modal-header"
      });
      

      【讨论】:

        【解决方案9】:

        在我的情况下,我启用了可拖动。它有效。

        var bootstrapDialog = new BootstrapDialog({
            title: 'Message',
            draggable: true,
            closable: false,
            size: BootstrapDialog.SIZE_WIDE,
            message: 'Hello World',
            buttons: [{
                 label: 'close',
                 action: function (dialogRef) {
                     dialogRef.close();
                 }
             }],
        });
        bootstrapDialog.open();
        

        也许对你有帮助。

        【讨论】:

          【解决方案10】:

          您可以使用 jQuery UI 只需将 jquery UI 链接到您的项目。移除引导程序在“modal-content”元素上给出的过渡需要一点 css。

          <script src="https://code.jquery.com/ui/1.11.3/jquery-ui.min.js"></script>
          <link rel="stylesheet" href="https://code.jquery.com/ui/1.11.3/themes/smoothness/jquery-ui.css"/>
          <style>
              .modal.fade.ui-draggable-dragging {
                  -moz-transition: none;
                  -o-transition: none;
                  -webkit-transition: none;
                  transition: none;
              }
          </style>
          <script>
              $('.modal-content').resizable({
                  minHeight: 300,
                  minWidth: 300
              });
              $('.modal-dialog').draggable();
          </script>
          

          【讨论】:

            猜你喜欢
            • 2012-05-13
            • 2021-06-15
            • 2013-01-18
            • 1970-01-01
            • 1970-01-01
            • 2012-04-11
            • 1970-01-01
            • 2016-04-16
            • 1970-01-01
            相关资源
            最近更新 更多