鼠标拖拽菜单栏控制宽度大小及flex实现经典左右两栏布局

news2024/11/18 22:44:59

目录

1. 实现的效果如下图所示:

2. 思路

3.代码

3.1 js核心代码简单理解版:

3.2 实际应用-react版

4. 使用flex实现左右两栏式经典布局

4.1  图示:

4.2 代码实例: 


1. 实现的效果如下图所示:

 


2. 思路

1. 使用定位在左侧菜单栏右侧写一个不可见div,鼠标经过鼠标指针样式变换

2. 监听事件:鼠标按下、抬起、移动,需要一个变量,来记录当前是按下还是抬起,初始为false,按下时为true,抬起时为false,如果是true的情况可以移动。

3.记录鼠标偏移值e.screenX,借此控制菜单栏宽度,使用min、maxwidth控制最小或最大宽度

4.性能优化,采用节流或防抖


 

3.代码

分为js和react两个版本,以供参考


 

3.1 js核心代码简单理解版:



  <div class="menu-wrapper">
    <div class="resize-bar"></div>
  </div>
  <div class="content"></div>

  <script>
    let resizing = false
    const menu = document.querySelector('.menu-wrapper')
    const resizeBar = document.querySelector('.resize-bar')
    // 监听: 当鼠标按下,变量设置为true表示已经按下
    resizeBar.addEventListener('mousedown', () => {
      resizing = true
    })
    // 监听:当鼠标移动,将鼠标的位置赋值给元素的宽度
    window.addEventListener('mousemove', (e) => {
      if (resizing) {
        e.preventDefault()
        e.stopPropagation()
        const { screenX } = e
        menu.style.width = screenX + 'px'
      }
    })
    // 监听:当鼠标抬起,变量设置为false表示已经抬起
    window.addEventListener('mouseup', () => {
      resizing = false;
    })
  </script>



 

3.2 实际应用-react版

 结合flex左右布局,鼠标控制的是左侧 flex:0 0 200px 的宽度,以及设置最小和最大的宽度,使用节流方式优化性能

                           // 设置的不可见div
                            <div
                                className='resize-bar'
                                style={{
                                    width: "10px",
                                    height: "100%",
                                    minHeight: "4.6875rem",
                                    position: "absolute",
                                    top: "0",
                                    right: "0",
                                    cursor: "col-resize",
                                    zIndex: "999999999"
                                }}
                            ></div>

// react代码部分:

 setTimeout(() => {
        let prevCursorOffset = -1
        let resizing = false
        const menu: any = document.querySelector(".mouseDrag")
        const resizeBar: any = document.querySelector(".resize-bar")

        resizeBar.addEventListener("mousedown", () => {
            resizing = true
        })

        window.addEventListener("mousemove", handleResizeMenu) 
        window.addEventListener("mouseup", () => {
            resizing = false
        })

        function handleResizeMenu(e) {
            if (!resizing) {
                return
            }

            const {screenX} = e

            // 加上这两行代码,避免移动鼠标时选择界面元素
            e.preventDefault()
            e.stopPropagation()
            if (prevCursorOffset === -1) {
                prevCursorOffset = screenX
                // 鼠标偏移量大于50时执行一次大小调整
            } else if (Math.abs(prevCursorOffset - screenX) >= 50) {
                menu.style.flex = `0 0 ${screenX}px` // 设置左侧宽度
                menu.style.maxWidth = "500px" // 设置左侧最大宽度
                prevCursorOffset = screenX
               
            }
        }
    }, 1500)

4. 使用flex实现左右两栏式经典布局

好处:使用flex布局可以使右侧内容区域自适应


 

4.1  图示:

 


4.2 代码实例: 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>flex-左右布局</title>
    <style>
      .wrap {
        margin: 0 auto;
        width: 80%;
        display: flex;
      }
      #left {
        flex: 0 0 200px; /* 左侧固定200px */
        height: 500px;
        background: red;
      }
      #right {
        flex: 1; /* 随父级变化 */
        height: 500px;
        background: burlywood;
      }
    </style>
 
</head>
<body>
<div class="wrap">
  <aside id="left"></aside>
  <section id="right">右侧</section>
