vue2 实现左右拖拽调整宽度的功能

vue2 实现左右拖拽调整宽度的功能

一、模板结构调整

<template>
  <div class="mobile-list-container">
    <!-- 左侧列表容器 -->
    <div class="aside" :style="{ width: leftWidth + 'px' }" @scroll="handleScroll">
      <!-- 原有列表内容保持不变 -->
    </div>
    
    <!-- 拖拽条 -->
    <div 
      class="resize-handle"
      @mousedown="startResize"
      @touchstart.passive="startResize"
    ></div>

    <!-- 右侧内容区域 -->
    <div class="itemContent" :style="{ width: `calc(100% - ${leftWidth}px)` }">
      <!-- 原有内容保持不变 -->
    </div>
  </div>
</template>

二、脚本部分新增

<script>
export default {
  data() {
    return {
      leftWidth: 330, // 初始宽度与原有样式一致
      isResizing: false
    }
  },
  methods: {
    startResize(e) {
      this.isResizing = true
      window.addEventListener('mousemove', this.handleResize)
      window.addEventListener('touchmove', this.handleResize)
      window.addEventListener('mouseup', this.stopResize)
      window.addEventListener('touchend', this.stopResize)
    },
    handleResize(e) {
      if (!this.isResizing) return
      
      const containerRect = this.$el.getBoundingClientRect()
      const clientX = e.clientX || e.touches[0].clientX
      const newWidth = clientX - containerRect.left

      // 设置最小和最大宽度限制
      this.leftWidth = Math.max(200, Math.min(600, newWidth))
    },
    stopResize() {
      this.isResizing = false
      window.removeEventListener('mousemove', this.handleResize)
      window.removeEventListener('touchmove', this.handleResize)
      window.removeEventListener('mouseup', this.stopResize)
      window.removeEventListener('touchend', this.stopResize)
    }
  }
}
</script>

三、新增CSS样式

.resize-handle {
  position: absolute;
  top: 0;
  bottom: 0;
  width: 8px;
  background: #EBEBEB;
  cursor: col-resize;
  z-index: 100;
  transition: background 0.2s;

  &:hover,
  &:active {
    background: #409EFF;
  }
}

.mobile-list-container {
  position: relative; /* 确保拖拽条定位正确 */
  display: flex;
  height: 100vh;
}
可以使用`vue-draggable-resizable`插件来实现拖动调整左右两侧div的宽度。 首先在项目中安装`vue-draggable-resizable`: ``` npm install vue-draggable-resizable --save ``` 然后在需要使用的组件中引入: ```javascript import VueDraggableResizable from 'vue-draggable-resizable' import 'vue-draggable-resizable/dist/VueDraggableResizable.css' ``` 接着在组件中使用`vue-draggable-resizable`: ```html <template> <div> <vue-draggable-resizable :w="leftWidth" :h="height" :x="0" :y="0" :min-width="minWidth" :max-width="maxWidth" :parent="true" :active="true" :grid="[1, 1]" :handles="['e']" @resize="onResize" > <div class="left"></div> </vue-draggable-resizable> <div class="divider"></div> <div class="right"></div> </div> </template> <script> import VueDraggableResizable from 'vue-draggable-resizable' import 'vue-draggable-resizable/dist/VueDraggableResizable.css' export default { components: { VueDraggableResizable }, data() { return { leftWidth: 200, height: 500, minWidth: 100, maxWidth: 400 } }, methods: { onResize() { // 当左侧div宽度改变时触发 } } } </script> ``` 在上面的代码中,我们使用了`vue-draggable-resizable`组件来实现拖动调整左侧div的宽度。具体的参数和事件如下: - `w`:左侧div的宽度 - `h`:左侧div的高度 - `x`:左侧div的x坐标 - `y`:左侧div的y坐标 - `min-width`:左侧div的最小宽度 - `max-width`:左侧div的最大宽度 - `parent`:是否限制在父元素内 - `active`:是否活动状态 - `grid`:拖拽的网格大小 - `handles`:拖拽的手柄位置 - `@resize`:左侧div改变宽度时触发的事件 通过设置`handles`为`['e']`,表示只能横向拖动调整宽度,而不能改变高度。当左侧div的宽度改变时,会触发`@resize`事件,在事件处理函数中可以实现相应的逻辑。 最后,为了实现左右两侧div并排显示,需要在样式中设置: ```css .left { float: left; height: 100%; background-color: #f0f0f0; } .right { float: left; height: 100%; width: calc(100% - 200px); background-color: #e0e0e0; } .divider { float: left; height: 100%; width: 10px; background-color: #d0d0d0; } ``` 这样就可以实现拖动调整左右两侧div的宽度了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值