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

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>

效果演示

相关推荐
FRing037 小时前
vue2干货总结2(v-bind、v-for、v-model、指令修饰符、v-bind操作class和style)
开发语言·前端·vue.js·vue2
幸运小猿8 小时前
模拟慢上传-处理超时重试image 丢失线上问题
前端·javascript·html
moshuying9 小时前
网购能买Token了!
前端
h_65432109 小时前
echarts实现柱状图加一条横线
前端·echarts
风骏时光牛马9 小时前
生成一个后端标题,只需要一个标题,不需要其他的任何文本。
前端
子非鱼@Itfuture9 小时前
关于前后端联调中登录状态/登录信息失效?
java·前端
郭小李9 小时前
openFeign入门
java·开发语言·前端
馒头不想说话10 小时前
AI当运营,帮你省人力
前端
梦曦i10 小时前
uni-app x下自研架构的工程化突围
前端·架构·uni-app x
速易达网络10 小时前
ECharts 图表制作完全指南:从零到可视化实战
前端·javascript·echarts