1

我有一个 Bootstrap 模态,我只想在可见的窗口屏幕内拖动它(不要让模态消失)。

我的两个问题是:

  1. 第一次拖动时没有设置遏制,模型可以离开可见窗口。
  2. 要按下的第一个模态打开按钮(随机-不是按屏幕位置)模态被很好地拖动并且包含正在工作,第二个模态打开按钮被按下,模态没有被很好地拖动并消失。

下面是一个简单的 Demo,包含一个可拖动的 Modal 和两个用于打开此 modal 的按钮。一个在顶部,一个在底部。

$(document).ready(function () {
            $('.modal').find('.modal-dialog:first').draggable().css({
                    "position": "absolute",
                    "top": "25%",
                    "left": "37.5%"
                });

            $('.modal').find('.modal-dialog:first').draggable({
                scroll: false,
                //handle: '.modal-header',          
                start: function (e) {
                    const draggable = $(this)[0];
                    const contentResizable = draggable;

                    const paddingHeight = 30;
                    const scrollTop = $(window).scrollTop();
                    const scrollLeft = $(window).scrollLeft();

                    const top = scrollTop - paddingHeight;
                    const right = $(window).width() - contentResizable.offsetWidth;
                    const bottom = scrollTop + $(window).height()- paddingHeight - contentResizable.offsetHeight;

                    $(this).draggable({
                        containment: [scrollLeft, top, scrollLeft + right, bottom]
                    })
                }
            });
     });
<!DOCTYPE html>
<html lang="en">
<head>
  <title>Bootstrap Example</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
   <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
  
</head>
<body>
    <div class="container">
        <h2>Modal Example</h2>
        <!-- Trigger the modal with a button -->
        <button type="button" class="btn btn-info btn-lg" data-toggle="modal" data-target="#myModal">Open Moda</button>
  
        <!-- Modal -->
        <div class="modal fade" id="myModal" 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>
                    <div class="modal-footer">
                        <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
                    </div>
                </div>
            </div>
        </div>
        <button type="button" class="btn btn-info btn-lg" style="position:absolute;top:3500px;left:50px" data-toggle="modal" data-target="#myModal">Open Modal</button>
    </div>
    <script>
        $(document).ready(function () {
            $('.modal').find('.modal-dialog:first').draggable().css({
                "position": "absolute",
                "top": "25%",
                "left": "37.5%"
            });

            $('.modal').find('.modal-dialog:first').draggable({
                scroll: false,          
                start: function (e) {
                    const draggable = $(this)[0];
                    const contentResizable = draggable;

                    const paddingHeight = 30;
                    const scrollTop = $(window).scrollTop();
                    const scrollLeft = $(window).scrollLeft();

                    const top = scrollTop - paddingHeight;
                    const right = $(window).width() - contentResizable.offsetWidth;
                    const bottom = scrollTop + $(window).height()- paddingHeight - contentResizable.offsetHeight;

                    $(this).draggable({
                        containment: [scrollLeft, top, scrollLeft + right, bottom]
                    })
                }
            });
        });
    </script>
</body>
</html> 

4

0 回答 0