vue3-directives 自定义指令 做个聊天窗口拖拽和拖拽按钮

请添加图片描述

<button v-focus style="position: absolute">drag</button>

directives: {
    focus: {
      // 指令的定义
      mounted(el, binding, vnode) {
        /** el可以获取当前dom节点,并且进行编译,也可以操作事件 **/
        /** binding指的是一个对象,一般不用 **/
        /** vnode 是 Vue 编译生成的虚拟节点 **/
        let x = 0
        let y = 0
        let l = 0
        let t = 0
        let isDown = false
        el.onmousedown = function (e) {
          x = e.clientX
          y = e.clientY
          l = el.offsetLeft
          t = el.offsetTop
          isDown = true
          el.style.cursor = 'move'
          window.onmousemove = function (e) {
            if (isDown == false) {
              return
            }
            let nx = e.clientX
            let ny = e.clientY
            let nl = nx - (x - l)
            let nt = ny - (y - t)
            el.style.left = nl + 'px'
            el.style.top = nt + 'px'
          }
          window.onmouseup = function () {
            isDown = false
            el.style.cursor = 'default'
            window.onmousemove = null
            window.onmouseup = null
          }
          return false
        }
      }
    }
  }
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我可以帮你解答这个问题。 首先,我们需要安装 `vue-draggable-resizable` 这个库,它可以帮助我们实现拖拽和调整大小的功能。可以使用以下命令进行安装: ``` npm install vue-draggable-resizable ``` 接下来,我们可以创建一个名为 `DraggableDialog.vue` 的组件。代码如下: ```html <template> <vue-draggable-resizable :w="width" :h="height" :x="x" :y="y"> <div class="dialog-header" @mousedown="onMouseDown"> <slot name="header">Header</slot> </div> <div class="dialog-body"> <slot name="body">Body</slot> </div> </vue-draggable-resizable> </template> <script> import VueDraggableResizable from 'vue-draggable-resizable'; export default { components: { VueDraggableResizable, }, props: { width: { type: Number, default: 400, }, height: { type: Number, default: 300, }, x: { type: Number, default: 0, }, y: { type: Number, default: 0, }, }, methods: { onMouseDown(event) { const offsetX = event.clientX - event.target.offsetLeft; const offsetY = event.clientY - event.target.offsetTop; const onMouseMove = (event) => { this.x = event.clientX - offsetX; this.y = event.clientY - offsetY; }; const onMouseUp = () => { document.removeEventListener('mousemove', onMouseMove); document.removeEventListener('mouseup', onMouseUp); }; document.addEventListener('mousemove', onMouseMove); document.addEventListener('mouseup', onMouseUp); }, }, }; </script> <style scoped> .dialog-header { background-color: #eee; padding: 8px; cursor: move; } .dialog-body { padding: 8px; } </style> ``` 在这个组件中,我们使用了 `vue-draggable-resizable` 来实现拖拽和调整大小的功能,同时也添加了自定义的样式和鼠标事件来实现拖拽的效果。 你可以在父组件中使用这个组件,并传递一些 props 来设置弹窗的大小和位置。例如: ```html <template> <div> <button @click="showDialog = true">Show Dialog</button> <draggable-dialog v-if="showDialog" :x="dialogX" :y="dialogY" :width="dialogWidth" :height="dialogHeight"> <template v-slot:header> Custom Header </template> <template v-slot:body> Custom Body </template> </draggable-dialog> </div> </template> <script> import DraggableDialog from './DraggableDialog.vue'; export default { components: { DraggableDialog, }, data() { return { showDialog: false, dialogX: 100, dialogY: 100, dialogWidth: 400, dialogHeight: 300, }; }, }; </script> ``` 在这个例子中,我们使用了 `v-if` 来控制弹窗是否显示,同时传递了一些 props 来设置弹窗的大小和位置,还使用了 slot 来自定义弹窗的头部和内容部分。 这样,一个简单的拖拽弹窗组件就完成了。希望能对你有所帮助!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值