vue实现左右两栏布局宽度可拖拽

项目里需要左右两栏布局根据内容多少可以用户自己拖拽宽度的需求

找了文章参考了下,但都没有实现我要的效果,所以结合调整了一下,记录一下我自己用到的效果
参考文章放下面了,感谢两位大佬

vue拖拽

html实现拖拽

最终效果实现如下:鼠标左右拖动中间滚动条可以改变左右两边的宽度
在这里插入图片描述

代码如下

<template>
  <div class="box" id="box" ref="box">
    <div class="left" id="left">左侧div内容</div>
    <div class="resize" id="resize" title="收缩侧边栏"></div>
    <div class="right" id="right">右侧div内容</div>
  </div>
</template>
<script>
export default {
  data() {
    return {};
  },
  mounted() {
    this.dragControllerDiv();
  },
  methods: {
    dragControllerDiv() {
      let resize = document.getElementById("resize");
      let left = document.getElementById("left");
      let right = document.getElementById("right");
      let box = document.getElementById("box");

      // 鼠标按下事件
      resize.onmousedown = function (e) {
        // 记录坐标起始位置
        let startX = e.clientX;

        // 左边元素起始宽度
        resize.left = left.offsetWidth;
        console.log("宽度:", resize.left);
        // 鼠标拖动事件
        document.onmousemove = function (e) {
          // 鼠标拖动的终止位置
          let endX = e.clientX;

          // (endx-startx)= 移动的距离
          //  resize.left + 移动的距离 = 左边区域最后的宽度
          let moveLen = resize.left + (endX - startX);
          console.log(moveLen);

          // 左右两边区域的总宽度 = 大容器宽度 - 中间区域拖拉框的宽度
          let maxWidth = box.clientWidth - resize.offsetWidth;

          // 限制左边区域的最小宽度为30px
          if (moveLen < 30) moveLen = 30;

          // 右边区域最小宽度为 150px 限制左边区域到150后不能再拉宽
          if (moveLen > maxWidth - 420) moveLen = maxWidth - 420;

          // 设置左边区域的宽度,通过换算为百分比的形式,实现窗体放大缩小自适应
          console.log((moveLen / maxWidth) * 100);
          // left.style.width =(moveLen / maxWidth * 100) + '%';
          left.style.width = moveLen + "px";

          // 右边区域即是总大小 - 左边宽度 - 拖动条宽度
          console.log(((maxWidth - moveLen) / maxWidth) * 100);
          right.style.width = maxWidth - moveLen + "px";
          console.log(moveLen);
        };
        // 鼠标松开事件
        document.onmouseup = function (evt) {
          console.log(11);
          document.onmousemove = null;
          document.onmouseup = null;
          resize.releaseCapture && resize.releaseCapture(); //当你不在需要继续获得鼠标消息就要应该调用ReleaseCapture()释放掉
        };
        resize.setCapture && resize.setCapture(); //该函数在属于当前线程的指定窗口里设置鼠标捕获
        return false;
      };
    },
  },
};
</script>
<style lang="scss" scoped>
/* 拖拽相关样式 */
.box {
  width: 100%;
  height: 100%;
  margin: 1% 0px;
  overflow: hidden;
  box-shadow: -1px 9px 10px 3px rgba(0, 0, 0, 0.11);
}
/*左侧div样式*/
.left {
  width: calc(50% - 10px); /*左侧初始化宽度*/
  height: 100%;
  background: red;
  float: left;
}
/*拖拽区div样式*/
.resize {
  cursor: col-resize;
  float: left;
  position: relative;
  top: 45%;
  background-color: #d6d6d6;
  border-radius: 5px;
  margin-top: -10px;
  width: 10px;
  height: 50px;
  background-size: cover;
  background-position: center;
  /*z-index: 99999;*/
  font-size: 32px;
  color: white;
}
/*拖拽区鼠标悬停样式*/
.resize:hover {
  color: #444444;
}
/*右侧div'样式*/
.right {
  float: left;
  width: 50%; /*右侧初始化宽度*/
  height: 100%;
  background: blue;
  box-shadow: -1px 4px 5px 3px rgba(0, 0, 0, 0.11);
}
</style>
  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
对于vue实现拖拽宽度的菜单,可以使用vuedraggable插件和vue-resizable插件。 vuedraggable插件可以实现拖拽排序的功能,而vue-resizable插件可以实现拖拽改变元素大小的功能。 以下是一个简单的实现示例: 1. 安装vuedraggable和vue-resizable插件 ``` npm install vuedraggable vue-resizable ``` 2. 在组件中引入插件并初始化 ``` <template> <div class="menu"> <vue-draggable v-model="menuItems"> <div v-for="(item, index) in menuItems" :key="index" class="menu-item"> <vue-resizable :resizable="true" :on-resize-stop="resize" :max-width="200" :min-width="100"> {{ item }} </vue-resizable> </div> </vue-draggable> </div> </template> <script> import draggable from 'vuedraggable' import resizable from 'vue-resizable' export default { components: { 'vue-draggable': draggable, 'vue-resizable': resizable }, data () { return { menuItems: ['Item 1', 'Item 2', 'Item 3', 'Item 4', 'Item 5'] } }, methods: { resize (event) { console.log(event) } } } </script> ``` 在上面的代码中,使用了vuedraggable组件来包裹菜单项,使用了vue-resizable组件来包裹每个菜单项,并设置了最大和最小宽度,并在on-resize-stop事件中调用了resize方法。 3. 样式设置 为了使菜单项可拖拽和可改变大小,需要为其设置一些基本样式: ``` .menu { display: flex; flex-wrap: wrap; justify-content: flex-start; } .menu-item { display: flex; align-items: center; justify-content: center; margin: 10px; padding: 10px; background-color: #ccc; border: 1px solid #000; cursor: move; } ``` 在上面的样式中,设置了菜单项为flex布局,并设置了一些基本样式,如背景色、边框等。 这样就可以实现一个简单的可拖拽和可改变大小的菜单了。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值