【问题标题】:Bootstrap 3 modal: make it movable/draggable without jquery-uiBootstrap 3 modal:在没有 jquery-ui 的情况下使其可移动/可拖动
【发布时间】:2017-12-24 22:30:44
【问题描述】:

我正在尝试开发一些东西:

  • 在没有 jquery-ui 的情况下在窗口上制作可拖动/可移动的引导模式

我使用backbone.js,但我认为这不是那么重要。在一段代码中,我定义了我的引导模式:

<div id="detailsContainer">
<div class="modal fade" id="someId" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
<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" id="myModalLabel"><span class="glyphicon glyphicon-cloud-upload" aria-hidden="true"></span> Some Title</h4>
        </div>
        <div class="modal-body" id="content">

            <form class="form-horizontal" role="form" id="modalFormBody">
                ... some content
            </form>    

        </div>
        <div class="modal-footer">
            <div class="pull-right" id="modalButtonBar">
                <button type="button" class="btn btn-default control-button" data-dismiss="modal">Close</button>
                <button type="button" class="btn btn-primary control-button" id="addButton">Add</button>
            </div>                  
        </div>
    </div>
</div>

现在,当我尝试使用以下代码设置模式可拖动时:

 var $container = $("#detailsContainer");
 $container.on('mousedown', 'div', function() {
            $(this).addClass('draggable').parents().on('mousemove', function(e) {
                $('.draggable').offset({
                    top: e.pageY - $('.draggable').outerHeight() / 2,
                    left: e.pageX - $('.draggable').outerWidth() / 2
                }).on('mouseup', function() {
                    $(this).removeClass('draggable');
                });
            });
            e.preventDefault();
        }).on('mouseup', function() {
            $('.draggable').removeClass('draggable');
        });

行为很奇怪:

  • 当我拿起模态框时,模态框会跳出窗口。我试图修复将一些值更改为顶部和左侧,但没有什么是好的。
  • 当我选择模态体的一些下元素(例如输入文本)时,我可以在模态中移动输入文本。但我不要这个!我只希望整个模态可以拖动/移动。

上面的例子是我在stackoverflow上找到的(抱歉我没找到上面的链接)。我还找到了一些 jquery-ui 的例子。但我不想使用它。只有jQuery。

我也尝试过:Dialog draggableJQuery Draggable Demo。但没有成功。 第一个不让我的模态可拖动,第二个我不明白如何将它与 $container

一起使用

有人可以帮我吗?

更新

        $('body').on('mousedown', '.modal-dialog', function() {
             $(this).addClass('draggable').parents().on('mousemove', function(e) {
                 $('.draggable').offset({
                     top: e.pageY - $('.draggable').outerHeight() / 2,
                     left: e.pageX - $('.draggable').outerWidth() / 2
                 }).on('mouseup', function() {
                     $(this).removeClass('draggable');
                 });
             });
             e.preventDefault();
         }).on('mouseup', function() {
             $('.draggable').removeClass('draggable');
         });

但是当我想拖动时……它会改变我在模态框上拾取它的位置。它在拐角处。不是我捡到的吗?我该如何纠正?将“.modal-dialog”放在mousedown功能上是错误的吗?如果这是错误的,我必须把它放在那里?

还有一点:我在模态体中的元素(示例下拉)不能拖动。如何排除它们?

【问题讨论】:

  • 在没有 jquery ui jsfiddle.net/tovic/mkUJf987654323@ 的情况下检查这个小提琴
  • 这个解决方案更符合我的预期。现在它们只是我在更新中添加的两件事。
  • 我对此不太满意。当您按下模态框时,它会在窗口上消失……我该如何纠正?以及如何排除输入文本(输入和文本区域)的行为?
  • 现在检查我的更新答案它已经解决了只需更改此顶部:e.pageY - $('.draggable').outerHeight() /8,左:e.pageX - $('.draggable' ).outerWidth() /8 和更新的小提琴jsfiddle.net/mkUJf/1452
  • 好吧,这不是最好的 UI 感觉......但目前它是我拥有的最好的解决方案。非常喜欢你:)

