原生JS实现各种运动之拖拽碰撞加重心运动

2020-11-26 15:32:01 浏览数 (1)

分享一个用原生JS实现的拖拽碰撞加上重心运动的小Demo,效果如下:

以下是代码实现,欢迎大家复制粘贴及吐槽。

代码语言:javascript复制
<!DOCTYPE html>
<html>

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>原生JS实现各种运动之拖拽碰撞加重心运动</title>
    <style>
        #div1 {
            width: 100px;
            height: 100px;
            background: red;
            position: absolute;
        }

        div {
            width: 3px;
            height: 3px;
            position: absolute;
            background: black;
        }
    </style>
    <script>

        var timer = null;

        var iSpeedX = 0;
        var iSpeedY = 0;

        window.onload = function () {

            var oDiv = document.getElementById('div1');

            var lastX = 0;
            var lastY = 0;

            //为当前元素添加鼠标摁下事件
            oDiv.onmousedown = function (ev) {
                //事件兼容
                var oEvent = ev || event;

                //计算鼠标相对于元素左上角的位置
                var disX = oEvent.clientX - oDiv.offsetLeft;
                var disY = oEvent.clientY - oDiv.offsetTop;

                //添加鼠标移动事件
                document.onmousemove = function (ev) {
                    //事件兼容
                    var oEvent = ev || event;

                    //计算元素相对于当前屏幕的位置
                    var l = oEvent.clientX - disX;
                    var t = oEvent.clientY - disY;

                    //赋值给当前元素,实再同步移动
                    oDiv.style.left = l   'px';
                    oDiv.style.top = t   'px';

                    //用当前位置减去上次的位置以计算当前拖动中X和Y轴的速度
                    iSpeedX = l - lastX;
                    iSpeedY = t - lastY;

                    //更新当前点,方便下次计算
                    lastX = l;
                    lastY = t;

                };

                //当鼠标抬起时
                document.onmouseup = function () {
                    //清空移动事件与抬起事件
                    document.onmousemove = null;
                    document.onmouseup = null;
                    //执行碰撞运动
                    startMove();
                };
                //当鼠标按下的时候,关闭定时器,以免拖拽与碰撞事件冲突
                clearInterval(timer);
            };
        };



        function startMove() {

            clearInterval(timer);

            timer = setInterval(function () {

                var oDiv = document.getElementById('div1');
                //将Y轴增加速度,实现重力运动
                iSpeedY  = 3;

                var l = oDiv.offsetLeft   iSpeedX;
                var t = oDiv.offsetTop   iSpeedY;

                //当元素碰到底边时
                if (t >= document.documentElement.clientHeight - oDiv.offsetHeight) {
                    //速度递减
                    iSpeedY *= -0.8;
                    iSpeedX *= 0.8;
                    //误差强行赋值
                    t = document.documentElement.clientHeight - oDiv.offsetHeight;

                    //当元素碰到上边时
                } else if (t <= 0) {
                    //速度递减
                    iSpeedY *= -1;
                    iSpeedX *= 0.8;
                    //误差强行赋值
                    t = 0;
                }

                //当元素碰到右边时
                if (l >= document.documentElement.clientWidth - oDiv.offsetWidth) {
                    //速度递减
                    iSpeedX *= -0.8;
                    //误差强行赋值
                    l = document.documentElement.clientWidth - oDiv.offsetWidth;
                    //当元素碰到左边时
                } else if (l <= 0) {
                    //速度递减
                    iSpeedX *= -0.8;
                    //误差强行赋值
                    l = 0;
                }


                //当X轴的速度绝对值小于0时
                if (Math.abs(iSpeedX) < 1) {
                    //强行终止
                    iSpeedX = 0;
                }
                //当Y轴的速度绝对值小于0时
                if (Math.abs(iSpeedY) < 1) {
                    //强行终止
                    iSpeedY = 0;
                }


                //当速度为零,元素碰到底边时
                if (iSpeedX == 0 &&
                    iSpeedY == 0 &&
                    t == document.documentElement.clientHeight - oDiv.offsetHeight) {

                    clearInterval(timer);

                } else {

                    oDiv.style.left = l   'px';
                    oDiv.style.top = t   'px';
                }

            }, 30);
        }
    </script>
</head>

<body>
    <input type="button" value="开始运动" onclick="startMove()" />
    <div id="div1"></div>
</body>

</html>

0 人点赞