vue中实现拖动调整左右两侧div的宽度的示例代码


Posted in Javascript onJuly 22, 2020

写在最前

最近在使用vue的时候,遇到一个需求,实现左右div可通过中间部分拖拽调整宽度,类似于这样

vue中实现拖动调整左右两侧div的宽度的示例代码

这是我最终的实现效果

vue中实现拖动调整左右两侧div的宽度的示例代码

还是老话,因为我不是专业的前端工程师,只是兼职写一些简单的前端,所以这个功能的实现得益于以下博客,《vue 拖动调整左右两侧div的宽度》、《vuejs中拖动改变元素宽度实现宽度自适应大小》,而我只是针对于他们提供的代码,加了亿点点自己所需要的细节。

实现原理

vue中实现拖动调整左右两侧div的宽度的示例代码

如上图所示,我们需要将要实现此功能的页面划分为三个部分,左部、调整区、右部,分别对应css样式为left、resize、mid,然后将这三个div放在css样式为box的div中即可

实现代码-HTML部分

将以下代码放置在vue页面文件中<templete></templete>标签内即可

<div class="box" ref="box">
   <div class="left">
    <!--左侧div内容-->
   </div>
   <div class="resize" title="收缩侧边栏">
    ⋮
   </div>
   <div class="mid">
    <!--右侧div内容-->
   </div>
  </div>

实现代码-CSS部分

将以下代码放置在<style> </style>标签内中即可

/* 拖拽相关样式 */
 /*包围div样式*/
 .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(32% - 10px); /*左侧初始化宽度*/ 
  height: 100%;
  background: #FFFFFF;
  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'样式*/
 .mid {
  float: left;
  width: 68%; /*右侧初始化宽度*/
  height: 100%;
  background: #fff;
  box-shadow: -1px 4px 5px 3px rgba(0, 0, 0, 0.11);
 }

实现代码-拖拽事件部分

将以下代码放置在methods方法区即可

dragControllerDiv: function () {
    var resize = document.getElementsByClassName('resize');
    var left = document.getElementsByClassName('left');
    var mid = document.getElementsByClassName('mid');
    var box = document.getElementsByClassName('box');
    for (let i = 0; i < resize.length; i++) {
     // 鼠标按下事件
     resize[i].onmousedown = function (e) {
      //颜色改变提醒
      resize[i].style.background = '#818181';
      var startX = e.clientX;
      resize[i].left = resize[i].offsetLeft;
      // 鼠标拖动事件
      document.onmousemove = function (e) {
       var endX = e.clientX;
       var moveLen = resize[i].left + (endX - startX); // (endx-startx)=移动的距离。resize[i].left+移动的距离=左边区域最后的宽度
       var maxT = box[i].clientWidth - resize[i].offsetWidth; // 容器宽度 - 左边区域的宽度 = 右边区域的宽度

       if (moveLen < 32) moveLen = 32; // 左边区域的最小宽度为32px
       if (moveLen > maxT - 150) moveLen = maxT - 150; //右边区域最小宽度为150px

       resize[i].style.left = moveLen; // 设置左侧区域的宽度

       for (let j = 0; j < left.length; j++) {
        left[j].style.width = moveLen + 'px';
        mid[j].style.width = (box[i].clientWidth - moveLen - 10) + 'px';
       }
      };
      // 鼠标松开事件
      document.onmouseup = function (evt) {
       //颜色恢复
       resize[i].style.background = '#d6d6d6';
       document.onmousemove = null;
       document.onmouseup = null;
       resize[i].releaseCapture && resize[i].releaseCapture(); //当你不在需要继续获得鼠标消息就要应该调用ReleaseCapture()释放掉
      };
      resize[i].setCapture && resize[i].setCapture(); //该函数在属于当前线程的指定窗口里设置鼠标捕获
      return false;
     };
    }
   },

然后在mouted初始化加载部分添加即可

this.dragControllerDiv();

结语

虽然以上代码就可以实现左右div拖拽放大缩小了,但是实际应用中我遇到了一个更棘手的问题,那就是如果在某一个div中使用iframe框架的话,拖拽时会存在明显的卡顿,如果你在使用过程中遇到这个问题,可以查看我的下一篇文章vue中解决拖拽改变存在iframe的div大小时卡顿问题

