vue 拖拽移動示例

<template>
  <div id="drag">
    <div
      id="drag-box"
      class="drag-box"
      draggable="true"
      :style="{ top, left }"
      @dragstart.stop="onDragstart"
      @drag.stop="onDragenter"
      @dragend.stop="onDragend"
    />
  </div>
</template>

setup部分

<script setup>
import { ref } from 'vue'
const top = ref(0)
const left = ref(0)
const obj = { top: 0, left: 0 }
let disx = 0
let disy = 0

const onDragstart = (e) => {
  const box = document.getElementById('drag-box')
  disx = e.pageX - box.offsetLeft
  disy = e.pageY - box.offsetTop
}
const onDragenter = (e) => {
  let x, y
  const drag = document.getElementById('drag')
  if ((e.pageX - disx) > 0) { // 元素相對於頁面左上角的偏移位置 大於0時
    if ((e.pageX - disx) > drag.clientWidth - 200) { // 元素相對於頁面左上角的偏移位置 移出到頁面以外(右側)
      x = drag.clientWidth - 200 // 60是元素自身的寬高
    } else {
      x = e.pageX - disx
    }
  }
  if ((e.pageY - disy) > 0) {
    if ((e.pageY - disy) > drag.clientHeight - 200) { // 元素移動到頁面以外(底部)
      y = drag.clientHeight - 200
    } else {
      y = e.pageY - disy
    }
  }
  left.value = x + 'px'
  top.value = y + 'px'
}
const onDragend = (e) => {
  console.log(obj)
}
</script>

css

<style lang="less">
#drag {
  width: 800px;
  height: 800px;
  background-color: #666;
  position: relative;
  .drag-box {
    position: absolute;
    width: 200px;
    height: 200px;
    background-color: #f1f1f1;
    cursor: grab;
  }
}
</style>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章