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 相关文章推荐
jQuery 过滤not()与filter()实例代码
May 10 Javascript
使用jQuery Ajax功能时需要注意的一个问题(内存溢出)
May 30 Javascript
extjs render 用法介绍
Sep 11 Javascript
js/jquery去掉空格,回车,换行示例代码
Nov 05 Javascript
js判断是否为ie的方法小结
Jan 13 Javascript
easyui form validate总是返回false的原因及解决方法
Nov 07 Javascript
Vue 短信验证码组件开发详解
Feb 14 Javascript
详解Node.js项目APM监控之New Relic
May 12 Javascript
前端构建工具之gulp的语法教程
Jun 12 Javascript
vue使用高德地图根据坐标定位点的实现代码
Aug 22 Javascript
react-router-dom 嵌套路由的实现
May 02 Javascript
解决Vue的项目使用Element ui 走马灯无法实现的问题
Aug 03 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公用函数列表[正则]
2007/02/22 PHP
关于Aptana Studio生成自动备份文件的解决办法
2009/12/23 Javascript
Dom 是什么的详细说明
2010/10/25 Javascript
javascript+canvas制作九宫格小程序
2014/12/28 Javascript
jQuery Mobile 触摸事件实例
2016/06/04 Javascript
jQuery获取select选中的option的value值实现方法
2016/08/29 Javascript
javascript中href和replace的比较(详解)
2016/11/25 Javascript
js实现用户输入的小写字母自动转大写字母的方法
2017/01/21 Javascript
AngularJS路由实现页面跳转实例
2017/03/03 Javascript
javascript使用btoa和atob来进行Base64转码和解码
2017/03/20 Javascript
AngularJS中的promise用法分析
2017/05/19 Javascript
详解Layer弹出层样式
2017/08/21 Javascript
纯js实现隔行变色效果
2017/11/29 Javascript
解决webpack无法通过IP地址访问localhost的问题
2018/02/22 Javascript
详解ES6通过WeakMap解决内存泄漏问题
2018/03/09 Javascript
vue 设置proxyTable参数进行代理跨域
2018/04/09 Javascript
js设计模式之代理模式及订阅发布模式实例详解
2019/08/15 Javascript
详解小程序云开发攻略(解决最棘手的问题)
2019/09/30 Javascript
vue实现配置全局访问路径头(axios)
2019/11/01 Javascript
Vue.js获取手机系统型号、版本、浏览器类型的示例代码
2020/05/10 Javascript
用Python实现换行符转换的脚本的教程
2015/04/16 Python
python构建深度神经网络(续)
2018/03/10 Python
pandas修改DataFrame列名的实现方法
2019/02/22 Python
简单了解python数组的基本操作
2019/11/26 Python
解决pytorch DataLoader num_workers出现的问题
2020/01/14 Python
python画图常规设置方式
2020/03/05 Python
浅谈numpy中np.array()与np.asarray的区别以及.tolist
2020/06/03 Python
Bench加拿大官方网站:英国城市服装品牌
2017/11/03 全球购物
罗兰·穆雷官网:Roland Mouret
2018/09/28 全球购物
汽车促销活动方案
2014/03/31 职场文书
基层党组织建设整改方案
2014/09/16 职场文书
五四青年节比赛演讲稿
2015/03/18 职场文书
公司市场部岗位职责
2015/04/15 职场文书
餐厅服务员管理制度
2015/08/05 职场文书
MySQL快速插入一亿测试数据
2021/06/23 MySQL
windows系统搭建WEB服务器详细教程
2022/08/05 Servers