鼠标移入盒子,盒子跟随鼠标移动

demo效果:

鼠标移入盒子,按下鼠标,开启移动跟随移动模式,再次按下关闭移动模式

涉及主要属性

在元素上单击鼠标按钮时输出鼠标指针的坐标:

bash 复制代码
var x = event.pageX;     // 获取水平坐标
var y = event.pageY;     // 获取垂直坐标

元素offsetLeft和offsetTop属性:

相当于最近一个有定位的父元素而言的位置,如果父元素没有定位则相当于body的x,y位置。

还有元素的offsetXXX属性不能修改只能用来读取(比如不能写:元素.offsetLeft=200),所以如果要使用(元素.style.xxx)来修改对应的原始位置

元素的offsetXXX和元素的style属性的区别:

1、offsetXX属性只读,style属性可以修改(最主要的区别)

2、offsetXX可以获取任何样式表上的样式,style属性则只能获取style='xxx'(行内样式)

3、还有其他的区别可以自己去搜搜嘻嘻

思路:

1、鼠标移入盒子,按下鼠标:开始计算在盒子的相对位置relativeX,relativeY

2、监听鼠标在盒子里面的移动(盒子和鼠标的位置关系始终保持不变)

3、根据鼠标位置和鼠标相对于盒子的位置计算得出当前盒子位置

4、鼠标再次点击取消跟随移动

具体代码

bash 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        /* 清楚浏览器样式 */
        *{
            margin: 0;
            border: 0;
        }
        .box{
            width: 300px;
            height: 300px;  
            background-color: brown;
            position: relative;
            left: 200px;
            top: 200px;
        }
    </style>
</head>
<body>
    <div class="box" id="box">
    </div>
    <script >
    let boxEl = document.getElementById('box')
    let relativeX =  0
    let relativeY = 0
    
    let needMoving = false// 盒子跟随鼠标移动
    boxEl.addEventListener('click',(event)=>{
        // 盒子内部点击 修改是否跟随鼠标移动
        needMoving = !needMoving
        //计算相对位置
        if(needMoving){
            boxEl.style.cursor = 'grab'
            boxMoveWithMouse(event,boxEl)
            document.addEventListener('mousemove', changeElXY)
        }else{
            relativeX =  0
            relativeY = 0
             boxEl.style.cursor = 'default'
        //  移除鼠标移动事件
        document.removeEventListener('mousemove', changeElXY);
        }
    })
    // 鼠标移入盒子 盒子跟随鼠标移动
    function boxMoveWithMouse(e,el){
        // 鼠标在文档位置
      let  pageX = e.pageX
      let  pageY = e.pageY
        // 盒子在文档位置
        let boxOffX = el.offsetLeft
        let boxOffY = el.offsetTop
        // console.log('boxOffX',boxOffX)
        // console.log('boxOffY',boxOffY)
        // 盒子在文档相对位置
        relativeX = pageX - boxOffX
        relativeY = pageY - boxOffY
        // console.log('relativeX',relativeX)
        // console.log('relativeY',relativeY)
    }
     //修改元素位置
     function changeElXY(event){
        //  //鼠标不在盒子里面
         if(relativeX<0||relativeY<0){
         return
        }
       let pageX = event.pageX
        let pageY = event.pageY
        //  console.log('pageX',pageX)
        //  console.log('pageY',pageY)

        // 盒子位置
        let boxX = pageX - relativeX
        let boxY = pageY - relativeY
        // console.log('boxX',boxX)
        // console.log('boxY',boxY)
        //修改盒子位置
        boxEl.style.left = boxX+'px'
        boxEl.style.top = boxY + 'px'
        }
    
    </script>
</body>
</html>

效果演示

相关推荐
道不尽世间的沧桑1 小时前
第17篇:网络请求与Axios集成
开发语言·前端·javascript
diemeng11192 小时前
AI前端开发技能变革时代:效率与创新的新范式
前端·人工智能
bin91534 小时前
DeepSeek 助力 Vue 开发:打造丝滑的复制到剪贴板(Copy to Clipboard)
前端·javascript·vue.js·ecmascript·deepseek
晴空万里藏片云6 小时前
elment Table多级表头固定列后,合计行错位显示问题解决
前端·javascript·vue.js
曦月合一6 小时前
html中iframe标签 隐藏滚动条
前端·html·iframe
奶球不是球6 小时前
el-button按钮的loading状态设置
前端·javascript
kidding7236 小时前
前端VUE3的面试题
前端·typescript·compositionapi·fragment·teleport·suspense
无责任此方_修行中8 小时前
每周见闻分享:杂谈AI取代程序员
javascript·资讯
Σίσυφος19008 小时前
halcon 条形码、二维码识别、opencv识别
前端·数据库
学代码的小前端8 小时前
0基础学前端-----CSS DAY13
前端·css