首页 > 其他分享 >JS 拖动DIV边框改变其大小

JS 拖动DIV边框改变其大小

时间:2023-08-24 17:44:14浏览次数:27  
标签:clientX clientY 鼠标 拖动 JS 修改 按下 let DIV

效果如下图所示:

详细代码如下:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        body,
        html {
            width: 100%;
            height: 100%;
            margin: 0;
        }
        #container {
            width: 200px;
            height: 200px;
            padding: 15px;
            border: #00cdcd 2px solid;
            box-sizing: border-box;
        }
        .item {
            cursor: default;
            width: 100%;
            height: 100%;
            background: #757575;
        }
    </style>
</head>

<body id="body">
    <div id="container">
        <div class="item"></div>
    </div>
    <script>
        //需要调整尺寸的div
        let c = document.getElementById('container')
        // body监听移动事件
        document.getElementById('body').addEventListener('mousemove', move)
        // 鼠标按下事件
        c.addEventListener('mousedown', down)
        // 鼠标松开事件
        document.getElementById('body').addEventListener('mouseup', up)

        // 是否开启尺寸修改
        let resizeable = false
        // 鼠标按下时的坐标,并在修改尺寸时保存上一个鼠标的位置
        let clientX, clientY
        // div可修改的最小宽高
        let minW = 8,
            minH = 8
        // 鼠标按下时的位置,使用n、s、w、e表示
        let direc = ''

        // 鼠标松开时结束尺寸修改
        function up() {
            resizeable = false
        }

        // 鼠标按下时开启尺寸修改
        function down(e) {
            let d = getDirection(e)
            // 当位置为四个边和四个角时才开启尺寸修改
            if (d !== '') {
                resizeable = true
                direc = d
                clientX = e.clientX
                clientY = e.clientY
            }
        }

        // 鼠标移动事件
        function move(e) {
            let d = getDirection(e)
            let cursor
            if (d === '') cursor = 'default';
            else cursor = d + '-resize';
            // 修改鼠标显示效果
            c.style.cursor = cursor;
            // 当开启尺寸修改时,鼠标移动会修改div尺寸
            if (resizeable) {
                // 鼠标按下的位置在右边,修改宽度
                if (direc.indexOf('e') !== -1) {
                    c.style.width = Math.max(minW, c.offsetWidth + (e.clientX - clientX)) + 'px'
                    clientX = e.clientX
                }
                // 鼠标按下的位置在上部,修改高度
                if (direc.indexOf('n') !== -1) {
                    c.style.height = Math.max(minH, c.offsetHeight + (clientY - e.clientY)) + 'px'
                    clientY = e.clientY
                }
                // 鼠标按下的位置在底部,修改高度
                if (direc.indexOf('s') !== -1) {
                    c.style.height = Math.max(minH, c.offsetHeight + (e.clientY - clientY)) + 'px'
                    clientY = e.clientY
                }
                // 鼠标按下的位置在左边,修改宽度
                if (direc.indexOf('w') !== -1) {
                    c.style.width = Math.max(minW, c.offsetWidth + (clientX - e.clientX)) + 'px'
                    clientX = e.clientX
                }
            }
        }

        // 获取鼠标所在div的位置
        function getDirection(ev) {
            let xP, yP, offset, dir;
            dir = '';

            xP = ev.offsetX;
            yP = ev.offsetY;
            offset = 10;

            if (yP < offset) dir += 'n';
            else if (yP > c.offsetHeight - offset) dir += 's';
            if (xP < offset) dir += 'w';
            else if (xP > c.offsetWidth - offset) dir += 'e';

            return dir;
        }
    </script>
</body>

</html>

标签:clientX,clientY,鼠标,拖动,JS,修改,按下,let,DIV
From: https://www.cnblogs.com/fishlittle/p/17654769.html

相关文章

  • js闭包
    一,闭包是什么闭包是:函数内部和函数外部连接的桥梁;可以读取其他函数内变量的函数;可以访问外部函数的变量,并将这些变量保存在内存中,供内部函数在外部函数执行完毕后继续使用;常被用于工厂函数、模块化等场景。二,闭包优缺优点:①保护函数内的变量安全,实现封装,防止变量流入其他环境发......
  • js下载媒体文件(分片下载)
    html:<divclass="usnbox"><divclass="usnboxbodyusnboxbody_rtm"><divclass="layui-form-item"><divclass="layui-inline"><la......
  • js面向对象编程
    基本概念面向对象编程将一个系统抽象为许多对象的集合,每一个对象代表了这个系统的特定方面。对象包括函数(方法)和数据。一个对象可以向其他部分的代码提供一个公共接口,而其他部分的代码可以通过公共接口执行该对象的特定操作,系统的其他部分不需要关心对象内部是如何完成任务的,这样......
  • js实现大文件上传下载
    ​ 一、概述 所谓断点续传,其实只是指下载,也就是要从文件已经下载的地方开始继续下载。在以前版本的HTTP协议是不支持断点的,HTTP/1.1开始就支持了。一般断点下载时才用到Range和Content-Range实体头。HTTP协议本身不支持断点上传,需要自己实现。 二、Range  用于请求头......
  • Electron,VUEJS3,Vite,TypesSript 开发环境配置
    Electron,VUEJS3,Vite,TypesSript开发环境配置项目早期是vue3+vite开发的,后期由于运营需求,要修改为Win安装包。方案还是比较多的:1.WPF-Webview由于目前只需要兼容win,所以可以选择WPF,但WPF需要WebView的,还需要本地架设服务。整体部署比较复杂以及需要熟悉C#与WPF相关开发。2.......
  • Codeforces Round #849 (Div. 4) 题解
    第一次打$\text{Div.4}$,感觉体验还行,差一题AK。##A直接使用if语句判断某个字符是否在字符串$\text{codeforces}$中出现过,幼儿园小朋友都会做。时间复杂度$\mathcal{O}(T)$,空间复杂度$\text{O}(1)$。ACCode##B用两个变量$x,y$记录当前走到哪里。若出现过$x=1,y=1$的......
  • jsp实现大文件上传下载
    ​ 这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时候,向后端传入参数:当前为第几块文件,和分片总数下面直接贴代码吧,一些难懂的我大部分都加上注释了:上传文件实体类:看得出来,实体类中已经有很多我们需要的功能了,还有实用的属性。如MD5秒传的信息。pub......
  • java裁切NC文件并转成Json
    importcom.alibaba.fastjson.JSONArray;importcom.alibaba.fastjson.JSONObject;importorg.junit.Test;importucar.ma2.Index;importucar.nc2.NetcdfFile;importucar.ma2.Array;importjava.io.FileWriter;importjava.io.IOException;publicclassNetCDF2JS......
  • kettle引入外部js
    //自带的函数参数即为js的路径LoadScriptFile("F:/bigdata-etl/user_center_auto/USER/aes.js");varAESPHONE=PHONE;vardecTel=aesDecrypt(AESPHONE,"ksu7gk4H7Gs9362F")functionaesDecrypt(str,key){varresult_value;try{......
  • 直播商城源码,JS Date配置日期格式化
    直播商城源码,JSDate配置日期格式化引入jsDate配置化diamante Date.prototype.format=function(fmt){  varo={    "M+":this.getMonth()+1,         //月份    "d+":this.getDate(),          //日  ......