记录拖拽改变布局比例

实现目标

 

 实现过程

首先需要实现,鼠标放上去时展示拖拽线,此处用css伪元素就可以实现。

.column-resize {
  width: 17px;
  background-color: transparent;
  position: relative;

  &:hover {
    cursor: col-resize;

    &::before {
      content: '';
      position: absolute;
      top: 0;
      left: 7px;
      width: 3px;
      height: 100%;
      background-color: #0500fe;
    }
  }
}

鼠标移入并按下时,触发拖拽事件:

<!-- 左侧区域 -->
<div :style="{ width: `calc(100% - ${blocksWrapRightWidth + 17}px)` }">
  <!-- 一些代码 -->
</div>
<!-- 拖动条 -->
<div class="column-resize" @mousedown="colResizeMouseDown" />
<!-- 右侧区域 -->
<div :style="{ width: blocksWrapRightWidth + 'px' }">
  <!-- 一些代码 -->
</div>
const scrollWidth = ref(0) // 记录鼠标拖动的距离
let mousePageX = 0 // 记录鼠标拖动的起始位置
const blocksWrapRightWidth = ref(360) // 右侧区域的宽度
let tempBlocksWrapRightWidth = 360

// 鼠标按下时触发
const colResizeMouseDown = (e: MouseEvent) => {
  e.preventDefault()
  // 记录鼠标在页面的位置
  mousePageX = e.pageX
  // 记录现在右侧区域的位置
  tempBlocksWrapRightWidth = blocksWrapRightWidth.value
  // 添加监听鼠标拖动事件
  document.addEventListener('mousemove', colResizeMouseMove)
}

// 鼠标拖动时改变区域宽度
const colResizeMouseMove = (e: MouseEvent) => {
  e.stopPropagation()
  // 记录鼠标移动的距离
  scrollWidth.value = e.pageX - mousePageX
  mousePageX = e.pageX
  // 提前计算出改变后各区域的宽度,如果没有超过限制就采用tempBlocksWrapRightWidth
  // 如果超过限制,就设置成极限值
  tempBlocksWrapRightWidth = tempBlocksWrapRightWidth - scrollWidth.value
  if (tempBlocksWrapRightWidth <= 345) {
    blocksWrapRightWidth.value = 345
  } else if (tempBlocksWrapRightWidth >= 600) {
    blocksWrapRightWidth.value = 600
  } else {
    blocksWrapRightWidth.value = tempBlocksWrapRightWidth
  }
}

页面监听mouseup事件:

onMounted(() => {
  document.addEventListener('mouseup', handleMouseUp)
})

const handleMouseUp = () => {
  document.removeEventListener('mousemove', colResizeMouseMove)
}

onBeforeUnmount(() => {
  document.removeEventListener('mouseup', handleMouseUp)
})

这样就大功告成啦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值