标签: javascript jquery html css twitter-bootstrap-3


【解决方案1】:

试试这个代码肯定会对你有帮助,下面的代码没有jquery ui

检查这个更新的小提琴check here

$(function() {
    $('body').on('mousedown', '#myModal', function(ev) {
        $(this).addClass('draggable').parents().on('mousemove', function(e) {
            $('.draggable').offset({
                top: e.pageY - $('.draggable').outerHeight() /8,
                left: e.pageX - $('.draggable').outerWidth() /8
            }).on('mouseup', function() {
                $(this).removeClass('draggable');
            });
        });
        ev.preventDefault();
    }).on('mouseup', function() {
        $('.draggable').removeClass('draggable');
    });
});
body {padding:50px;}

div {
  cursor:move;
}
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet"/>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
<button type="button" class="btn btn-primary btn-lg" data-toggle="modal" data-target="#myModal">
  Launch demo modal
</button>

<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
  <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" id="myModalLabel">Modal title</h4>
      </div>
      <div class="modal-body">
        <form>
          <div class="form-group">
            <label for="recipient-name" class="control-label">Recipient:</label>
            <input type="text" class="form-control" id="recipient-name">
          </div>
          <div class="form-group">
            <label for="message-text" class="control-label">Message:</label>
            <textarea class="form-control" id="message-text"></textarea>
          </div>
        </form>
      </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>
  </div>
</div>

【讨论】:

  • 第一:坦克你是你的帮助。这个解决方案给我一个错误 $(...).resizable is not a function 因为我不包括 jquery-ui。评论中的小提琴比我要找的更多。
  • 这个解决方案的问题是,无论我在哪里单击模态框,模态框都会移动,以便鼠标指针返回到左上角。我希望鼠标指针与我单击时保持相同的位置。这个问题有解决办法吗,你还在研究这个吗?
  • 演示效果不佳。当我开始移动对话框时,产生了一个丑陋的效果(对话框向右移动了一些像素,但只有在对话框开始移动时)
  • @jstuardo 你能在这里分享你的sn-p吗
  • @UdhayTitus 不是自己的 sn-p,而是您的。只需单击“运行代码 sn-p”按钮。然后单击“启动演示模式”。当模态出现时,移动鼠标直到显示移动光标。然后左键单击,最后移动对话框。您会注意到对话框在开始移动之前会跳到右侧。我在 Chrome 和 Firefox 中进行了测试。
【解决方案2】:

这个答案为时已晚,但万一有人(如我)正在寻找解决方案。最后,我的解决方案是使用以下代码:

(function ($) {
    $.fn.drags = function (opt) {

        opt = $.extend({ handle: "", cursor: "move" }, opt);

        var $el = null;
        if (opt.handle === "") {
            $el = this;
        } else {
            $el = this.find(opt.handle);
        }

        return $el.css('cursor', opt.cursor).on("mousedown", function (e) {
            var $drag = null;
            if (opt.handle === "") {
                $drag = $(this).parents('.modal-dialog').addClass('draggable');
            } else {
                $drag = $(this).parents('.modal-dialog').addClass('active-handle').parent().addClass('draggable');
            }
            var z_idx = $drag.css('z-index'),
                drg_h = $drag.outerHeight(),
                drg_w = $drag.outerWidth(),
                pos_y = $drag.offset().top + drg_h - e.pageY,
                pos_x = $drag.offset().left + drg_w - e.pageX;
            $drag.css('z-index', 1000).parents().on("mousemove", function (e) {
                $('.draggable').offset({
                    top: e.pageY + pos_y - drg_h,
                    left: e.pageX + pos_x - drg_w
                }).on("mouseup", function () {
                    $(this).removeClass('draggable').css('z-index', z_idx);
                });
            });
            e.preventDefault(); // disable selection
        }).on("mouseup", function () {
            if (opt.handle === "") {
                $(this).removeClass('draggable');
            } else {
                $(this).removeClass('active-handle').parent().removeClass('draggable');
            }
        });

    }
})(jQuery);

