JS 原生拖拽至任意位置

准备一组数据

list: [
        { width: 100, height: 100, backgroundColor: 'blue' },
        { width: 100, height: 100, backgroundColor: '#e8693f' },
        { width: 150, height: 50, backgroundColor: '#409215' },
        { width: 50, height: 100, backgroundColor: '#928815' },
        { width: 120, height: 30, backgroundColor: '#6f1592' }
      ]

HTML

<div class="box">
      <div
        v-for="(item,i) in list"
        :key="i"
        class="item"
        :style="getStyle(item,i)"
        @mousedown="drag($event,i)"
      />
    </div>

JS

drag(e, i) {
      const dom = document.getElementsByClassName('item')[i]
      const box = document.getElementsByClassName('box')[0]
      // 计算鼠标位置和元素偏移量的差值。
      const ol = e.clientX - dom.offsetLeft
      const tl = e.clientY - dom.offsetTop
      document.onmousemove = (t) => {
        t.preventDefault()
        // 拖拽事件
        let left = t.clientX - ol
        let top = t.clientY - tl
        const offsetRight = box.offsetWidth - dom.offsetWidth
        const offsetBottom = box.offsetHeight - dom.offsetHeight
        if (left < 0) { left = 0 }
        if (left > offsetRight) { left = offsetRight }
        if (top < 0) { top = 0 }
        if (top > offsetBottom) { top = offsetBottom }
        dom.style.left = left + 'px'
        dom.style.top = top + 'px'
      }
      document.onmouseup = () => {
        document.onmousemove = null
        document.onmouseup = null
      }
    },
    // 动态设置样式
    getStyle(item, i) {
      let left = 0
      for (let j = 0; j < i; j++) {
        left += this.list[j].width
      }
      const str = `width: ${item.width}px;
        height:${item.height}px;
        background-color:${item.backgroundColor};
        position: absolute;
        left:${left}px`
      return str
    },

CSS

.box{
    width: 1000px;
    height: 500px;
    border: 1px solid #000;
    margin: auto;
    position: relative;
  }

效果图
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值