web实现drag拖拽布局
这种拖拽布局功能其实在电脑操作系统或者桌面应用里面是经常使用的基础功能,只是有时候在进行web开发的时候,对这个功能需求量不够明显,但却是很好用,也很实用。能够让用户自己拖拽布局,方便查看某个区域更多内容,这一点足够吸引人的。
这里用原生实现这个特殊的拖拽布局功能,可以作为参考和学习使用。话不多说,先看看实现的静态效果和动态效果。
静态效果:

动态效果:

为了查看更佳效果,需要把源码在浏览器上运行起来。另一个值得关心的事项:案例中左右盒子是可以完全拖拽关闭的,也就是宽度为0px。实际应用中可能不需要这种效果,没关系,可以限制左右盒子的最小宽度,判断小于最小宽度就不再进行缩小即可,放大限制 也是类似的。
实现原理
想象一下,拖拽布局一般都需要两个div盒子,同时需要一个可以拖拽的class=resize盒子(以下简称resize),它们都是块元素。然后加上HTML标签和css的基础左右布局样式,大致轮廓就出来了。
到这里还没有实现拖拽resize布局逻辑,接着往下看。
拖拽resize原理分析:
当用户把鼠标移动到resize盒子上面,此时出现可以左右拖拽的标识,这个标识可以用css的cursor: w-resize来实现。
如果用户按下鼠标左键,可以监听鼠标按下事件,获得鼠标按下的startX = evt.clientX,也能获得resize相对于父元素的左偏移值offsetLeft。
resizeBar.onmousedown(evt) {var startX = e.clientX;resizeBar.left = resizeBar.offsetLeft;}
如果用户按住鼠标左键开始向左或者向右拖拽,需要精确计算用户拖拽的实际距离,也是鼠标移动的实际距离。计算方式:resize的左偏移值offsetLeft+(鼠标移动实际距离 + 鼠标按下距离)= 实际移动距离movelen。
document.onmousemove = function (e) {var moveLen = resizeBar.left + (e.clientX - startX);}
那么,resize的左边距离移动实际距离就是这样获得的。
document.onmousemove = function (e) {var moveLen = resizeBar.left + (e.clientX - startX);resizeBar.style.left = moveLen + 'px';}
左边|右边盒子宽度就可以得到了。
document.onmousemove = function (e) {var moveLen = resizeBar.left + (e.clientX - startX);resizeBar.style.left = moveLen + 'px';leftBox.style.width = moveLen + "px";rightBox.style.width =boxWidth - resizeWidth - moveLen + "px";}
到这里拖拽核心逻辑就结束了,为了更好的理解拖拽过程,于是就有了下方不怎么好看的抽象图,画的不好,多多理解。

