functionthrottled(fn,delay=500){ let oldTime=newDate.now(); returnfunction(...args){ let context=this; let newTime=newDate.now(); if(newTime-oldTime>=delay){ fn.apply(context,args); oldTime=newDate.now(); } } }
用定时器实现
1 2 3 4 5 6 7 8 9 10 11 12
functionthrottled(fn,delay=500){ let timer=null; returnfunction(..args){ let context=this; if(!timer){//n秒内只运行一次,若在n秒内重复触发,只有一次生效 timer=setTimeout(()=>{ fn.apply(context,args); timer=null; },delay) } } }
防抖:
1 2 3 4 5 6 7 8 9 10
functiondebounce(fn,delay=500){ let timer; returnfunction(...args){ let context=this; clearTimeout(timer); timer=setTimeout(()=>{ fn.apply(context,args);//n秒内只能触发一次,若在n秒内重复触发,都会被清除,重新计时 },delay) } }
立即执行的防抖函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
functiondebounce(fn,delay=500,immediate){ let timer; returnfunction(...args){ let context=this; if(timer)clearTimeout(timer); if(immediate){ immediate=!immediate; fn.apply(context,args); }else{ timer=setTimeout(()=>{ fn.apply(context,args); },delay) } } }
在W3C官方中对 vertical-align做了下面的解释: This property affects the vertical positioning inside a line box of the boxes generated by an inline-level element. 事实上,一个Box中由很多行很多元素组成,vertical-align只作用于在同一行内的元素,它的垂直并不是相对于整个Box而言的。如果把 vertical-align:middle 放到一个单元格元素,即table的td元素中,它的垂直居中显示是没任何问题的,因为它表示相对于改行的垂直高度居中显示。而在我设定的div块中并不只存在一行,因此它无法识别默认显示在顶部。