节流阀以及案例

什么是节流

节流策略,可以减少一段时间内时间的触发频率,直到上一个同样的事件结束才能重新触发

 

节流的应用场景

  1. 鼠标连续不断的触发某事件(如点击),在单位时间内只触发一次
  2. 懒加载时要监听计算滚动条的位置,但不必每次滑动都触发,可以降低计算的频率,而不去浪费CPU资源

节流阀的概念

节流阀为空则可以执行下次操作,不为空则不能执行下次操作

当前操作执行完,必须将节流阀重置为空,表示可以执行下次操作了

每次执行操作前,必须先判断节流阀是否为空

 

节流案例:鼠标跟随效果

不使用节流实现鼠标跟随效果

<!doctype html>
<html>

<head>
    <meta charset="utf-8">
    <title>跟随鼠标的天使</title>

    <style>
        img {
            position: absolute;
            top: 2px;
        }
    </style>

</head>

<body>

    <img src="./img/angel.gif" alt="">

    <script>
        var pic = document.querySelector('img');
        document.addEventListener('mousemove', function(e) {
            //1.只要鼠标移动就会触发这个事件
            //			console.log('aa');
            //2.每次鼠标移动,获取最新的鼠标坐标,把这个x和y坐标作为图片的top和left值就可以移动图片
            var x = e.pageX;
            var y = e.pageY;
            //			console.log(x,y);
            //一定要给left top添加 px 单位
            pic.style.left = x - 30 + 'px';
            pic.style.top = y - 40 + 'px';
        })
    </script>
</body>

</html>

使用节流阀优化鼠标跟随效果

<!doctype html>
<html>

<head>
    <meta charset="utf-8">
    <title>跟随鼠标的天使</title>

    <style>
        img {
            position: absolute;
            top: 2px;
        }
    </style>

</head>

<body>

    <img src="./img/angel.gif" alt="">

    <script>
        var pic = document.querySelector('img');
        var timer = null; //预定义一个timer节流阀
        document.addEventListener('mousemove', function(e) {
            if (timer) { //判断节流阀是否为空 为空则证明距离上次执行间隔不足16毫秒
                return
            }
            timer = setTimeout(function() {
                //1.只要鼠标移动就会触发这个事件
                //			console.log('aa');
                //2.每次鼠标移动,获取最新的鼠标坐标,把这个x和y坐标作为图片的top和left值就可以移动图片
                //			console.log(x,y);
                //一定要给left top添加 px 单位
                pic.style.left = e.pageX - 30 + 'px';
                pic.style.top = e.pageY - 40 + 'px';
                timer = null; //清空timer节流阀 方便下次开启延时器
            }, 30)
        })
    </script>
</body>

</html>

 

总结防抖和节流的区别

防抖: 如果事件被频繁的触发,防抖能保证只有最后一次触发生效,前面的多次触发都会被忽略

节流: 如果事件被频繁触发,节流能够减少事件触发的频率,因此,节流是有选择性的执行一部分事件

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值