源码贴上
HTML
<body><div class="box"><div class="left overflow"><p>左边盒子</p></div><div class="resize"></div><div class="right overflow"><p>右边盒子</p></div></div></body>
CSS
<style>.box {width: 100%;height: 100vh;display: flex;}.left {background: lightblue;}.resize {width: 10px;height: 100%;background-color: #399aef;cursor: w-resize;}.right {background: rgba(0, 0, 0, 0.4);}p {padding: 20px;text-align: center;font-size: 25px;font-weight: 600;}[class*="overflow"] {width: 49%;height: 100%;overflow: hidden;}.userselect {-webkit-user-select: none;-moz-user-select: none;-ms-user-select: none;user-select: none;}</style>
JavaScript
<script>function dragResize() {var resizeBar = document.querySelector(".resize");var leftBox = document.querySelector(".left");var box = document.querySelector(".box");var rightBox = document.querySelector(".right");var resizeWidth = resizeBar.offsetWidth;var boxWidth = box.offsetWidth;resizeBar.onmousedown = function (e) {var startX = e.clientX;resizeBar.left = resizeBar.offsetLeft;// 鼠标拖动事件document.onmousemove = function (e) {var moveLen = resizeBar.left + (e.clientX - startX);resizeBar.style.left = moveLen + 'px';leftBox.style.width = moveLen + "px";rightBox.style.width = boxWidth - resizeWidth - moveLen + "px";e.target.style.cursor = "w-resize"// 拖拽过程中,禁止选中文本leftBox.classList.add('userselect')rightBox.classList.add('userselect')};// 鼠标松开事件document.onmouseup = function (evt) {document.onmousemove = null;document.onmouseup = null;// 清空cursorleftBox.style.cursor = "default"rightBox.style.cursor = "default"leftBox.classList.remove('userselect')rightBox.classList.remove('userselect')};};}dragResize()
相关文章:
web实现drag拖拽布局
这种拖拽布局功能其实在电脑操作系统或者桌面应用里面是经常使用的基础功能,只是有时候在进行web开发的时候,对这个功能需求量不够明显,但却是很好用,也很实用。能够让用户自己拖拽布局,方便查看某个区域更多内容&…...
Linux网络编程—listen、accept、connect
一、网络四件套 #include <sys/types.h> //头文件;这四个文件一包,基本网络就无问题了; #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> 二、listen 监听:将套…...
logback.xml自定义标签节点
logback.xml自定义标签节点 问题 <?xml version"1.0" encoding"UTF-8" ?> <configuration scan"true" scanPeriod"60 seconds" debug"false"><appender name"console" class"ch.qos.logb…...
探索DevExpress WinForms:.NET世界中的UI库之星
开篇概述 作为一名资深的技术专家,我对.NET开发和UI库有着深入的了解。今天,我要向您介绍的是DevExpress WinForms —— 一款在.NET开发领域广受欢迎的开源UI库。它以其强大的功能、优雅的设计和卓越的性能,成为了众多开发者的首选。 主体讲解…...
零基础学习Redis(4) -- 常用数据结构介绍
我们之前提到过,redis中key只能是字符串类型,而value有多种类型。 redis中的数据结构有自己独特的实现方式能根据特定的场景进行优化 1. string(字符串) 内部编码: raw:最基本的字符串,类比我们平常使用的Stringin…...
Python实现水果忍者(开源)
一、整体介绍: 1.1 前言: 游戏代码基于Python制作经典游戏案例-水果忍者做出一些改动,优化并增加了一些功能。作为自己Python阶段学习的结束作品,文章最后有源码链接。 1.2 Python主要知识: (1…...
Windows自动化3️⃣WindowsPC拽起时长问题解决方案
问题描述: Windows应用从点击, 到加载完成, 需要一定的时间后台是否已经启动过当前程序?启动后, 前后台应用关闭问题等 我的解决思路: 首先检查进程 , 当前进程是否在运行, 如果进程在运行, 需要先关闭进程 关闭进程后, 开始我们的自动化流程, 去拽起 应用 拽起应用后, 可以先…...
一篇文章入门Java虚拟机(JVM)
JVM全称是Java Virtual Machine,中文译名Java虚拟机。本质上是一个运行在计算机上的程序 一,JVM的功能 功能描述解释和运行对字节码文件中的指令,实时的解释成机器码,让计算机执行内存管理自动为对象、方法等分配内存࿱…...
vue3里面的组件实例类型(包括原生的html标签类型)
在 通过 ref(null)获取组件的时候,我们想要为 组件标注组件类型,可以通过 any 类型来进行标注,但是很明显,这些的代码很不优雅,所以我们可以利用 vue3 里面的 InstanceType 来进行类型标注 这是…...
谷歌正式开放Imagen 3访问权限!OpenAI的GPT-4o连续两周迎来两次更新!|AI日报
文章推荐 马斯克Grok 2打响反内容限制第一枪,盛大网络狂欢!一起来看网友花式整活! GPT-4o一天迎来2大劲敌!Grok-2发布测试版!Gemini Live即刻上线! 今日热点 OpenAI发布chatgpt-4o-latest AI模型&#…...
C语言内存操作函数
目录 一. C语言内存操作函数 1. memcpy的使用和模拟实现 2. memmove函数 3. memset函数 4. memcmp函数 一. C语言内存操作函数 随着知识的不断积累,我们所想要实现的目标程序就会更加复杂,今天我们来学习一个新的知识叫做C语言内存操作函数&#x…...
深入探索 PyTorch:torch.nn.Parameter 与 torch.Tensor 的奥秘
标题:深入探索 PyTorch:torch.nn.Parameter 与 torch.Tensor 的奥秘 在深度学习的世界里,PyTorch 以其灵活性和易用性成为了众多研究者和开发者的首选框架。然而,即使是经验丰富的 PyTorch 用户,也可能对 torch.nn.Pa…...
成为Python砖家(1): 在本地查询Python HTML文档
目的 Python3 官方文档位于 https://docs.python.org/3/ , 有时候网络无法连接,或者连接速度慢, 这对于学习 Python 时的反馈造成了负面影响。准备一份本地 Python 文档可以让反馈更加及时。 下面给出 macOS 和 Win11 下的 Python 离线文档…...
深度学习基础—RMSprop算法与Adam 优化算法
1.RMSprop算法 1.1.算法流程 除了动量梯度下降法,RMSprop算法也可以加快梯度下降,这个算法的算法流程如下:深度学习基础—动量梯度下降法http://t.csdnimg.cn/zeGRo 1.2.算法原理 和动量梯度下降不同的是,对dW和db的变成了平方项…...
单片机原理及技术(六)—— 中断系统的工作原理
目录 一、AT89S51中断技术概述 二、AT89S51中断系统结构 2.1 中断请求源 2.2 中断请求标志寄存器 2.2.1 TCON 寄存器 2.2.2 SCON 寄存器 三、中断允许与中断优先级的控制 3.1 中断允许寄存器 IE 3.2 中断优先级寄存器 IP 四、响应中断请求的条件 五、外部中断的触发…...
Angular路由使用
Angular路由是Angular框架中一个非常重要的特性,开发者可以根据URL的不同来动态地加载和显示不同的组件,从而构建出单页面应用(SPA)。 以下是Angular路由使用的基本步骤和要点: 1. 安装和配置路由模块 首先…...
【JVM】深入理解类加载机制(一)
深入理解类加载机制 Klass模型 Java的每个类,在JVM中都有一个对应的Klass类实例与之对应,存储类的元信息如:常量池、属性信息、方法信息…从继承关系上也能看出来,类的元信息是存储在元空间的。普通的Java类在JVM中对应的是InstanceKlass(C)…...
区块链浏览器需求整理
用户需求 普通用户 便捷查询交易记录:能够轻松找到自己或特定地址的交易详情,包括交易时间、金额、状态等。查看账户余额:实时了解地址的余额情况。追踪资产流向:了解自己的资产在区块链上的转移路径。 开发者 智能合约调试&a…...
Laravel 表单验证功能重定向判断
判断主要针对 API 请求和普通页面请求,即 API 的表单验证失败直接响应 JSON,而页面的表单验证失败正常重定向。 看网上基本上是继承 FormRequest 类来实现,其实直接修改异常处理的 Handler 类即可,非常简单。 打开 app/Exception…...
MATLAB口罩检测系统
一、应用背景 作为数字图像处理和计算机视觉领域的一个重要组成部分,利用摄像机对图像进行采集,从图像中检测人脸并进行口罩穿戴的识别的有着非常重要的研究意义和应用价值。面对突如其来的新型肺炎疫情,人们生活秩序被严重打乱。跟普通流感…...
tomcat和国产web中间件区别和联系
国产中间件 宝蓝德 https://www.bessystem.com/product/e717be5b091e4e14a7339aa4be49ca80/info?p101东方通 https://www.tongtech.com/sy.html非国产tomcat tomcat的项目发布方式 将项目复制到tomcat/webapps中启动Tomcat服务器,双击 startup.bat访问项目 IDEA 中…...
Jetson Nano实战:FFmpeg与Nginx的RTMP推流配置全解析
1. Jetson Nano与RTMP推流基础认知 第一次接触Jetson Nano做视频推流时,我对着这块信用卡大小的开发板研究了整整三天。这块搭载了128核NVIDIA Maxwell GPU的小家伙,其实是个隐藏的视频处理高手。RTMP协议就像快递公司的"当日达"服务ÿ…...
保姆级教程:用SolidWorks URDF插件把你的机械设计变成Gazebo仿真模型
从SolidWorks到Gazebo:机械设计仿真全流程实战指南 机械工程师们常常面临一个挑战:如何在虚拟环境中快速验证设计方案的可行性?SolidWorks作为主流的三维设计工具,与Gazebo这一强大的机器人仿真平台结合,能够实现从概念…...
AI辅助开发:让快马平台生成具备语义联想能力的智能下拉词
最近在开发一个技术博客平台时,遇到了一个有趣的挑战:如何让标签输入框变得更智能?传统的下拉词匹配只能基于关键词的字面匹配,但技术领域的概念往往存在多种表达方式。比如用户输入"前端框架",系统应该能联…...
Thanos.sh安全使用手册:避免数据灾难的10个终极技巧
Thanos.sh安全使用手册:避免数据灾难的10个终极技巧 【免费下载链接】Thanos.sh if you are Thanos(root), this command could delete half your files randomly 项目地址: https://gitcode.com/gh_mirrors/th/Thanos.sh Thanos.sh是一款以"随机删除一…...
告别人工筛选!用Word2vec构建主题词库,我们拿“网络暴力”关键词试了试
智能主题词库构建实战:用Word2vec挖掘语义关联词汇 在信息爆炸的时代,内容运营和产品经理们常常面临一个共同挑战:如何从海量文本中快速识别和归类相关主题内容。传统的人工筛选方法不仅效率低下,还容易遗漏那些变体表达和新兴网络…...
windows java jar 包后台运行
使用 javaw 实现后台运行(简单场景)这是最简单的方法。Java 自带的 javaw.exe 是 java.exe 的变体,它运行程序时不会打开任何控制台窗口。操作步骤:创建一个新的文本文件,命名为 start.bat。在文件中写入以下内容&…...
新型macOS Infinity窃密木马利用Nuitka Python载荷与ClickFix传播
首例针对macOS的ClickFix攻击活动Malwarebytes研究人员发现名为Infinity Stealer的新型macOS信息窃取木马,该木马使用Nuitka编译的Python载荷,通过伪造Cloudflare验证页面诱骗用户执行终端命令进行传播。据Malwarebytes报告指出,这是首次观察…...
Jimeng LoRA效果对比:同一seed下不同Epoch生成图随机性与稳定性分析
Jimeng LoRA效果对比:同一seed下不同Epoch生成图随机性与稳定性分析 1. 项目简介:一个专为LoRA效果测试而生的工具 如果你玩过Stable Diffusion,肯定对LoRA不陌生。它是一种轻量化的模型微调方法,能在不改变基础大模型的情况下&…...
深入解析Triton Server的Backend插件机制与自定义开发实践
1. Triton Server与Backend插件机制概述 第一次接触Triton Server时,最让我困惑的就是它的Backend机制。简单来说,Triton就像一个万能插座,而各种Backend就是不同标准的插头。比如你用PyTorch训练了个模型,Triton的pytorch_backen…...
