JS实现自动在屏幕随机生成小星星,点击星星消失,使用事件委托优化

需求

        1 每隔1s屏幕上就出现一个星星

        2 img的大小是10-25px,位置随机,但是要在可视窗口之内

        3 点击随便一个星星,星星消失

方法一如下:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        img {
            position: absolute;
        }
    </style>
</head>

<body bgcolor="#000">
    <script>
        // 需求
        // 1 每隔1s我的屏幕上就出现一个星星
        // 2 img的大小是5-20px,位置随机,但是要在可视窗口之内
        // 3 把创建好的img标签插入到我的屏幕上
        // 4 点击随便一个星星,星星消失 
        // 0-1  random*10   0-10  [5,20)
        function rand(m, n) {
            var min = Math.min(m, n)
            var max = Math.max(m, n)
            min = Math.ceil(min) //向上取整
            max = Math.floor(max) //向下取整
            return min + Math.random() * (max - min)
        }


        setInterval(
            function () {
                var img = document.createElement('img')
                img.src = './imgs/star.gif'
                //给星星图片随机5-25px大小
                img.width = rand(5, 50)
                img.height = img.width
                //随机定位到窗口任意位置
                img.style.left = rand(0, window.innerWidth - img.width) + 'px'
                img.style.top = rand(0, window.innerHeight - img.height) + 'px'
                document.body.appendChild(img)
                var imgs = document.querySelectorAll('img')
                for (var i = 0; i < imgs.length; i++) {
                    imgs[i].onclick = function () {
                        // console.log(imgs[i]) //动态变化用索引捕获不到
                        // console.log(this) //用this指向可以
                        this.remove()
                    }
                }
            }, 1000
        )
    </script>
</body>

</html>

此方法每次计时要进行i循环,而且循环呈线性增长,故可用父元素添加事件委托实现优化

方法2:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>

        // 一个随机数函数 在输入的m和n之间生成一个随机数
        function rand(m, n) {
            var min = Math.min(m, n)
            var max = Math.max(m, n)
            return min + Math.random() * (max - min)
        }

        setInterval(
            function () {
                var img = document.createElement('img')
                img.src = './imgs/star.gif'
                img.width = rand(10, 25)
                img.height = img.width
                img.style.left = rand(0, window.innerWidth - img.width) + 'px'
                img.style.top = rand(0, window.innerHeight - img.height) + 'px'
                document.body.appendChild(img)
            }, 1000
        )
        //给body元素绑定点击事件
        document.body.onclick = function () {
            //event.target指向事件源
            var target = event.target
            target.remove()
        }
    </script>
</body>
<style>
    img {
        position: absolute;
    }
    body{
        background-color: black;
    }
</style>
</html>

星星图:

页面效果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值