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打造省市下拉框联动效果
May 18 Javascript
JS实现选项卡实例详解
Nov 17 Javascript
基于jQuery实现放大镜特效
Oct 19 Javascript
JS面向对象编程详解
Mar 06 Javascript
js贪吃蛇游戏实现思路和源码
Apr 14 Javascript
实例详解jQuery的无new构建
Aug 02 Javascript
Vue.js开发环境搭建
Nov 10 Javascript
基于javascript实现的快速排序
Dec 02 Javascript
微信小程序中使用Promise进行异步流程处理的实例详解
Aug 17 Javascript
获取本机IP地址的实例(JavaScript / Node.js)
Nov 24 Javascript
详解关于JSON.parse()和JSON.stringify()的性能小测试
Mar 14 Javascript
使用easyui从servlet传递json数据到前端页面的两种方法
Sep 05 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
解决phpmyadmin 乱码,支持gb2312和utf-8
2006/11/20 PHP
header中Content-Disposition的作用与使用方法
2012/06/13 PHP
php自动识别文字编码并转换为目标编码的方法
2015/08/08 PHP
PHP实现微信公众号验证Token的示例代码
2019/12/16 PHP
扩展JavaScript功能的正确方法(译文)
2012/04/12 Javascript
JS字符串拼接在ie中都报错的解决方法
2014/03/27 Javascript
jQuery选择器源码解读(二):select方法
2015/03/31 Javascript
jquery实现美观的导航菜单鼠标提示特效代码
2015/09/06 Javascript
jQuery实现Meizu魅族官方网站的导航菜单效果
2015/09/14 Javascript
使用nodejs下载风景壁纸
2017/02/05 NodeJs
JavaScript Drum Kit 指南(纯 JS 模拟敲鼓效果)
2017/07/23 Javascript
微信小程序实现多个按钮的颜色状态转换
2019/02/15 Javascript
javascript中join方法实例讲解
2019/02/21 Javascript
vue实现日历备忘录功能
2020/09/24 Javascript
微信小程序实现电子签名并导出图片
2020/05/27 Javascript
python实现根据窗口标题调用窗口的方法
2015/03/13 Python
利用Python自带PIL库扩展图片大小给图片加文字描述的方法示例
2017/08/08 Python
python3.x上post发送json数据
2018/03/04 Python
pygame游戏之旅 载入小车图片、更新窗口
2018/11/20 Python
Python爬虫beautifulsoup4常用的解析方法总结
2019/02/25 Python
python  文件的基本操作 菜中菜功能的实例代码
2019/07/17 Python
用django设置session过期时间的方法解析
2019/08/05 Python
Pytorch之Variable的用法
2019/12/31 Python
TensorFlow自定义损失函数来预测商品销售量
2020/02/05 Python
基于Numba提高python运行效率过程解析
2020/03/02 Python
python定时截屏实现
2020/11/02 Python
Perfume’s Club美国官网:西班牙第一家在线美容店
2020/06/10 全球购物
探亲邀请信范文
2014/01/30 职场文书
银行批评与自我批评
2014/02/10 职场文书
消防先进事迹材料
2014/02/10 职场文书
党建示范点实施方案
2014/03/12 职场文书
献爱心活动总结
2014/05/07 职场文书
小学生2015教师节演讲稿
2015/03/19 职场文书
复兴之路展览观后感
2015/06/02 职场文书
2019年工作总结范文
2019/05/21 职场文书
解决linux下redis数据库overcommit_memory问题
2022/02/24 Redis