</div>
 
</body>
</html>

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/125101.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

欧科云链接受北京电视台采访以创新科技助力《反电信网络诈骗法》

近日&#xff0c;欧科云链作为创新科技企业的代表&#xff0c;就《反电信网络诈骗法》实施的相关问题接受了来自北京电视台的采访。 编辑&#xff5c;小O 出品&#xff5c;欧科云链 近年来&#xff0c;随着数字技术的快速发展&#xff0c;越来越多的交易都转移到线上&#xff0…

softnms源码解读(python)

前言 想写这篇文章的原因是最近碰见了一个比较棘手的事情&#xff0c;如果想把一个目标检测模型及其相关的后处理移到嵌入式设备上&#xff0c;不能用c的opencv库&#xff0c;也就不能用cv2.dnn.nms这个函数来进行nms的后处理&#xff0c;需要用c实现&#xff0c;那就必须了解…

重磅综述|Nat Rev Gastroenterol Hepatol:人类胃肠道中的产甲烷古菌

期刊&#xff1a;Nat Rev Gastroenterol Hepatol 影响因子&#xff1a;73.082 发表时间&#xff1a;2022年9月 一、摘要 人类微生物群与人类健康和疾病密切相关。除了细菌、病毒和真核生物外&#xff0c;人类胃肠道中许多古菌与甲烷的产生有关&#xff0c;临床上可…

PMP一般要提前多久备考?

一般是1-3个月吧&#xff0c;PMP考试通过率至少有60%&#xff0c;报培训班可以有80%以上&#xff0c;不用备考太长时间&#xff0c;但时间太短也无法把项目管理的知识学完&#xff0c;1-3个月是最佳备考时间。 &#xff08;字数很多&#xff0c;都是干货&#xff0c;资料在文末…

写给Java程序员的GRPC入门系列(1)

点击上方GRPC专栏看系列 文章目录Abstract前置依赖本文初始状态创建MAVEN module修改依赖测试下一步Abstract 网上有很多GRPC的例子&#xff0c;但是却没有能够写给普通Java开发人员手把手入门少走弯路的教程。 本教程保证按照步骤一步步来你就可以完成GRPC从0到1的构建。 源码…

一文读懂机器学习常用算法的基本概念和适用场景

引用一句英国统计学家George E. P. Box的名言&#xff1a;All models are wrong, but some are useful. 没有哪一种算法能够适用所有情况&#xff0c;只有针对某一种问题更有用的算法。 机器学习算法不会要求一个问题被 100%求解&#xff0c;取而代之的是把问题转化为最优化的…

基于小程序技术栈的跨端框架有哪些?

回顾过去的几年&#xff0c;市场上的跨端开发框架一直在迭代&#xff0c;同时也有新的跨端框架冒出来。在过往的文章中&#xff0c;我们也有盘点过基于HTML5语法实现的跨端开发平台。在本篇文章中&#xff0c;就让我们盘点一下以小程序语法进行转译的跨端平台&#xff0c;以及他…

相机标定笔记(1) -- 相机模型

什么需要相机标定 我们知道&#xff0c;相机的图像是三维世界到2D平面的一个投影。仅从这个2D图像来看&#xff0c;我们无法得知图像中的物体在真实物理世界中有多大&#xff0c;距离相机的距离有多远。那么我们有没有办法从这个2D的图片结合相机的参数获得这些信息呢&#xff…

ElasticSearch-全文检索

docker 下载安装 #es镜像 docker pull elasticsearch:7.4.2 #es的可视化工具 docker pull kibana:7.4.2mkdir -p /mydata/elasticsearch/config mkdir -p /mydata/elasticsearch/dataecho "http.host: 0.0.0.0" >> /mydata/elasticsearch/config/elasticsear…

2023年北京/成都/南宁山东DAMA-CDGA/CDGP数据治理工程师认证报名

DAMA认证为数据管理专业人士提供职业目标晋升规划&#xff0c;彰显了职业发展里程碑及发展阶梯定义&#xff0c;帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力&#xff0c;促进开展工作实践应用及实际问题解决&#xff0c;形成企业所需的新数字经济下的核心职业…

制造业ERP软件如何破解企业质量管理难题?

