在缩放的div上拖动元素

我试过使用jQuery的内置可拖动和我试图使用自定义拖动功能没有用。 两者都有他们尊重的问题,我会尽力强调他们两个。

基本上,我试图允许拖动缩放的div容器上的元素。 以下方法可以在小于2左右的缩放元素上正常工作。 但是如果你比这更高,我们会看到一些问题。

任何帮助,将不胜感激。 感谢您的时间。

HTML

<div id="container">
    <div id="dragme">Hi</div>
</div>

方法1(jQuery可拖动函数)

我已经尝试了jQuery可拖动函数,就像你在这个jsfiddle例子中看到的那样。

我在这个例子中发现的问题如下:

  • 最大的担忧 :放大容器在放大时不会改变。 因此,如果元素被拖拽到不是其原始大小的一部分的缩放容器的一部分上,则会失败。
  • 当你点击拖动一个div时,它会传送一点点鼠标,而不是一个无缝的拖动。

  • JS

    var percent = 2.5;
    
    $("#dragme").draggable({
        zIndex: 3000,
        appendTo: 'body',
        helper: function (e, ui) {
            var draggable_element = $(this),
                width = draggable_element.css('width'),
                height = draggable_element.css('height'),
                text = draggable_element.text(),
                fontsize = draggable_element.css('font-size'),
                textalign = draggable_element.css('font-size');
            return $('<div id="' + draggable_element.id + '" name="' + draggable_element.attr('name') + '" class="text">' + text + '</div>').css({
                'position': 'absolute',
                    'text-align': textalign,
                    'background-color': "red",
                    'font-size': fontsize,
                    'line-height': height,
                    'width': width,
                    'height': height,
                    'transform': 'scale(' + percent + ')',
                    '-moz-transform': 'scale(' + percent + ')',
                    '-webkit-transform': 'scale(' + percent + ')',
                    '-ms-transform': 'scale(' + percent + ')'
            });
        },
        start: function (e, ui) {
            $(this).hide();
        },
        stop: function (e, ui) {
            $(this).show();
        }
    });
    
    $("#container").droppable({
        drop: function (event, ui) {
            var formBg = $(this),
                x = ui.offset.left,
                y = ui.offset.top,
                drag_type = ui.draggable.attr('id');
    
            var element_top = (y - formBg.offset().top - $(ui.draggable).height() * (percent - 1) / 2) / percent,
                element_left = (x - formBg.offset().left - $(ui.draggable).width() * (percent - 1) / 2) / percent;
    
            $(ui.draggable).css({
                'top': element_top,
                    'left': element_left
            });
    
        }
    });
    

    方法2 - 自定义拖动功能

    我尝试过使用自定义拖曳功能,但在2档左右后无法使用。

  • jsfiddle的scale(2) - 看起来像可拖动的div有癫痫发作。
  • 规模上的jsfiddle scale(2.5) - 可拖动的div会在您尝试拖动它时飞走。
  • JS

    (function ($) {
        $.fn.drags = function (opt) {
    
            opt = $.extend({
                handle: "",
                cursor: "move"
            }, opt);
    
            if (opt.handle === "") {
                var $el = this;
            } else {
                var $parent = this;
                var $el = this.find(opt.handle);
            }
    
            return $el.css('cursor', opt.cursor).on("mousedown", function (e) {
                if (opt.handle === "") {
                    var $drag = $(this).addClass('draggable');
                } else {
                    $(this).addClass('active-handle')
                    var $drag = $parent.addClass('draggable');
                }
    
                var
                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;
    
                follow = function (e) {
                    $drag.offset({
                        top: e.pageY + pos_y - drg_h,
                        left: e.pageX + pos_x - drg_w
                    })
                };
    
                $(window).on("mousemove", follow).on("mouseup", function () {
                    $drag.removeClass('draggable');
                    $(window).off("mousemove", follow);
                });
    
                e.preventDefault(); // disable selection
    
            }).on("mouseup", function () {
                if (opt.handle === "") {
                    $(this).removeClass('draggable');
                } else {
                    $(this).removeClass('active-handle');
                    $parent.removeClass('draggable');
                }
            });
    
        }
    })(jQuery);
    
    $("#dragme").drags({}, function (e) {});
    

    以下是我的一些调查结果,以确保拖放缩放容器适用于方法一 。 唯一需要注意的是确保您在发生这些行为之前已经声明的缩放百分比具有var percent百分比。

    首先,在JavaScript的顶部使用此代码。 这将有助于确保可投放区域与一个神圣的容器一起使用。

    $.ui.ddmanager.prepareOffsets = function( t, event ) { var i, j, m = $.ui.ddmanager.droppables[ t.options.scope ] || [], type = event ? event.type : null, list = ( t.currentItem || t.element ).find( ":data(ui-droppable)" ).addBack(); droppablesLoop: for ( i = 0; i < m.length; i++ ) { if ( m[ i ].options.disabled || ( t && !m[ i ].accept.call( m[ i ].element[ 0 ], ( t.currentItem || t.element ) ) ) ) { continue; } for ( j = 0; j < list.length; j++ ) { if ( list[ j ] === m[ i ].element[ 0 ] ) { m[ i ].proportions().height = 0; continue droppablesLoop; }  } m[ i ].visible = m[ i ].element.css( "display" ) !== "none"; if ( !m[ i ].visible ) { continue; } if ( type === "mousedown" ) { m[ i ]._activate.call( m[ i ], event ); } m[ i ].offset = m[ i ].element.offset(); m[ i ].proportions({ width: m[ i ].element[ 0 ].offsetWidth * percent, height: m[ i ].element[ 0 ].offsetHeight * percent }); } };
    

    这里有一些必要的功能来修复拖动,以便它在缩放的容器上工作。

    function dragFix(event, ui) { var changeLeft = ui.position.left - ui.originalPosition.left, newLeft = ui.originalPosition.left + changeLeft / percent, changeTop = ui.position.top - ui.originalPosition.top, newTop = ui.originalPosition.top + changeTop / percent; ui.position.left = newLeft; ui.position.top = newTop; }
    
    function startFix(event, ui) { ui.position.left = 0; ui.position.top = 0;  var element = $(this); }
    

    如果要使元素在缩放后的容器上可以调整大小,则需要此选项。

    function resizeFix(event, ui) { var changeWidth = ui.size.width - ui.originalSize.width, newWidth = ui.originalSize.width + changeWidth / percent, changeHeight = ui.size.height - ui.originalSize.height, newHeight = ui.originalSize.height + changeHeight / percent;  ui.size.width = newWidth; ui.size.height = newHeight; }
    

    为了使元素可拖动,我使用以下函数。

    $("ELEMENT").resizable({ minWidth: - ($(this).width()) * 10, minHeight: - ($(this).height()) * 10, resize: resizeFix, start: startFix });
    $("ELEMENT").draggable({ cursor: "move", start: startFix, drag: dragFix }); }
    

    这里提到了一个类似的问题:jquery - css“transform:scale”影响'jquery的.offset()'

    看起来问题在于jQuery无法为缩放元素返回精确大小,因此无法为元素设置正确的偏移值。

    为了解决这个问题,他建议先将刻度设置为1并设置偏移量,然后再次重置刻度值。

    但是,这一点在这里并不能解决问题。 由于鼠标位置是在缩放时进行的,因此位置值也应该按比例值进行分割。

    这是一个编辑的代码版本:

      var scl = 2.5;
      var
        drg_h = $drag.outerHeight(),
        drg_w = $drag.outerWidth(),
        pos_y = $drag.offset().top/scl + drg_h - e.pageY/scl,
        pos_x = $drag.offset().left/scl + drg_w - e.pageX/scl;
    
      follow = function(e) {
        var size = {
          top:e.pageY/scl + pos_y - drg_h+scl*2,
          left:e.pageX/scl + pos_x - drg_w+scl*2
        };
          $drag.parent().css("transform","scale(1)");
          $drag.offset(size);
          $drag.parent().css("transform","scale("+scl+")");
      };
    

    注意:因为我使用的是chrome,所以我只替换了transform标记的比例值。 您也可以替换所有实例,或者您可以使用具有1个缩放值的不同类。

    JSFiddle也在这里。


    下面是一个简单的拖动缩放的例子,但是,在prom dom。

    <style>
    #dragme {
        position:absolute;
        border:1px solid red;
        background:pink;
        left:10px;
        top:20px;
        width:100px;
        height:200px;
    }
    #container {
        transform: scale(2,2) translate(100px,100px);
        position:relative;
        border:1px solid green;
        background:grey;
        width:200px;
        height:300px;
    }
    </style>
    <body>
    
    <div id="container">
        <div id="dragme">Hi</div>
    </div>
    
    
        <script>
        var dragme=document.getElementById("dragme");
        var container=document.getElementById("container");
        dragme.onmousedown=function Drag(e){
            this.ini_X = this.offsetLeft-e.clientX/2;
            this.ini_Y = this.offsetTop-e.clientY/2;
            container.onmousemove = move;
            container.onmouseup = release;
          return false;
        }
        function move(e){
            e.target.style.left = e.clientX/2 + e.target.ini_X + 'px';
            e.target.style.top = e.clientY/2 + e.target.ini_Y + 'px';
        }
        function release(){
            container.onmousemove=container.onmouseup=null;
    }
    
        </script>
        </body>
    
    链接地址: http://www.djcxy.com/p/25167.html

    上一篇: Dragging elements on a scaled div

    下一篇: Symfony: InvalidArgumentException while parsing web.xml