【问题标题】:Setting boundary limits for a draggable object为可拖动对象设置边界限制
【发布时间】:2010-12-05 13:58:04
【问题描述】:

我有两个元素:

1. 固定高度的父级,overflow:hidden

2.它的孩子,具有较大的固定高度。

<style type="text/css">
    .myList {list-style:none; margin:0px; padding:1px;}
    .myList li{ height:50px;  margin:4px; padding:2px;}
    .dragPanel {height:230px; border:solid; overflow:hidden;}
</style>

<div class="dragPanel">
    <ul class="myList">
        <li>1</li>
        <li>2</li>
        ...   ....
        <li>8</li>
        <li>9</li>
    </ul>
</div>

我希望能够在父 div 中上下拖动列表。我正在使用jquery ui draggable插件来实现垂直拖动,但我不确定如何将列表约束在父div中。

<script type="text/javascript" src="http://jqueryui.com/latest/jquery-1.3.2.js"></script>
<script type="text/javascript" src="http://jqueryui.com/latest/ui/ui.core.js"></script>
<script type="text/javascript" src="http://jqueryui.com/latest/ui/ui.draggable.js"></script>

<script type="text/javascript">
    $(document).ready(function() {
        $('.dragPanel').addClass("hover");
        $('.myList').draggable({ axis: 'y' });
    });
</script>

我将如何设置列表位置的垂直上限和下限?

【问题讨论】:

    标签: javascript jquery jquery-ui draggable


    【解决方案1】:

    使用containment option

    $('.myList').draggable({
        axis: 'y',
        containment: 'parent'
    });
    

    【讨论】:

    • 父级的高度小于其子级 - 当我尝试此选项时,拖动不起作用 - 列表只是在顶部和底部位置之间跳转
    • 这太棒了。容易
    【解决方案2】:

    我遇到了同样的问题,但答案对我没有帮助。后来一些javascript我认为以下是更好的解决方案。

    (有人知道如何把它变成一个 jQuery 插件吗?)

    <!DOCTYPE html>
    <html>
    <head>
        <title>Draggable limited to the container</title>
        <style type="text/css">
        #container {
            cursor: move;
            overflow: hidden;
            width: 300px;
            height: 300px;
            border: 1px solid black;
        }
        </style>
        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.min.js"></script>
        <script type="text/javascript">
        $(function() {
            $.globalVars = {
                originalTop: 0,
                originalLeft: 0,
                maxHeight: $("#draggable").height() - $("#container").height(),
                maxWidth: $("#draggable").width() - $("#container").width()
            };
            $("#draggable").draggable({
                start: function(event, ui) {
                    if (ui.position != undefined) {
                        $.globalVars.originalTop = ui.position.top;
                        $.globalVars.originalLeft = ui.position.left;
                    }
                },
                drag: function(event, ui) {
                    var newTop = ui.position.top;
                    var newLeft = ui.position.left;
                    if (ui.position.top < 0 && ui.position.top * -1 > $.globalVars.maxHeight) {
                        newTop = $.globalVars.maxHeight * -1;
                    }
                    if (ui.position.top > 0) {
                        newTop = 0;
                    }
                    if (ui.position.left < 0 && ui.position.left * -1 > $.globalVars.maxWidth) {
                        newLeft = $.globalVars.maxWidth * -1;
                    }
                    if (ui.position.left > 0) {
                        newLeft = 0;
                    }
                    ui.position.top = newTop;
                    ui.position.left = newLeft;
                }
            });
        });
        </script>
    </head>
    <body>
        <div id="container">
            <img id="draggable" src="avatar.jpg" />
        </div>
    </body>
    </html>
    

    【讨论】:

      【解决方案3】:

      好的,

      这是我走过的路线……

      加载页面时,我在可拖动列表周围添加了一个容器 div。我将它的高度设置为列表的两倍,然后将其放在页面上方一点:

      <script type="text/javascript">
        $(document).ready(function() {
            CreateContainerDiv();
            $('.dragPanel').addClass("hover");
            $('.myList').draggable({ axis: 'y', containment: 'parent' });
        });
      
          function CreateContainerDiv() {
              var dragPanel = $('.dragPanel');
              var dragTarget = $('.myList');
      
              // add the container panel
              var newPanelHeight = dragTarget.outerHeight() * 2 - dragPanel.outerHeight();
              dragTarget.wrap(document.createElement("div"));
      
              // set its height and put it in the right place
              dragTarget.parent().css("height", newPanelHeight);
              dragTarget.parent().css("position", "relative");
              var newPanelPosition = ((dragTarget.outerHeight() * -1) / 2);
              dragTarget.parent().css("top", newPanelPosition);         
          }
      </script>
      

      然后列表包含在这个新元素中。

      这似乎可以完成这项工作,但如果列表应用了任何填充/边距,则定位有点不稳定。对此有任何想法都将不胜感激!

      -----编辑---------

      好的,我想我已经解决了展示位置问题。我已经把它变成了一个插件,这样其他人就不必花时间创建这个功能了。

      jQuery Drag-gable List at Github

      【讨论】:

      • 非常非常好的方法,添加一个其他大小的滚动窗格非常好。优秀的保罗..
      【解决方案4】:

      您不必为这种结构拖动任何东西。您需要的是使用overflow-x:hidden 设置父div;和溢出-y:滚动;。这样,它的内容将是可滚动的。

      如果你想隐藏滚动条,只需输入这个属性: .dragPanel::-webkit-scrollbar{width:0 !important} 就可以了!我真的不知道您为什么要考虑拖动元素而不仅仅是滚动内容(这是执行此类“问题”的正确方法)。无论如何,我希望它可以帮助任何需要满足相同需求的人。问候!

      【讨论】:

        猜你喜欢
        • 2013-10-09
        • 2013-03-29
        • 2014-04-28
        • 2011-07-05
        • 2013-11-27
        • 1970-01-01
        • 2014-05-19
        • 2020-04-24
        • 2013-12-12
        相关资源
        最近更新 更多