通过鼠标移动来调整两个盒子的宽度(响应式)
DOM结构:
<div class="courer"> // 外层盒子<div class="dividing-line" title="拖动"></div> // 拖动的那个线<div class="course-title-box"> // 第一个盒子<div class="course-content-box" v-infinite-scroll="load" infinite-scroll-disabled="disabled"><div v-for="(item2, i2) in detialList" :key="i2" @contextmenu="handleRightClick(i2, item2)"><!--标题--><div class="course-content-item" @click="currentChange(item2)"><div style="width: calc(100% - 50px); overflow: hidden; text-overflow: ellipsis; white-space: nowrap">{{ item2.name }}</div></div></div><div v-if="noMore" style="color: #999; font-size: 12px; text-align: center; margin: 10px 0">没有更多了</div></div></div><div class="course-detail-content-box" style="display: flex; align-items: center; justify-content: center">// 第二个盒子<div style="color: #bdbdbd"><span>点击任务标题查看详情</span></div></div></div>
css样式:
.courer {/* padding: 20px; */width: calc(100% - 150px);height: 100%;overflow-y: auto;overflow-x: hidden;display: flex;position: relative;
}
.dividing-line {position: absolute;width: 10px;height: 100%;left: 200px;top: 0;transform: translate(-50%, 0);cursor: col-resize;/* background-color: rgba(20, 20, 23, 0.3); */background-color: transparent;
}.course-title-box {width: 200px;height: 100%;overflow-y: auto;overflow-x: hidden;/* background-color: #789; */border-right: 1px solid rgba(0, 0, 0, 0.07);border-top: 1px solid rgba(0, 0, 0, 0.07);padding: 5px 15px;.course-title-item {cursor: pointer;padding: 10px 0;color: #333;font-weight: 700;/* background-color: #669; */position: relative;&:hover {color: #5fa4f6;.el-icon-more-outline {display: block;}}.el-icon-more-outline {display: none;}span {padding: 0 7px;}.add {position: absolute;right: 5px;top: 13px;}}.course-content-box {.course-content-item {color: #333;cursor: pointer;padding: 10px;/* background-color: #898; */border-bottom: 1px solid rgba(0, 0, 0, 0.03);position: relative;&:hover {background-color: #e7f3ff;}.detail-box {position: absolute;right: 13px;top: 0;height: 40px;display: flex;align-items: center;.more-icon:hover {color: #5fa4f6;}}}.active-course-content-item {background-color: #e7f3ff;}}
}
重中之重的js代码:
// methods里的setTaskBox() {if (window.localStorage.getItem('lineLeft') != null) {const titleBox = document.getElementsByClassName('course-title-box')[0]const contentBox = document.getElementsByClassName('course-detail-content-box')[0]const line = document.getElementsByClassName('dividing-line')[0]line.style.left = window.localStorage.getItem('lineLeft') + '%'titleBox.style.width = window.localStorage.getItem('titleBoxWidth') + '%'contentBox.style.width = window.localStorage.getItem('contentBoxWidth') + '%'}},// 实现任务列表和任务详情显现区域变化功能changeTaskBox() {const titleBox = document.getElementsByClassName('course-title-box')[0]const contentBox = document.getElementsByClassName('course-detail-content-box')[0]const line = document.getElementsByClassName('dividing-line')[0]const box = document.getElementsByClassName('courer')[0]let titleBoxStyle = window.getComputedStyle(titleBox)let contentBoxStyle = window.getComputedStyle(contentBox)let boxStyle = window.getComputedStyle(box)console.log(titleBoxStyle.width, contentBoxStyle.width, boxStyle.width)// 鼠标按下事件line.onmousedown = e => {let titleBoxWidth = parseFloat(titleBoxStyle.width)let contentBoxWidth = parseFloat(contentBoxStyle.width)let boxWidth = parseFloat(boxStyle.width)const startX = e.clientXconsole.log('startX', startX)const lineLeft = line.offsetLeftconsole.log('lineLeft', lineLeft)// 鼠标拖动事件document.onmousemove = e => {const moveX = e.clientXconsole.log('moveX', moveX)// 鼠标移动距离let moveLen = lineLeft + moveX - startXmoveLen = moveLen < 200 ? 200 : moveLen //左边区域最小宽度为200pxmoveLen = moveLen > boxWidth - 500 ? boxWidth - 500 : moveLen //右边区域最小宽度为500pxline.style.left = moveLen + 'px'titleBox.style.width = moveLen + 'px'contentBox.style.width = boxWidth - moveLen + 'px'titleBoxWidth = parseFloat(titleBoxStyle.width)contentBoxWidth = parseFloat(contentBoxStyle.width)}// 鼠标松开事件document.onmouseup = function () {let newLineLeft = (parseInt(line.offsetLeft) / boxWidth).toFixed(2) * 100let newTitleBoxWidth = (titleBoxWidth / boxWidth).toFixed(2) * 100let newContentBoxWidth = (contentBoxWidth / boxWidth).toFixed(2) * 100window.localStorage.setItem('titleBoxWidth', newTitleBoxWidth)window.localStorage.setItem('contentBoxWidth', newContentBoxWidth)window.localStorage.setItem('lineLeft', newLineLeft)document.onmousemove = nulldocument.onmouseup = null}return false}},
e.clientX 是一个事件对象的属性,它表示鼠标指针相对于浏览器视口(viewport)的水平位置。具体来说,e.clientX 返回鼠标指针相对于视口左边缘的 x 坐标。
mounted里的:
mounted() {this.changeTaskBox()this.setTaskBox()},
就可以完成拖动那根线,实现两边的盒子的宽度根据线的移动而变化;
offsetLeft 和 style.left 在 Vue 或 JavaScript 中有不同的用途和含义:
1.offsetLeft:
- 是一个只读属性,表示元素相对于其最近的定位祖先元素(或视口)的左边缘的距离。
- 它返回的是一个整数,单位是像素(px)
- 用于获取元素的当前位置,不可用于设置元素的位置
2.style.left:
style.left是一个可读写属性,表示元素在 CSS 中的left属性值。- 它可以直接修改元素的位置。
- 用于设置元素的 CSS
left属性,从而改变元素的位置。 - 可以设置为字符串形式,如
'100px'或100 + 'px'
应用场景:
- 当你需要获取元素的当前位置时,使用
offsetLeft。 - 当你需要动态改变元素的位置时,使用
style.left。
相关文章:
通过鼠标移动来调整两个盒子的宽度(响应式)
DOM结构: <div class"courer"> // 外层盒子<div class"dividing-line" title"拖动"></div> // 拖动的那个线<div class"course-title-box"> // 第一个盒子<div class"course-content-…...
React Zustand状态管理库的使用
Zustand 是一个轻量级的状态管理库,适用于 React 和浏览器环境中的状态管理需求。它由 Vercel 开发并维护,旨在提供一种简单的方式来管理和共享状态。Zustand 的设计理念是尽可能简化状态管理,使其更加直观和易于使用。 Zustand 官网点击跳转…...
pyrosetta MoveMap介绍
在 PyRosetta 中,MoveMap 是一个非常重要的类,用来控制蛋白质分子中哪些部分可以在某些操作(如折叠、旋转、优化等)中被移动。MoveMap 允许你精确地指定哪些残基、键角或原子可以进行特定的运动,从而帮助你在蛋白质结构预测、优化和设计中进行灵活的控制。 MoveMap 的功能…...
在线安全干货|如何更改IP地址?
更改IP地址是一个常见的需求,无论是为了保护个人隐私、绕过地理限制还是进行商业数据分析。不同的IP更改方法适用于不同的需求和环境。但请注意,更改IP地址应在合法场景下进行,无论使用什么方法,都需要在符合当地网络安全法律法规…...
【C++】【网络】【Linux系统编程】单例模式,加锁封装TCP/IP协议套接字
目录 引言 获取套接字 绑定套接字 表明允许监听 单例模式设计 完整代码示例 个人主页:东洛的克莱斯韦克-CSDN博客 引言 有关套接字编程的细节和更多的系统调用课参考《UNIX环境高级编程》一书,可以在如下网站搜索电子版,该书在第16章详…...
Matplotlib在运维开发中的应用
在现代运维开发中,数据可视化扮演着越来越重要的角色。它能帮助我们更直观地理解系统状态,快速发现潜在问题,并辅助决策制定。Python的Matplotlib库作为一个强大而灵活的绘图工具,在运维领域有着广泛的应用。本文将探讨Matplotlib在运维开发中的常见应用场景,并提供实用的代码示…...
centos下nvme over rdma 环境配置
nvme over rdma 环境配置 本文主要介绍NVMe over RDMA的安装和配置。关于什么是NVMe over Fabrics,什么是NVMe over RDMA,本文就不做介绍了,网上资料一大堆。 可以看看什么是NVMe over Fabrics? RDMA(全称:Remote Dir…...
【C++】——多态详解
目录 1、什么是多态? 2、多态的定义及实现 2.1多态的构成条件 2.2多态语法细节处理 2.3协变 2.4析构函数的重写 2.5C11 override 和 final关键字 2.6重载—重写—隐藏的对比分析 3、纯虚函数和抽象类 4、多态的原理分析 4.1多态是如何实现的 4.2虚函数…...
STM32上实现FFT算法精准测量正弦波信号的幅值、频率和相位差(标准库)
在研究声音、电力或任何形式的波形时,我们常常需要穿过表面看本质。FFT(快速傅里叶变换)就是这样一种强大的工具,它能够揭示隐藏在复杂信号背后的频率成分。本文将带你走进FFT的世界,了解它是如何将时域信号转化为频域…...
计算机毕业设计 农场投入品运营管理系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试
🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…...
【笔记】2.1 半导体三极管(BJT,Bipolar Junction Transistor)
一、结构和符号 1. 三极管结构 常用的三极管的结构有硅平面管和锗合金管两种类型。各有PNP型和NPN型两种结构。 左图是NPN型硅平面三极管,右图是PNP型锗合金三极管。 从图中可见平面型三极管是先在一块大的金属板上注入杂质使之变成N型,然后再在中间注入杂质使之变成P型,…...
企业中文档团队的三种组织形式
大家好!今天咱们来聊聊企业里文档团队都是怎么组织的。 企业中,常见的文档团队组织形式有三种。 首先,最常见的就是集中式的文档团队。就是说,公司里头有几个不同的部门,每个部门都需要做文档。于是呢,公…...
古诗词四首鉴赏
1、出自蓟北门行 唐李白 虏阵横北荒,胡星曜精芒。 羽书速惊电,烽火昼连光。 虎竹救边急,戎车森已行。 明主不安席,按剑心飞扬。 推毂出猛将,连旗登战场。 兵威冲绝漠,杀气凌穹苍。…...
全国行政区划下载(高德、阿里、天地图)
一、网站链接: 阿里云数据可视化平台: DataV.GeoAtlas地理小工具系列 (aliyun.com) 链接: link 高德地图API获取行政区域: 高德地图API获取行政区域 (naivemap.com) 链接: link 天地图服务中心: 天地图 服务中心 (tianditu.g…...
Springboot提升-MapStruct组件使用
文章目录 1. 添加依赖2. 创建映射接口3. 在Spring Boot中使用MapStruct映射器4. 配置MapStruct 在Spring Boot项目中使用MapStruct可以帮助你更方便地管理对象之间的映射逻辑。下面是一些基本步骤来设置和使用MapStruct: 1. 添加依赖 首先,你需要在项目…...
如何借助ChatGPT提升论文质量:实战指南
在学术写作的过程中,非英语母语人士经常面临诸多挑战,尤其是当论文要提交给国际期刊时,语言规范和表达逻辑成为了必须克服的障碍。本文将通过实例详细解析如何利用ChatGPT来润色论文,使其达到发表级别的标准。 一、优秀学术论文的写作特点 要让学术论文在国际期刊上发表,…...
NLP开端:Tokenizer-文本向量化
Tokenizer 问题背景 An was a algorithm engineer 如上所示,在自然语言处理任务中,通常输入处理的数据是原始文本。但是算法模型自能处理数值类型,因此需要找到一种方法,将原始的文本数据转换为数值类型的数据。这就是分词器所…...
STM32 MCU学习资源
STM32 MCU学习资源 文档下载需要注册登录账号 ST公司官方文档 STM32 MCU开发者资源 STM32F446 相关PDF文档 ST中文论坛 中文译文资料 ST MCU中文官网 其他学习资源 野火STM32库开发实战指南 零基础快速上手STM32开发(手把手保姆级教程) 直接使…...
Python知识点:Python内存管理与优化
开篇,先说一个好消息,截止到2025年1月1日前,翻到文末找到我,赠送定制版的开题报告和任务书,先到先得!过期不候! Python内存管理与优化指南 Python是一种动态类型的解释型语言,它提…...
SpringBoot Kafka发送消息与接收消息实例
前言 Kafka的基本工作原理 我们将消息的发布(publish)称作 producer(生产者),将消息的订阅(subscribe)表述为 consumer(消费者),将中间的存储阵列称作 broker(代理),这…...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...
Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合
作者:来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布,Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明,Elastic 作为 …...
面试高频问题
文章目录 🚀 消息队列核心技术揭秘:从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"?性能背后的秘密1.1 顺序写入与零拷贝:性能的双引擎1.2 分区并行:数据的"八车道高速公路"1.3 页缓存与批量处理…...
AxureRP-Pro-Beta-Setup_114413.exe (6.0.0.2887)
Name:3ddown Serial:FiCGEezgdGoYILo8U/2MFyCWj0jZoJc/sziRRj2/ENvtEq7w1RH97k5MWctqVHA 注册用户名:Axure 序列号:8t3Yk/zu4cX601/seX6wBZgYRVj/lkC2PICCdO4sFKCCLx8mcCnccoylVb40lP...
