vue实现拖拽

<template>

  <div id="app" ref="parentNode">

    <button @click="isOpen = !isOpen">边界 /{{ !isOpen ? "关" : "开" }}</button>

    <div class="target" ref="sonNode" @mousedown="movePos">

      X: {{ positionX }} <br />

      Y: {{ positionY }}

    </div>

  </div>

</template>

<script>

export default {

  data() {

    return {

      positionX: 0,

      positionY: 0,

      isOpen: false,

    };

  },

  methods: {

    movePos(e) {

      //目标元素

      let el = e.target;

      let posX = e.clientX - el.offsetLeft;

      let posY = e.clientY - el.offsetTop;

      document.onmousemove = (e) => {

        //计算元素位置(需要判断临界值)

        let left = e.clientX - posX;

        let top = e.clientY - posY;

        /*****  临界值 starting(此区域代码可注释)  ***/

        if (this.isOpen) {

          // 获取父元素 自元素 的宽高

          let { offsetHeight: parentNodeHeight, offsetWidth: parentNodeWidth } =

            this.$refs.parentNode;

          let { offsetHeight: sonNodeHeight, offsetWidth: sonNodeWidth } =

            this.$refs.sonNode;

          // 左上角(left)

          if (left < 0) {

            left = 0;

          }

          if (top < 0) {

            top = 0;

          }

          // 左下角

          if (top > parentNodeHeight - sonNodeHeight) {

            top = parentNodeHeight - sonNodeHeight;

          }

          if (left > parentNodeHeight - sonNodeWidth) {

            left = parentNodeHeight - sonNodeWidth;

          }

        }

        /*****  临界值 ending  ***/

        this.positionX = top;

        this.positionY = left;

        //移动当前元素

        el.style.left = left + "px";

        el.style.top = top + "px";

      };

      document.onmouseup = (e) => {

        document.onmousemove = null;

        document.onmouseup = null;

      };

    },

  },

};

</script>

<style scoped>

#app {

  position: relative;

  width: 500px;

  background: #999;

  height: 500px;

}

.target {

  position: absolute;

  left: 0;

  right: 0;

  width: 100px;

  height: 50px;

  background: red;

  cursor: pointer;

}

</style>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值