jQuery UI resizable/draggable 可以用来单击并拖动新元素到 DOM 中吗?

Can jQuery UI resizable/draggable be used to click and drag a new element into the DOM?

我有一个页面,为了创建一个新的 resizable/draggble div 用户点击 canvas 上的任意位置,它出现在点击事件发生的地方旁边。

一旦新元素出现,用户就可以调整它的大小或拖动它。

更好的用户体验是允许用户按下 mousedown,将新 div 拖动到所需大小,然后 mouseup 完成创建。例如

我想要的

这就像在本网站上绘制矩形的工作方式:https://awwapp.com/

我有什么

您会看到我的代码只是在检测到拖动时附加新的 div。然后用户必须返回并调整大小。

在研究使用 jQuery 检测拖动时,我没有发现很多一般情况,apart from this 但即使是这个例子,当我需要单击和拖动时,也是非常多的单击或拖动。

我的代码,为简洁起见,目前是:

function newPlaceholderPosition(posX, posY, X, Y) {
    cssTop = (Y - posY);
    cssLeft = (X - posX);

    var styles = [
        "top: "+ Math.round(cssTop / 10) * 10 +"px;",
        "left: "+ Math.round(cssLeft / 10) * 10 +"px;"
    ].join(' ');

    return styles.toString();
}

function makePlaceholdersFunctional(elements) {
    elements.resizable({
        containment: "parent",
        handles: 'ne, se, sw, nw',
        minWidth: 100,
        minHeight: 40,
        autoHide: true,
    });

    elements.draggable({
        containment: "parent",
        drag: function() {
            $("body").addClass("element-moving");
        },
        stop: function() {
            $("body").removeClass("element-moving");    
        }
    });
}

var isDragging = false;

$(".canvas")
.mousedown(function(e) {
    isDragging = false;
    // Log where the click took place
    clickLocation = newPlaceholderPosition($(this).offset().left, $(this).offset().top, e.pageX, e.pageY);
})
.mousemove(function(e) {
    // If the user is not dragging an existing div
    if(!$('.canvas').hasClass("child-active")) {
        isDragging = true;  
    }
})
.mouseup(function() {
    var wasDragging = isDragging;
    isDragging = false;
    if (!wasDragging) {
        // console.log("You weren't dragging on the canvas")
    } else {
        // console.log("You WERE dragging on the canvas")
        $(".canvas").append('<div class="resizable" data-id="' + parseInt( $(".resizable").length + 1) + '" style="'+ clickLocation +'"></div>');
        makePlaceholdersFunctional($(".resizable:last"));
    }
});

是否可以使用 jQuery UI 这样的事情?有人可以举个例子吗?

不,这不是 - 那是不可能的。

根据所提供的有限信息,您可以完成这项工作,只是可能不是您预期的那样。它不是 jQuery UI 的功能,但您可以利用各种工具来制作一些东西。

使用Selectable,您可以在Start 和Stop 捕获鼠标点。这可用于在矩形中为您提供 2 个点。它不需要任何元素在播放,然后动态地创建可拖动和可调整大小的元素。

示例: https://jsfiddle.net/Twisty/42zeudf6/16/

JavaScript

$(function() {
  var toolFunction = null;
  var action = null;

  function calcBoxDim(x1, y1, x2, y2) {
    var dim = {};
    dim.width = x2 - x1;
    dim.height = y2 - y1;
    dim.top = y1;
    dim.left = x1;
    dim.right = x2;
    dim.bottom = y2;
    dim.center = [x1 + (dim.width / 2), y1 + (dim.height / 2)];
    return dim;
  }

  function makeCanvasDrag($o) {
    $o.draggable({
      containment: $(".canvas")
    });
  }

  function makeCanvasResize($o) {
    $o.resizable({
      containment: $(".canvas")
    });
  }

  function makeRect(x1, y1, x2, y2, ev) {
    var box = calcBoxDim(x1, y1, x2, y2);
    var rect = $("<div>", {
      id: "rect-" + ($(".canvas .rectangle").length + 1),
      class: "draw rectangle move resize"
    }).appendTo($(".canvas")).css({
      width: box.width + "px",
      height: box.height + "px",
      top: (box.top - $(".canvas").offset().top) + "px",
      left: (box.left - $(".canvas").offset().left) + "px",
      position: "absolute"
    });
    return rect;
  }
  $(".tools button").button({
    showLabel: false,
    icon: "none"
  });
  $(".rect").button("option", "icon", "far fa-square").click(function() {
    toolFunction = "rect";
    action = "draw";
    $(".canvas").selectable({
      start: function(e) {
        $(".canvas").data("drawRectMouseDown", e);
      },
      stop: function(e) {
        var down = $(".canvas").data("drawRectMouseDown");
        var up = e;
        makeRect(down.pageX, down.pageY, up.pageX, up.pageY, e);
        makeCanvasDrag($(".canvas .move"));
        makeCanvasResize($(".canvas .resize"));
        toolFunction = null;
        action = null;
      }
    });
  });
  $(".select").button("option", "icon", "fas fa-mouse-pointer")
});

此示例使用 FontAwesome,但您可以使用 jQuery UI 图标或您自己的图形。

我怀疑您最终会创建很多与按钮和事件相关的功能。然后,工具按钮会填充全局变量,让用户可以在工作区中使用这些工具。

我们有一个函数可以根据 2 个点计算尺寸。然后我们有另一个函数可以根据这些尺寸制作矩形。我添加了很多尺寸,以防您需要将此功能用于其他形状。我将它与 maker 函数分开,以防您将所有 canvas 详细信息存储在某个地方并且稍后必须重新绘制 canvas 。如果您从数据库中提取维度而不是根据用户操作计算它们,那么将这些函数分开是有意义的。否则你可以将它们组合起来。

希望有所帮助。