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的Ajax时无响应数据的解决方法
May 25 Javascript
jQeury淡入淡出需要注意的问题
Sep 08 Javascript
JavaScript中两个感叹号的作用说明
Dec 28 Javascript
ajax java 实现自动完成功能
Dec 19 Javascript
JavaScript中判断对象类型的几种方法总结
Nov 11 Javascript
Node调试工具JSHint的安装及配置教程
May 27 Javascript
bootstarp modal框居中显示的实现代码
Feb 18 Javascript
vue实现简单的MVVM框架
Aug 05 Javascript
JS实现判断移动端PC端功能
Feb 21 Javascript
使用vue-cli3+typescript的项目模板创建工程的教程
Feb 28 Javascript
vue-video-player实现实时视频播放方式(监控设备-rtmp流)
Aug 10 Javascript
Vue+Element自定义纵向表格表头教程
Oct 26 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正则提取html图片(img)src地址与任意属性的方法
2017/02/08 PHP
php获取ajax的headers方法与内容实例
2017/12/27 PHP
用js来获取上传的文件名纯粹是为了美化而用
2013/10/23 Javascript
js取消单选按钮选中示例代码
2013/11/14 Javascript
zeroclipboard 单个复制按钮和多个复制按钮的实现方法
2014/06/14 Javascript
基于jQuery的图片不完全按比例自动缩小
2014/07/11 Javascript
Javascript 拖拽雏形中的一些问题(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
详细分析JavaScript变量类型
2015/07/08 Javascript
Angular实现购物车计算示例代码
2017/02/21 Javascript
js排序与重组的实例讲解
2017/08/28 Javascript
vue2组件之select2调用的示例代码
2017/10/12 Javascript
iview日期控件,双向绑定日期格式的方法
2018/03/15 Javascript
vue实现歌手列表字母排序下拉滚动条侧栏排序实时更新
2019/05/14 Javascript
使用axios发送post请求,将JSON数据改为form类型的示例
2019/10/31 Javascript
微信小程序swiper实现文字纵向轮播提示效果
2020/01/21 Javascript
[04:00]DOTA2解说界神雕侠侣 CJ第四天谷子现场过生日
2013/07/30 DOTA
python爬虫入门教程--快速理解HTTP协议(一)
2017/05/25 Python
Python 实现数据库(SQL)更新脚本的生成方法
2017/07/09 Python
python的pdb调试命令的命令整理及实例
2017/07/12 Python
python学习--使用QQ邮箱发送邮件代码实例
2019/04/16 Python
Python上下文管理器全实例详解
2019/11/12 Python
python 控制台单行刷新,多行刷新实例
2020/02/19 Python
python编写softmax函数、交叉熵函数实例
2020/06/11 Python
Python图像识别+KNN求解数独的实现
2020/11/13 Python
Pandas中两个dataframe的交集和差集的示例代码
2020/12/13 Python
详解CSS的border边框属性及其在CSS3中的新特性
2016/05/10 HTML / CSS
CSS3 二级导航菜单的制作的示例
2018/04/02 HTML / CSS
世界闻名的衬衫制造商:Savile Row Company
2018/07/30 全球购物
迷你分体式空调:SoGoodToBuy
2018/08/07 全球购物
苏格兰在线威士忌商店:The Whisky Barrel
2019/05/07 全球购物
英国在线玫瑰专家:InterRose
2019/12/01 全球购物
致接力运动员广播稿
2014/02/17 职场文书
2014年单位法制宣传日活动总结
2014/11/01 职场文书
大学教师个人总结
2015/02/10 职场文书
2016个人廉洁自律承诺书
2016/03/25 职场文书
用Python实现屏幕截图详解
2022/01/22 Python