如何使vuetify对话框可拖动

ff29svar  于 2022-11-30  发布在  Vue.js
关注(0)|答案(2)|浏览(212)

我需要做一个可拖动的对话框。但我用的是Vue2和Vuetify。
我尝试使用jquery,但不起作用。
index.html

<head>
  <script src="https://code.jquery.com/jquery-3.6.0.js"></script>
  <script src="https://code.jquery.com/ui/1.13.1/jquery-ui.js"></script>
  <script>
    $(function () {
      $(".my-custom-dialog").draggable();
    });
  </script>
</head>

App.vue

<v-dialog v-model="isOpen" content-class="my-custom-dialog">
  <!-- dialog content-->
</v-dialog>

我以为用content-class来命名对话框类,用jquery来命名对话框类会有用,但是没有用。有什么想法吗?

e0uiprwp

e0uiprwp1#

你可以使用vue-dialogue-drag,它是一个非常小的包,我通常建议避免使用它(在评论的最后阅读它)。它相对容易使用,你可以按照它的GitHub自述文件中的说明操作。
如果您希望实现自己编写解决方案,可以使用以下内容作为模板:

(function () { // make vuetify dialogs movable
    const d = {};
    document.addEventListener("mousedown", e => {
        const closestDialog = e.target.closest(".v-dialog.v-dialog--active");
        if (e.button === 0 && closestDialog != null && e.target.classList.contains("v-card__title")) { // element which can be used to move element
            d.el = closestDialog; // element which should be moved
            d.mouseStartX = e.clientX;
            d.mouseStartY = e.clientY;
            d.elStartX = d.el.getBoundingClientRect().left;
            d.elStartY = d.el.getBoundingClientRect().top;
            d.el.style.position = "fixed";
            d.el.style.margin = 0;
            d.oldTransition = d.el.style.transition;
            d.el.style.transition = "none"
        }
    });
    document.addEventListener("mousemove", e => {
        if (d.el === undefined) return;
        d.el.style.left = Math.min(
            Math.max(d.elStartX + e.clientX - d.mouseStartX, 0),
            window.innerWidth - d.el.getBoundingClientRect().width
        ) + "px";
        d.el.style.top = Math.min(
            Math.max(d.elStartY + e.clientY - d.mouseStartY, 0),
            window.innerHeight - d.el.getBoundingClientRect().height
        ) + "px";
    });
    document.addEventListener("mouseup", () => {
        if (d.el === undefined) return;
        d.el.style.transition = d.oldTransition;
        d.el = undefined
    });
    setInterval(() => { // prevent out of bounds
        const dialog = document.querySelector(".v-dialog.v-dialog--active");
        if (dialog === null) return;
        dialog.style.left = Math.min(parseInt(dialog.style.left), window.innerWidth - dialog.getBoundingClientRect().width) + "px";
        dialog.style.top = Math.min(parseInt(dialog.style.top), window.innerHeight - dialog.getBoundingClientRect().height) + "px";
    }, 100);
})();
  • 根据deps.devvue-dialogue-drag有一个4. 8/10的安全率,虽然没有危险的工作流程在它里面,我相信低分数的原因是缺乏更新:)
qhhrdooz

qhhrdooz2#

要使Vuetify 3.+对话框可移动,您可以使用tipsy先前在https://github.com/vuetifyjs/vuetify/issues/4058(与接受的答案相同)建议的解决方案,但要将其定制为Vue组件movable.vue,并导入到您的App.vue中。

<script>
/* add class .vss-movable to <v-card-title> to make a dialog movable */

(function () {
  const d = {}
  const isMovable = (targ) => {
    return targ.classList?.contains("vss-movable")
  }
  document.addEventListener("mousedown", e => {
    const closestDialog = e.target.closest(".v-overlay__content")
    const title = closestDialog?.querySelector(".v-card-title")
    if ( e.button === 0 && closestDialog != null && (isMovable(e.target)) || isMovable(e.target.parentNode) ) {
      d.el = closestDialog // movable element
      d.handle = title // enable dlg to be moved down beyond bottom
      d.mouseStartX = e.clientX
      d.mouseStartY = e.clientY
      d.elStartX = d.el.getBoundingClientRect().left
      d.elStartY = d.el.getBoundingClientRect().top
      d.el.style.position = "fixed"
      d.el.style.margin = 0
      d.oldTransition = d.el.style.transition
      d.el.style.transition = "none"
    }
  })
  document.addEventListener("mousemove", e => {
    if (d.el === undefined) return
    d.el.style.left = Math.min(
      Math.max(d.elStartX + e.clientX - d.mouseStartX, 0),
      window.innerWidth - d.el.getBoundingClientRect().width
    ) + "px"
    d.el.style.top = Math.min(
      Math.max(d.elStartY + e.clientY - d.mouseStartY, 0),
      window.innerHeight - d.handle.getBoundingClientRect().height
    ) + "px"
  })
  document.addEventListener("mouseup", () => {
    if (d.el === undefined) return
    d.el.style.transition = d.oldTransition
    d.el = undefined
  })
})()
</script>

<style>
.v-overlay.v-dialog .vss-movable {
  cursor: grab;
}
.v-overlay.v-dialog .vss-movable:hover {
  background-color: #eee;
}
.v-overlay.v-dialog .vss-movable:active {
  cursor: grabbing;
}
</style>

相关问题