Vue 左右布局中拖拽容器边框实现自适应宽度

Vue 左右布局中拖拽容器边框实现自适应宽度

在这里插入图片描述

诉求:通过拖拽蓝色div有边框实现两侧宽度自适应

实现步骤
  1. 规划好布局
  • 借助flex布局实现一侧宽度固定,另一侧宽度自适应
// scss
.box {
	display: flex;
	height: 100%;
	.blue {
		width: 260px;
		height: 100%;
		min-width: 200px;
		position: relative;
		.x-resizer {
			position: absolute;
			top:0;
			right:0;
			z-index:1;
			width:4px;
			height: 100%;
			background: transparent;
			cursor:col-resize;
		}
	}
	.gray {
		min-width:35%
		flex: 1;
	}
}
  • 定义一个拖拽的元素跟蓝色块的有边框吸附,宽度4px,高度和蓝色块一样高,吸附在蓝色块右侧,用于拖拽的目标元素
  1. 拖拽事件响应
<template>
	<xxx-nav-bar class="blue" :style="{'width': `${lastX}px`}">
		<div class="x-resizer" @mousedown="mouseDownEvt"></div>
	</xxx-nav-bar>
	<xxx-content class="gray"/>
</template>
export default {
  data () {
    return {
      leftBarWidth: 260,
      startX: 0,
      lastX: 260
    }
  },
  methods: {
    mouseDown(e) {
      this.startX = e.clientX
      this.mouseMove(e)
      this.mouseUp()
      document.addEventListener('mousemove', this.mouseMove, true)
      document.addEventListener('mouseup', this.mouseUp, true)
    },
    mouseUp () {
      this.leftBarWidth = this.lastX
      document.removeEventListener('mousemove', this.mouseMove, true)
      document.removeEventListener('mouseup', this.mouseUp, true)
    },
    mouseMove (moveEvent) {
      moveEvent.preventDefault()
      moveEvent.stopPropagation()
      const offset = moveEvent.clientX - this.startX
      if (this.offset !== 0) {
        this.lastX = offset + this.leftBarWidth
      }
    }
  }
}

over

Vue 3实现拖动改变元素宽度实现宽度自适应的方法如下: 1. 首先,创建一个可拖动的元素,可以使用HTML的`<div>`标签,并给它一个固定的宽度。 2. 在Vue组件,使用`@mousedown`事件监听鼠标按下的动作,并绑定一个方法来处理拖动事件。 3. 在这个方法,使用`@mousemove`和`@mouseup`事件来监听鼠标移动和释放的动作,并绑定对应的方法来处理。 4. 在鼠标按下时,记录下鼠标的初始位置和元素的初始宽度。 5. 在鼠标移动时,计算鼠标移动的距离,并根据这个距离计算出新的元素宽度。 6. 更新元素的宽度,可以使用Vue的响应式数据或者直接操作DOM元素。 下面是一个示例代码: ```html <template> <div class="draggable" :style="{ width: width + 'px' }" @mousedown="startDragging"> <!-- 内容 --> </div> </template> <script> export default { data() { return { startX: 0, startWidth: 0, width: 200, // 初始宽度 }; }, methods: { startDragging(event) { this.startX = event.clientX; this.startWidth = this.width; document.addEventListener('mousemove', this.drag); document.addEventListener('mouseup', this.stopDragging); }, drag(event) { const dx = event.clientX - this.startX; this.width = this.startWidth + dx; }, stopDragging() { document.removeEventListener('mousemove', this.drag); document.removeEventListener('mouseup', this.stopDragging); }, }, }; </script> <style scoped> .draggable { border: 1px solid #ccc; cursor: col-resize; } </style> ``` 这样,当你拖动可拖动元素时,它的宽度会随着鼠标的移动而改变,并实现宽度自适应效果。注意,在实际项目,你可能需要根据需求对代码进行适当的修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值