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

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>

效果演示

相关推荐
玲小珑2 分钟前
Next.js 教程系列(二十七)React Server Components (RSC) 与未来趋势
前端·next.js
Mike_jia2 分钟前
UptimeRobot API状态监控:零成本打造企业级业务健康看板
前端
江城开朗的豌豆3 分钟前
React状态更新踩坑记:我是这样优雅修改参数的
前端·javascript·react.js
CodeSheep21 分钟前
Stack Overflow,轰然倒下了!
前端·后端·程序员
i紸定i21 分钟前
解决html-to-image在 ios 上dom里面的图片不显示出来
前端·ios·vue·html·html-to-image
ai.Neo22 分钟前
(第十七期)HTML图像标签详解:从入门到精通
前端·html
阿珊和她的猫23 分钟前
autofit.js: 自动调整HTML元素大小的JavaScript库
开发语言·javascript·html
excel26 分钟前
JS 函数终极指南:this、闭包、递归、尾调用、柯里化,一次性吃透
前端
夏天想27 分钟前
html模拟websocket通信
前端
阿珊和她的猫5 小时前
v-scale-scree: 根据屏幕尺寸缩放内容
开发语言·前端·javascript