vue3+vite实现左右DIV拖拽

效果如图:
在这里插入图片描述
直接代码实现

<template>
  <div class="box">
    <div class="left" :style="{width:`calc(${leftWidthRate}% - 2px)`}"></div>
    <div class="resize" @mousedown="dragDiv($event)"></div>
    <div class="right" :style="{width:`calc(100% - ${leftWidthRate}% - 2px)`}"></div>
  </div>
</template>

<script setup lang="ts">
import {ref} from "vue";

const leftWidthRate = ref(30)
const dragDiv = (e: any) => {
  let box = document.getElementsByClassName('box')
  let left = document.getElementsByClassName('left')
  let boxWidth = box[0].offsetWidth
  let leftWidth = left[0].offsetWidth
  let minRightRate = parseFloat((200 / boxWidth * 100).toFixed(4))
  let minLeftRate = parseFloat((200 / boxWidth * 100).toFixed(4))
  // 鼠标开始位置
  let startX = e.clientX
  // 鼠标拖拽事件
  document.onmousemove = function (e: any) {
    // 鼠标结束位置
    let endX = e.clientX
    // 鼠标偏移量:取绝对值
    let distX = Math.abs(endX - startX)
    // 鼠标向右滑动
    if (endX > startX) {
      // 移动后左边div比率
      let leftDivWidthRate = parseFloat(((leftWidth + distX) / boxWidth * 100).toFixed(4));
      if ((parseFloat('100') - leftDivWidthRate) > minRightRate) {
        leftWidthRate.value = leftDivWidthRate
      }
    }
    // 鼠标向右滑动
    if (endX < startX) {
      // 移动后左边div比率
      let leftDivWidthRate = parseFloat(((leftWidth - distX) / boxWidth * 100).toFixed(4));
      if (leftDivWidthRate > minLeftRate) {
        leftWidthRate.value = leftDivWidthRate
      }
    }
  }
  // 鼠标松开事件
  document.onmouseup = (e: any) => {
    document.onmousemove = null
    document.onmouseup = null
  }
}

</script>

<style lang="scss" scoped>
.box {
  position: relative;
  width: 100%;
  height: 100%;

  .left {
    float: left;
    width: calc(30% - 2px);
    height: 100%;
    background-color: green;
  }

  .resize {
    float: left;
    width: 4px;
    height: 100%;
    font-weight: 500;
    color: gray;
    cursor: w-resize;
  }

  .right {
    float: left;
    width: calc(70% - 2px);
    height: 100%;
    background-color: yellow;
  }

}

</style>

有部分问题:鼠标有时松开时,鼠标按压事件还在生效,仍然还可以滑动。后续待解决,欢迎技术交流

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值