js鼠标拖拽移动盒子但只在父框内移动(三种写法)

// 1 父框没有定位
 <style>
        #box {
            width: 50px;
            height: 50px;
            background-color: #e74c3c;
            position: absolute;
        }
        
        #plus_box {
            width: 300px;
            height: 300px;
            border: 1px solid red;
            margin: 100px auto;
        }
    </style>
</head>

<body>
    <!-- 定义一个盒子 -->
    <div id="plus_box">
        <div id="box"></div>
    </div>
    <script>
        /* 获取box的节点元素 */
        var box = document.getElementById('box')
            /* 获取父盒子 */
        var plus_box = document.getElementById('plus_box');
        /* 定义一个变量 */
        var flag = false;
        /* 定义两个值,保存鼠标按下时初始值 */
        var p_left = 0,
            p_top = 0;
        /* 绑定鼠标按下 */
        box.onmousedown = function(e) {
                flag = true
                    /* 定义两个值,保存鼠标按下时位置 */
                p_left = e.offsetX;
                p_top = e.offsetY;
            }
            /* 鼠标抬起 */
        document.onmouseup = function() {
            flag = false
        }
        var pl = plus_box.offsetLeft
        var pt = plus_box.offsetTop
            /* 鼠标移动 */
        document.onmousemove = function(e) {
            if (!flag) {
                return;
            }
            /* 求坐标点 */
            var x = e.pageX - p_left;
            var y = e.pageY - p_top;

            /* 超出时的 */
            if (x < pl) {
                /* x的值为 */
                x = pl
            }
            if (y < pt) {
                y = pt
            }
            /* 求left最大值 */
            var maxLeft = pl + (plus_box.offsetWidth - box.offsetWidth);
            var maxTop = pt + (plus_box.offsetHeight - box.offsetHeight);
            if (x > maxLeft) {
                x = maxLeft
            }
            if (y > maxTop) {
                y = maxTop
            }
            /* 将坐标赋值给盒子 */
            box.style.left = x + 'px';
            box.style.top = y + 'px';
        }
    </script>
</body>
//2 父框定位
 <style>
        #box {
            width: 50px;
            height: 50px;
            background-color: #e74c3c;
            position: absolute;
        }
        
        #plus_box {
            width: 300px;
            height: 300px;
            border: 1px solid red;
            position: relative;
            margin: 100px auto;
        }
    </style>
</head>

<body>
    <!-- 定义一个盒子 -->
    <div id="plus_box">
        <div id="box"></div>
    </div>
    <script>
        /* 获取box的节点元素 */
        var box = document.getElementById('box')
            /* 获取父盒子 */
        var plus_box = document.getElementById('plus_box');
        /* 定义一个变量 */
        var flag = false;
        /* 定义两个值,保存鼠标按下时初始值 */
        var p_left = 0,
            p_top = 0;
        /* 绑定鼠标按下 */
        box.onmousedown = function(e) {
                flag = true
                    /* 定义两个值,保存鼠标按下时位置 */
                p_left = e.offsetX;
                p_top = e.offsetY;
            }
            /* 鼠标抬起 */
        document.onmouseup = function() {
            flag = false
        }
        var pl = plus_box.offsetLeft
        var pt = plus_box.offsetTop
            /* 鼠标移动 */
        document.onmousemove = function(e) {
            if (!flag) {
                return;
            }
            /* 求坐标点 */
            var x = e.pageX - p_left - plus_box.offsetLeft;
            var y = e.pageY - p_top - plus_box.offsetTop;

            /* 超出时的 */
            if (x < 0) {
                /* x的值为 */
                x = 0
            }
            if (y < 0) {
                y = 0
            }
            /* 求left最大值 */
            var maxLeft = plus_box.offsetWidth - box.offsetWidth;
            var maxTop = plus_box.offsetHeight - box.offsetHeight;
            if (x > maxLeft) {
                x = maxLeft
            }
            if (y > maxTop) {
                y = maxTop
            }
            /* 将坐标赋值给盒子 */
            box.style.left = x + 'px';
            box.style.top = y + 'px';
        }
    </script>
</body>
//3 优化后的写法
<style>
        * {
            margin: 0;
            padding: 0;
        }
        
        #box {
            width: 100px;
            height: 100px;
            background-color: #e74c3c;
            position: absolute;
        }
        
        #big-box {
            width: 600px;
            height: 600px;
            border: 1px solid slateblue;
            margin: 100px auto;
            position: relative;
        }
    </style>
</head>

<body>
    <div id="big-box">
        <div id="box"></div>
    </div>
    <!-- 
    父盒子定位
   -->
    <script>
        //获取box元素节点
        var box = document.getElementById('box');
        //获取大盒子
        var bigBox = document.getElementById('big-box');


        //定义一个变量,用于控制盒子是否可以移动。默认值为false,不可以动。
        var flag = false;
        //定义两个值,用于保存 鼠标按下时,鼠标距离盒子边框的偏移量。
        var b_left = 0,
            b_top = 0;

        //绑定鼠标按下
        box.onmousedown = function(e) {
                flag = true;
                b_left = e.offsetX;
                b_top = e.offsetY;
                //绑定鼠标移动事件
                document.onmousemove = function(e) {
                    //求当前盒子的left和top值  e.pageX - e.offsetX
                    //求坐标点 
                    var x = e.pageX - b_left - bigBox.offsetLeft;
                    var y = e.pageY - b_top - bigBox.offsetTop;
                    //left的最大值 : 大盒子宽-小盒子宽
                    var maxLeft = bigBox.offsetWidth - box.offsetWidth;
                    //top的最大值  大盒子高-小盒子高
                    var maxTop = bigBox.offsetHeight - box.offsetHeight;
                    //移动之前判断是否超出边界
                    if (x < 0) {
                        x = 0;
                    } else if (x > maxLeft) {
                        x = maxLeft
                    }
                    if (y < 0) {
                        y = 0;
                    } else if (y > maxTop) {
                        y = maxTop;
                    }

                    //将坐标赋值给盒子
                    box.style.left = x + "px";
                    box.style.top = y + "px";

                }
            }
            //绑定鼠标抬起
        document.onmouseup = function() {
            document.onmousemove = null;
        }
    </script>
</body>

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值