vue3 实现滑动调整宽度的效果

<template>
  <a-layout>
    <a-layout-sider
      v-model:collapsed="collapsed"
      :width="sidebarWidth"
      :style="{ overflow: 'visible' }"
      @mousedown.stop="startResize($event)"
    >
      <div class="sider-resize" @mousedown.stop="startResize($event)"></div>
      <!-- 侧边栏内容 -->
    </a-layout-sider>
    <a-layout>
      <!-- 主体内容 -->
    </a-layout>
  </a-layout>
</template>

<script lang="ts">
import { defineComponent } from 'vue';

export default defineComponent({
  data() {
    return {
      collapsed: false,
      sidebarWidth: 200,
      resizing: false,
      startX: 0,
      startWidth: 200,
      moveHandler: null as null | ((event: MouseEvent) => void),
    };
  },
  methods: {
    startResize(event: MouseEvent) {
      this.resizing = true;
      this.startX = event.clientX;
      this.startWidth = this.sidebarWidth;
      this.moveHandler = this.resize.bind(this);
      document.addEventListener('mousemove', this.moveHandler);
      document.addEventListener('mouseup', this.stopResize);
    },
    resize(event: MouseEvent) {
      if (this.resizing) {
        const deltaX = event.clientX - this.startX;
        this.sidebarWidth = Math.max(this.startWidth + deltaX, 100);
      }
    },
    stopResize() {
      this.resizing = false;
      document.removeEventListener('mousemove', this.moveHandler!);
      document.removeEventListener('mouseup', this.stopResize);
      this.moveHandler = null;
      window.getSelection()?.removeAllRanges();
    },
  },
});
</script>

<style>
.sider-resize {
  position: absolute;
  top: 0;
  right: -5px;
  width: 10px;
  height: 100%;
  cursor: col-resize;
}
</style>

  1. data中添加了moveHandler属性,用于存储resize方法的绑定版本。
  2. startResize方法中,使用bind创建了resize方法的绑定版本,并将其赋值给moveHandler
  3. stopResize方法中,使用removeEventListener移除了moveHandler指向的事件监听器,而不是直接移除resize方法。
  4. 同时,在stopResize方法中,我们调用了window.getSelection()?.removeAllRanges()来清除浏览器的选区,这样可以防止某些浏览器在拖动过程中出现文本选择的情况。
  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值