为了账号安全,请及时绑定邮箱和手机立即绑定

返回顶部效果,性能问题

返回顶部效果,性能问题

小怪兽爱吃肉 2018-10-17 17:23:41
window.onscroll = function(){    var top = document.documentElement.scrollTop || document.body.scrollTop;    if(top >= 300){         ele.style.display = 'block'     }else{         ele.style.display = 'none'     } }当滚动300px后,display为block;以后鼠标向下滑动都会运行ele.style.display = 'block',虽然当时的ele已经为block,但是这样持续运行这句 会不会持续重绘影响性能。
查看完整描述

1 回答

?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

滚动的时候,会一直触发滚动的回调函数
在回调函数中使用如果逻辑简单还好,如果涉及到强逻辑建议加上节流函数来控制,简单的实现方式如下

var intervalwindow.addEventListener('scroll', function(){    if(interval){
        clearTimeout(interval)
    }
    interval = setTimeout(function(){        // 这里写主要的业务逻辑
        // 这样所有的复杂操作都会延迟300毫秒执行,并且不会因为多次滚动导致反复触发
    }, 300)
})

之前由于概念没弄清楚,所以写了个错误的示范,虽然上面的示范也能执行,但是下面的示范也许会更适合当前的场景,感觉小明同学指出

var frequency = 300 // 300毫秒执行一次var intervalvar lastwindow.addEventListener('scroll', function(){    var now = Date.now()    
if(last && last < now + frequency){        // 保证滚动停下之后的300ms还会再执行一次
        if(interval){
            clearTimeout(interval)
            
        }
        interval = setTimeout(function(){
            last = now
            doSomething()
        }, frequency)
    }else{
        last = now
        doSometing()
    }
})function doSomething(){}

当然上面只是一个简单的实现,网上有很多关于Debounce(防抖),Throttle(节流)的封装,楼主可以自行参考与学习


查看完整回答
反对 回复 2018-11-17
  • 1 回答
  • 0 关注
  • 471 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信