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

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>

效果演示

相关推荐
子兮曰13 小时前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰13 小时前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万13 小时前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝13 小时前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋14 小时前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁14 小时前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
李少兄15 小时前
JavaScript 隐式全局变量解析
javascript
汉堡大王952716 小时前
Jev:不是聊天机器人, 而是一个智能 if 语句
前端·人工智能·后端
梦想很大很大16 小时前
从运行事实到回归证据:Workrun 的 Telemetry 与 Evaluation 实践
前端·人工智能·后端
计算机魔术师16 小时前
Meta Muse agent 接入 Shopify 的 Shop Pay 实现代理式购物
前端