vue中实现拖动调整左右两侧div的宽度的示例代码
作者:lngrid ln grid 发布时间:2024-04-27 16:02:36
标签:vue,拖动,左右,div宽度
写在最前
最近在使用vue的时候,遇到一个需求,实现左右div可通过中间部分拖拽调整宽度,类似于这样
这是我最终的实现效果
还是老话,因为我不是专业的前端工程师,只是兼职写一些简单的前端,所以这个功能的实现得益于以下博客,《vue 拖动调整左右两侧div的宽度》、《vuejs中拖动改变元素宽度实现宽度自适应大小》,而我只是针对于他们提供的代码,加了亿点点自己所需要的细节。
实现原理
如上图所示,我们需要将要实现此功能的页面划分为三个部分,左部、调整区、右部,分别对应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大小时卡顿问题
来源:https://www.cnblogs.com/ingrid/p/12766457.html


猜你喜欢
- 实验环境1.安装Python 3.72.安装requests, bs4,pymysql 模块实验步骤1.安装环境及模块可参考https://
- 1. assert函数说明:Assert statements are a convenient way to insert debuggi
- 一、前情提要为什么要使用Scrapy 框架?前两篇深造篇介绍了多线程这个概念和实战多线程网页爬取多线程爬取网页项目实战经过之前的学习,我们基
- 之前用Python 2.7版本的httplib做接口测试时,运行代码都是正常的,最近开始用Python 3.3之后,再去看以前的代码,发现i
- 初学python,对python的对齐很重视,为了防止出错,使用spyder工具提供的功能下面是方法:1、首先打开Tools菜单栏下的Pre
- 作为一个新手,你需要以下3个步骤:1、用户注册 > 2、获取token > 3、调取数据数据内容:包含股票、基金、期货、债券、外
- 这次主要是爬了京东上一双鞋的相关评论:将数据保存到excel中并可视化展示相应的信息主要的python代码如下:文件1#将excel中的数据
- 纯JS五子棋(各浏览器兼容)效果图: 代码下载HTML代码<!DOCTYPE html> <html> &
- 经常用mysql的人可能会遇到下面几种情况:1、我字段类型是not null,为什么我可以插入空值2、为什么not null的效率比null
- 在上一篇博客中,已经将环境搭建好了。现在,我们利用搭建的环境来运行一条测试脚本,脚本中启动一个计算器的应用,并实现加法的运算。创建模拟器在运
- 1. 过滤器Python 具有通过列表解析 将列表映射到其它列表的强大能力。这种能力同过滤机制结合使用,使列表中的有些元素被映射的同时跳过另
- DataFrame对象本质上是带有行列索引的二维矩阵,所以欲对DataFrame对象进行转置操作,需要交换行列索引,同时使二维矩阵转置。首先
- 所以以 create_time datetime default now() 的形式设置默认值是不可能的。 代替的方案是使用TIMESTAM
- 一、缺失数据剔除1. python 方式获取所有的缺失值,返回一个 true 和 false 的表df.isnull()统计缺失值,按照每一
- 一、什么是MQTTMQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/
- 一、Go语言下载go语言官方下载地址:https://golang.org/dl/找到适合你系统的版本下载,本人下载的是windows版本。
- Birdseye是一个Python调试器,它在函数调用中记录表达式的值,并让你在函数退出后轻松查看它们,例如:无论你如何运行或编辑代码,都可
- 语言的问题,见仁见智,基本上属于信仰,无法强求一致。不过作为Python的爱好者,我想在这里为Python做一点辩护。就语法来看,Pytho
- 如下所示:import ( "golang.org/x/net/html")在使用此包时,会导入失败,因为这
- REPLACE用第三个表达式替换第一个字符串表达式中出现的所有第二个给定字符串表达式。语法REPLACE ( ''strin