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数据表格插件
Jul 17 Javascript
纯CSS打造的导航菜单(附jquery版)
Aug 07 Javascript
深入理解Javascript闭包 新手版
Dec 28 Javascript
javaScript arguments 对象使用介绍
Oct 18 Javascript
Bootstrap基础学习
Jun 16 Javascript
使用Raygun来自动追踪AngularJS中的异常
Jun 23 Javascript
详解jQuery中基本的动画方法
Dec 14 Javascript
深入学习jQuery中的data()
Dec 22 Javascript
AngularJS $http post 传递参数数据的方法
Oct 09 Javascript
ZK中使用JS读取客户端txt文件内容问题
Nov 07 Javascript
webpack+express实现文件精确缓存的示例代码
Jun 11 Javascript
前端vue+elementUI如何实现记住密码功能
Sep 20 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
德生S2000南麂列岛台湾FM收听记录
2021/03/02 无线电
SONY ICF-SW7600的电路分析
2021/03/02 无线电
解析PHP中数组元素升序、降序以及重新排序的函数
2013/06/20 PHP
PHP批量检测并去除文件BOM头代码实例
2014/05/08 PHP
php抓取网站图片并保存的实现方法
2015/10/29 PHP
PHP生成各种常见验证码和Ajax验证过程
2016/01/10 PHP
yum命令安装php7和相关扩展
2016/07/04 PHP
PHP实现统计在线人数功能示例
2016/10/15 PHP
PHP+Apache实现二级域名之间共享cookie的方法
2019/07/24 PHP
Array对象方法参考
2006/10/03 Javascript
jQuery maxlength文本字数限制插件
2010/04/16 Javascript
jquery链式操作的正确使用方法
2014/01/06 Javascript
JQuery中extend使用介绍
2014/03/13 Javascript
原生js事件的添加和删除的封装
2014/07/01 Javascript
jQuery使用$.get()方法从服务器文件载入数据实例
2015/03/25 Javascript
jquery ajax后台返回list,前台用jquery遍历list的实现
2016/10/30 Javascript
Express+Nodejs 下的登录拦截实现代码
2017/07/01 NodeJs
详解使用angular的HttpClient搭配rxjs
2017/09/01 Javascript
JS实现左边列表移到到右边列表功能
2018/03/28 Javascript
vue项目引入字体.ttf的方法
2018/09/28 Javascript
如何能分清npm cnpm npx nvm
2019/01/17 Javascript
微信小程序实现多选框功能的实例代码
2020/06/24 Javascript
Python基于Tkinter实现的记事本实例
2015/06/17 Python
使用PyInstaller将Python程序文件转换为可执行程序文件
2016/07/08 Python
python 容器总结整理
2017/04/04 Python
Python3.7 读取 mp3 音频文件生成波形图效果
2019/11/05 Python
python3中calendar返回某一时间点实例讲解
2020/11/18 Python
使用CSS3设计地图上的雷达定位提示效果
2016/04/05 HTML / CSS
开工仪式主持词
2014/03/20 职场文书
巴西世界杯32强口号
2014/06/05 职场文书
医院保洁服务方案
2014/06/11 职场文书
历史学专业求职信
2014/06/19 职场文书
安全伴我行演讲稿
2014/09/04 职场文书
2014年双拥工作总结
2014/11/21 职场文书
彩虹社八名人气艺人全新周边限时推出,性转女装男装一次拥有!
2022/04/01 日漫
MySQL的存储过程和相关函数
2022/04/26 MySQL