随着生产制造企业的快速发展&#xff0c;产品的好坏&#xff0c;在很大程度上取决于产品制造的质量管理水平&#xff0c;其水平的高低直接对应产品的竞争力。许多企业都面临着质量管控能力不足、质量检验数据记录不全、部分物料追溯困难等问题&#xff0c;一旦企业的产品出现质…

异步请求池的实现

异步请求池 两种请求模式 pipline请求&#xff1a;A在一个连接上打包多个请求发送给B&#xff0c;B将这些请求的结果打包返回异步请求&#xff1a;A一个连接一个请求&#xff0c;并创建一个线程检查发送的所有请求是否有结果返回&#xff08;借助epoll&#xff09;&#xff0…

F280049C Buffered Digital-to-Analog Converter (DAC)

目录DAC15.1 Introduction15.1.1 Features15.1.2 Block Diagram15.2 Using the DAC15.2.1 Initialization Sequence 初始化顺序15.2.2 DAC Offset AdjustmentDAC偏移调整15.2.3 EPWMSYNCPER Signal EPWMSYNCPER信号15.3 Lock Registers总结代码配置 driverlib代码配置 bitfield…

Blender和C4D有哪些不同?选Blender还是C4D?

众所周知&#xff0c;Blender和Cinema 4D是美术界最著名的两个名字。在比较这两款软件的时候&#xff0c;我们要仔细的看不同的方面。因此&#xff0c;您如何知道使用哪一个以及每个的关键方面是什么&#xff0c;例如渲染、建模、社区等等&#xff01;Cinema 4D 是那些希望在电…

Doris(五)-监控、报警、优化、数据备份及恢复

目录1、监控和报警1.1、Prometheus1.2、Grafana2、优化2.1、查看 QueryProfile2.1.1、使用方式2.1.2、参数说明2.1.3、调试方式2.2、 Join Reorder2.2.1 原理2.2.2 示例2.3 Join 的优化原则2.4 导入导出性能优化2.4.1 FE 配置2.4.3 性能分析2.4.4 Broker 导入大文件2.5 Bitmap …

sharepoint 配置app id secret 用postman上传文件

配置APP ID 第一部是配置APPID&#xff0c;可以访问 https://{tenantName}.sharepoint.com/_layouts/15/appregnew.aspx 或者访问具体某个页面下的 https://{tenantName}.sharepoint.com/sites/testUpload/_layouts/15/appregnew.aspx 点击生成即可生成客户端的id和secret ti…

kubernetes控制器之StatefulSet

目录 一、无状态与有状态 1.1无状态 1.2有状态 二、StatefulSet 控制器 2.1 StatefulSet 控制器概述 2.2StatefulSet 控制器&#xff1a;网络标识 2.3StatefulSet 控制器&#xff1a;独享存储 一、无状态与有状态 Deployment控制器设计原则&#xff1a; 管理的所有Pod一…

TiDB丨Etcd API 未授权访问漏洞的修复

文章目录一、前言二、集群环境三、漏洞整改建议方案一方案二四、方案实施五、可能存在的风险六、总结一、前言 Etcd是一个采用HTTP协议的健/值对存储系统&#xff0c;它是一个分布式和功能层次配置系统&#xff0c;可用于构建服务发现系统。用于共享配置和服务发现的分布式&am…

KubeEdge云原生边缘计算公开课03——云原生边缘计算学术研究现状与趋势

KubeEdge云原生边缘计算公开课03——云原生边缘计算学术研究现状与趋势曹建农&#xff1a;Collaborative Edge ComputingEdge Computing: the Driven force of AIoTThe Emergence of AIoTEdge ComputingCurrent Research on Edge ComputingComputation at EdgeIntelligence at …

MCU-51:LED点阵屏

之前我们介绍了控制LED灯亮灭的操作&#xff0c;今天我们要介绍一下控制LED点阵屏亮灭的操作&#xff0c;8*8的LED点阵屏&#xff0c;可以理解为八行或者八列LED灯的一个组合&#xff0c;可以使用它来显示一些字体与图案。 一、点阵屏介绍 1.1 简介 LED点阵屏由若干个独立的…