到此这篇关于vue中实现拖动调整左右两侧div的宽度的示例代码的文章就介绍到这了,更多相关vue 拖动调整左右两侧div宽度内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
select组合框option的捕捉实例代码
Sep 30 Javascript
js限制文本框输入长度两种限制方式(长度、字节数)
Dec 19 Javascript
jquery实现textarea输入框限制字数的方法
Jan 15 Javascript
jquery事件preventDefault()方法用法实例
Jan 16 Javascript
ES6 Promise对象概念与用法分析
Apr 01 Javascript
js微信应用场景之微信音乐相册案例分享
Aug 11 Javascript
vue addRoutes实现动态权限路由菜单的示例
May 15 Javascript
详解mpvue小程序中怎么引入iconfont字体图标
Oct 01 Javascript
js实现按钮开关单机下拉菜单效果
Nov 22 Javascript
RxJS的入门指引和初步应用
Jun 15 Javascript
vue选项卡切换登录方式小案例
Sep 27 Javascript
Array.filter中如何正确使用Async
Nov 04 Javascript
在vue中实现禁止回退上一步,路由不存历史记录
Jul 22 #Javascript
vue项目中使用多选框的实例代码
Jul 22 #Javascript
vue中el-input绑定键盘按键(按键修饰符)
Jul 22 #Javascript
解决VUE-Router 同一页面第二次进入不刷新的问题
Jul 22 #Javascript
js实现查询商品案例
Jul 22 #Javascript
vue element 关闭当前tab 跳转到上一路由操作
Jul 22 #Javascript
eslint+prettier统一代码风格的实现方法
Jul 22 #Javascript
You might like
php牛逼的面试题分享
2013/01/18 PHP
解析如何在PHP下载文件名中解决乱码的问题
2013/06/20 PHP
PHP中把stdClass Object转array的几个方法
2014/05/08 PHP
php使用递归计算文件夹大小
2014/12/24 PHP
Laravel 5.4.36中session没有保存成功问题的解决
2018/02/19 PHP
使用swoole 定时器变更超时未支付订单状态的解决方案
2019/07/24 PHP
取选中的radio的值
2010/01/11 Javascript
javascript parseInt与Number函数的区别
2010/01/21 Javascript
Jquery Select操作方法集合脚本之家特别版
2010/05/17 Javascript
JavaScript版DateAdd和DateDiff函数代码
2012/03/01 Javascript
jquery实现marquee效果(文字或者图片的水平垂直滚动)
2013/01/07 Javascript
JS获取随机数和时间转换的简单实例
2016/07/10 Javascript
React路由管理之React Router总结
2018/05/10 Javascript
Vue-component全局注册实例
2018/09/06 Javascript
深入Node TCP模块的理解
2019/03/13 Javascript
webpack4 从零学习常用配置(小结)
2019/05/28 Javascript
浅谈Vue项目骨架屏注入实践
2019/08/05 Javascript
vue实现PC端分辨率适配操作
2020/08/03 Javascript
VUE中V-IF条件判断改变元素的样式操作
2020/08/09 Javascript
解析Python中的变量、引用、拷贝和作用域的问题
2015/04/07 Python
基于Linux系统中python matplotlib画图的中文显示问题的解决方法
2017/06/15 Python
Python信息抽取之乱码解决办法
2017/06/29 Python
python实现随机梯度下降(SGD)
2020/03/24 Python
python实现媒体播放器功能
2018/02/11 Python
python按行读取文件,去掉每行的换行符\n的实例
2018/04/19 Python
Python3爬虫中关于Ajax分析方法的总结
2020/07/10 Python
LTD Commodities:礼品,独特发现,家居装饰,家用器皿
2017/08/11 全球购物
有机童装:Toby Tiger
2018/05/23 全球购物
小学家长会邀请函
2014/01/23 职场文书
书香校园活动方案
2014/02/28 职场文书
信息管理专业自荐书
2014/06/05 职场文书
安全目标管理责任书
2014/07/25 职场文书
创先争优演讲稿
2014/09/15 职场文书
安全先进个人材料
2014/12/29 职场文书
中学生社区服务活动报告
2015/02/05 职场文书
春风化雨观后感
2015/06/11 职场文书