原生js实现小球在屏幕上自由移动,当遇到屏幕边缘时反弹

小球在桌面上自由移动,要清楚的几个问题
1、小球在桌面移动的最大距离是多少
2、小球移动的步长是多少
3、当小球碰到屏幕边缘时怎么实现反弹
4、 如何实现多个小球
5、怎么实现小球的颜色及大小

关于第一步实现小球在桌面上移动的最大距离的思路
1、首先要获取桌面的宽度与高度,注意获取屏幕的宽度与高度需要封装一下,如下所示
宽:document.documentElement.clientWidth || document.body.clientWidth;
高:document.documentElement.clientHeight || document.body.clientHeight;

2、其次再获取小球的宽与高,
3、二者相减就是小球移动的最大距离

关于第二步实现小球移动的步长的思路
需要设置两个步长 ,一个水平方向的步长 ,一个垂直方向的步长 ,这样方便实现第6个问题的反弹

关于第三步实现当小球碰到屏幕边缘时需要反弹的思路
当小球碰到屏幕边缘时需要反弹, 我们知道在水平方向上移动元素时,向右是**+,向左是—** , 垂直方向上向下是**+, 向上是—** , 所以可以看出两个方向正好相反,利用将步长取反就可以实现

关于第四步实现多个小球的思路
可以肯定的是不能将小球写成具体的数字,要动态的添加小球,因为当要添加几十个的时候只需修改数字就好,方便更改,所以需要利用document.createElement(元素)和appendChild() 来实现,

关于第步实现颜色及大小的思路
1、 对于大小,需要创建一个数组,对于颜色,利用rgbq来取值,颜色与大小都是用随机数取值,
2、需要注意当小球的大小改变时,小球在窗口内可运动的最大距离也会改变,所以需要再更改窗口的最大距离

效果图 (视频加载,有点慢,可能需要等一下~ )

小球在桌面移动,碰到屏幕反弹

下面是代码展示

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>球移动</title>
    <style>
        *{
            margin: 0;
            padding: 0;
        }
        body{
            overflow: hidden;
        }
        .common{
            position: absolute;
            left:0;
            top:0;
            width: 60px;
            height: 60px;
            background-color: re;
            background-color: red;
            border-radius: 50%;
        }
    </style>
</head>
<body>
    <div class="common"></div>
    <script>
        // 获取小球的div
        var div = document.querySelector('div');
        
         // 获取小球在桌面移动的最大距离
        var width = document.documentElement.clientWidth || document.body.clientWidth;
        var height = document.documentElement.clientHeight || document.body.clientHeight;
        var newWidth = width  - div.offsetWidth;
        var newHeight = height - div.offsetHeight;
  
        // 设置小球移动的步长
        var step = [4,5,6,7,8,9,-4,-5,-6,-7,-8,-9];
        var stepx = getStep();
        var stepy = getStep();
       
        // 设置小球的大小
        var size = [30,40,50,60,70,80,90,100,110,120];
        
        // 函数的调用实现移动
        move(div,stepx,stepy,newWidth,newHeight);
        createBall(20);
        
        // 实现动态添加小球
       function createBall(num){
           var account = 0;
           var timer =  setInterval(function(){
                // 动态创建创建一个div小球
                var ball = document.createElement('div');
                ball.className = 'common';
                // 设置其样式 ,颜色与大小
                var newSize = getSize();
                console.log(newSize);
                ball.style.width = newSize + 'px';  // 一定要加px
                ball.style.height = newSize + 'px';
                // 设置新创建的小球可运运的窗口范围
                newWidth =  width  - newSize;
                newHeight = height - newSize;
                ball.style.backgroundColor = getColor();
                // 将动态创建的小球添加窗口中
                document.body.appendChild(ball);
                // 获取步长
                stepx = getStep();
                stepy = getStep();
                // 调用move使小球加入移动队列中
                move(ball,stepx,stepy,newWidth,newHeight);
                 // 当计数器 == 设定的数量时,停止计时器
                account++;
                if(account == num)
                    clearInterval(timer);
            },1000)
       }
       
        // 实现小球的移动 
        function move(obj,stepx, stepy,width,height){
            clearInterval(obj.timer)
             // 用来判断是否超出屏幕以及每次小球的距离
            var disx;  var disy ;
            obj.timer = setInterval(function(){
                disx = obj.offsetLeft + stepx;
                disy = obj.offsetTop  + stepy;
                if(disx >= width){   // 水平方向上判断是否超出右边屏幕
                    disx  = width;
                    stepx = -stepx;
                    obj.style.backgroundColor = getColor();
                }
                if(disx < 0){  // 水平方向上判断是否超出左边屏幕
                    disx  = 0;
                    stepx = -stepx;
                    obj.style.backgroundColor = getColor();
                }
                if(disy >= height){   // 垂直方向上判断是否超出下边屏幕
                    disy  = height;
                    stepy = -stepy;
                    obj.style.backgroundColor = getColor();
                }
                if(disy < 0){  // 垂直方向上判断是否超出上边屏幕
                    disy  = 0;
                    stepy = -stepy;
                    obj.style.backgroundColor = getColor();
                }
                obj.style.left = disx + 'px';
                obj.style.top  = disy + 'px';
            },50)
        }
        
        // 获取步长
        function getStep(){
            return step[Math.floor(Math.random() * step.length)];
        }
        
        // 获取颜色
        function getColor(){
            var r = Math.floor(Math.random() * 255);
            var g = Math.floor(Math.random() * 255);
            var b = Math.floor(Math.random() * 255);
            return "rgb(" + r + "," + g + "," + b + ")";
        }
        
        // 获取大小
         function getSize(){
            return size[Math.floor(Math.random() * size.length)];
        }
             
    </script>
</body>
</html>
    原文作者:杜沫
    原文地址: https://blog.csdn.net/qq_36091461/article/details/105290697
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