然后,当模态显示时:

            $('#modal').on('shown.bs.modal', function () {
                $(this).find('.card-header').drags();
            });

            $('#modal').modal({ show: true, backdrop: 'static', keyboard: false });

我在模态对话框中使用了一张卡片,其 HTML 如下:

<div id="modal" class="modal fade">
    <div class="modal-dialog modal-dialog-centered modal-lg">
        <div class="modal-content  animated bounceInRight">
            <div class="modal-body">
                <div class="card">
                    <div class="card-header border-bottom-0">My super title</div>
                    <div class="card-body">
                        <form >...</form>
                    </div>
                </div>
            </div>
            <div class="modal-footer">
                <button type="submit" class="btn btn-success" id="btnAlmacenar"><i class="fa fa-save"></i> Almacenar</button>
                <button type="button" class="btn btn-danger" data-dismiss="modal"><i class="fa fa-close"></i> Cancelar</button>
            </div>
        </div>
    </div>
</div>

如果你想尝试一下,这就是完整的 sn-p:

(function ($) {
        $.fn.drags = function (opt) {
    
            opt = $.extend({ handle: "", cursor: "move" }, opt);
    
            var $el = null;
            if (opt.handle === "") {
                $el = this;
            } else {
                $el = this.find(opt.handle);
            }
    
            return $el.css('cursor', opt.cursor).on("mousedown", function (e) {
                var $drag = null;
                if (opt.handle === "") {
                    $drag = $(this).parents('.modal-dialog').addClass('draggable');
                } else {
                    $drag = $(this).parents('.modal-dialog').addClass('active-handle').parent().addClass('draggable');
                }
                var z_idx = $drag.css('z-index'),
                    drg_h = $drag.outerHeight(),
                    drg_w = $drag.outerWidth(),
                    pos_y = $drag.offset().top + drg_h - e.pageY,
                    pos_x = $drag.offset().left + drg_w - e.pageX;
                $drag.css('z-index', 1000).parents().on("mousemove", function (e) {
                    $('.draggable').offset({
                        top: e.pageY + pos_y - drg_h,
                        left: e.pageX + pos_x - drg_w
                    }).on("mouseup", function () {
                        $(this).removeClass('draggable').css('z-index', z_idx);
                    });
                });
                e.preventDefault(); // disable selection
            }).on("mouseup", function () {
                if (opt.handle === "") {
                    $(this).removeClass('draggable');
                } else {
                    $(this).removeClass('active-handle').parent().removeClass('draggable');
                }
            });
    
        }
    })(jQuery);
    
    $(document).ready(function () {
      $('#modal').on('shown.bs.modal', function () {
                    $(this).find('.card-header').drags();
                });

                $('#modal').modal({ show: true, backdrop: 'static', keyboard: false });
    });
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.bundle.min.js"></script>
<div id="modal" class="modal fade">
        <div class="modal-dialog modal-dialog-centered modal-lg">
            <div class="modal-content  animated bounceInRight">
                <div class="modal-body">
                    <div class="card">
                        <div class="card-header border-bottom-0">My super title</div>
                        <div class="card-body">
                            <form></form>
                        </div>
                    </div>
                </div>
                <div class="modal-footer">
                    <button type="submit" class="btn btn-success" id="btnAlmacenar"><i class="fa fa-save"></i> Almacenar</button>
                    <button type="button" class="btn btn-danger" data-dismiss="modal"><i class="fa fa-close"></i> Cancelar</button>
                </div>
            </div>
        </div>
    </div>

【讨论】:

猜你喜欢
  • 2014-11-19
  • 1970-01-01
  • 2018-12-20
  • 1970-01-01
  • 2023-03-02
  • 1970-01-01
  • 2012-01-24
  • 2022-01-18
  • 1970-01-01
相关资源
最近更新 更多