通过鼠标移动来调整两个盒子的宽度(响应式)
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(代理),这…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...

Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...

Windows安装Miniconda
一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...

ubuntu系统文件误删(/lib/x86_64-linux-gnu/libc.so.6)修复方案 [成功解决]
报错信息:libc.so.6: cannot open shared object file: No such file or directory: #ls, ln, sudo...命令都不能用 error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory重启后报错信息&…...

软件工程 期末复习
瀑布模型:计划 螺旋模型:风险低 原型模型: 用户反馈 喷泉模型:代码复用 高内聚 低耦合:模块内部功能紧密 模块之间依赖程度小 高内聚:指的是一个模块内部的功能应该紧密相关。换句话说,一个模块应当只实现单一的功能…...

算法打卡第18天
从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,7…...