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 相关文章推荐
Javascript 阻止javascript事件冒泡,获取控件ID值
Jun 27 Javascript
js 巧妙去除数组中的重复项
Jan 25 Javascript
关于图片按比例自适应缩放的js代码
Oct 30 Javascript
jquery如何通过name名称获取当前name的value值
Dec 20 Javascript
node.js中的require使用详解
Dec 15 Javascript
vue.js中过滤器的使用教程
Jun 08 Javascript
鼠标拖动改变DIV等网页元素的大小的实现方法
Jul 06 Javascript
使用Angular CLI从蓝本生成代码详解
Mar 24 Javascript
javascript关于“时间”的一次探索
Jul 24 Javascript
React生命周期原理与用法踩坑笔记
Apr 28 Javascript
vue 使用lodash实现对象数组深拷贝操作
Sep 10 Javascript
JavaScript中Object、map、weakmap的区别分析
Dec 15 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的FTP学习(一)[转自奥索]
2006/10/09 PHP
PHP文件上传实例详解!!!
2007/01/02 PHP
Win2003服务器安全加固设置--进一步提高服务器安全性
2007/05/23 PHP
php 批量替换html标签的实例代码
2013/11/26 PHP
PHP+MySQL存储数据常见中文乱码问题小结
2016/06/13 PHP
Zend Framework入门教程之Zend_View组件用法示例
2016/12/09 PHP
laravel5实现微信第三方登录功能
2018/12/06 PHP
PHP 构造函数和析构函数原理与用法分析
2020/04/21 PHP
javascript实现动态增加删除表格行(兼容IE/FF)
2007/04/02 Javascript
javascript Discuz代码中的msn聊天小功能
2008/05/25 Javascript
通过DOM脚本去设置样式信息
2010/09/19 Javascript
js实现页面跳转重定向的几种方式
2014/05/29 Javascript
js获取内联样式的方法
2015/01/27 Javascript
JS简单模拟触发按钮点击功能的方法
2015/11/30 Javascript
jQuery Validation PlugIn的使用方法详解
2015/12/18 Javascript
基于javascript实现彩票随机数生成(升级版)
2020/04/17 Javascript
浅谈js中的延迟执行和定时执行
2016/05/31 Javascript
IE8利用自带的setCapture和releaseCapture解决iframe的拖拽事件方法
2016/10/25 Javascript
jquery中用函数来设置css样式
2016/12/22 Javascript
微信小程序使用gitee进行版本管理
2018/09/20 Javascript
JS实现在线ps功能详解
2019/07/31 Javascript
使用layui定义一个模块并使用的例子
2019/09/14 Javascript
[00:13]天涯墨客二技能展示
2018/08/25 DOTA
Python实现扣除个人税后的工资计算器示例
2018/03/26 Python
dataframe设置两个条件取值的实例
2018/04/12 Python
每天迁移MySQL历史数据到历史库Python脚本
2018/04/13 Python
Selenium alert 弹窗处理的示例代码
2020/08/06 Python
Python获取android设备cpu和内存占用情况
2020/11/15 Python
matplotlib绘制鼠标的十字光标的实现(内置方式)
2021/01/06 Python
Linux操作面试题
2015/02/11 面试题
检察官就职演讲稿
2014/01/13 职场文书
团日活动总结范文
2014/04/25 职场文书
初中升旗仪式演讲稿
2014/05/08 职场文书
超市店庆活动方案
2014/08/31 职场文书
小学二年级语文教学反思
2016/03/03 职场文书
MySQL 如何设计统计数据表
2021/06/15 MySQL