还在用 JS 做节流吗?CSS 也可以防止按钮重复点击

2023-05-27 0 791

不可否认,表达式IIS(throttle)是 JS 中两个十分常用的强化方式,能有效率避免表达式过分频密的继续执行。

举个范例:两个留存按键,为的是避免多次重复递交或是伺服器考量,常常须要对点选犯罪行为做一定的管制,比如说只容许每300ms递交一场,这时我想绝大部分老师单厢到网路上间接复本几段throttle表达式,或是间接提及lodash辅助工具库

btn.addEventListener(click, _.throttle(save, 300))

只不过除 JS 形式, CSS 也能十分轻而易举同时实现这种两个机能,无须任何人架构库,一同看一看吧

一、CSS 同时实现路子预测

CSS 同时实现和 JS 的观念相同,须要从另两个视角去审视这个问题。

比如说这儿的须要对点选该事件进行管制,也是停止使用点选该事件,再说有甚么形式能停止使用该事件,要说,是pointer-events;

接着是天数的管制,每天点选后须要手动停止使用300ms,天数之后再次恢复正常,因此,有甚么优点和天数和状况恢复正常相关呢?要说,是animation;

除此以外,还须要有促发最佳时机,这儿是点选犯罪行为,因此必定和regardless:active相关连。

因此,综合性预测,同时实现这种两个机能须要加进pointer-events、animation和:active,因此怎样将这些路子串连起来呢?

还在用 JS 做节流吗?CSS 也可以防止按钮重复点击

思索3秒…

你想不到了吗?

只不过这种情景能认知成是对 CSS 动画电影的掌控,比如说有两个动画电影掌控按键从停止使用->可点选的变动,每天点选时让这个动画电影再次继续执行一遍,在继续执行的过程中,一直处于停止使用状况,是不是就达到了“IIS”的效果了?

接下来看一看具体同时实现

二、CSS 动画电影的精准掌控

假设有两个按键,绑定了两个点选该事件

留存

这时的按键连续点击就会不断地促发,效果如下

还在用 JS 做节流吗?CSS 也可以防止按钮重复点击

下面定义两个关于pointer-events的动画电影,就叫做 throttle 吧

@keyframes throttle { from { pointer-events: none; } to { pointer-events: all; } }

很简单吧,是从停止使用可点选的变动。

接下来,将这个动画电影绑定在按键上,这儿为的是方便测试,将动画电影设置成了2s

button{ animation: throttle 2s step-end forwards; }

注意,这儿动画电影的缓动表达式设置成了阶梯曲线,step-end,它能很方便掌控pointer-events的变动天数点。

有兴趣的能参考这篇文章:CSS3 animation属性中的steps机能符深入介绍 « 张鑫旭-鑫空间-鑫生活 (zhangxinxu.com)[1]

如下示意,pointer-events在0~2秒内的值都是none,一旦到达2秒,就立刻变成了all,由于是forwards,会一直保持all的状况

还在用 JS 做节流吗?CSS 也可以防止按钮重复点击

最后,在点选时再次继续执行一遍动画电影,只须要在按下时设置动画电影为none就行了

这个技巧之前在这篇文章中有更详细的介绍:CSS 同时实现按键点选动效的套路

同时实现如下

button:active{ animation: none; }

为的是演示方便,我们暂时把颜色变动也加在动画电影里

@keyframes throttle { from { color: red; pointer-events: none; } to { color: green; pointer-events: all; } }

现在如果文字是red,表示是禁用态,只有是green,才表示能被点选,十分清晰明了,如下

还在用 JS 做节流吗?CSS 也可以防止按钮重复点击

下面是最终点选对比效果,很好地管制了点选频率

还在用 JS 做节流吗?CSS 也可以防止按钮重复点击

完整代码如下,就这么几行,如果须要改管制天数,间接改动画电影天数就行了

button{ animation: throttle 2s step-end forwards; } button:active{ animation: none; } @keyframes throttle { from { pointer-events: none; } to { pointer-events: all; } }

你也能查看以下任意链接:

CSS throttle (codepen.io)[2]CSS throttle – 码上掘金 (juejin.cn)[3]CSS throttle (runjs.work)[4]三、CSS 同时实现的其他路子

还记得之前这一篇文章吗?

还在用定时器吗?借助 CSS 来监听事件

借用这种路子,也能很轻松同时实现IIS的效果。而且为的是更好的体验,能用上真正的按键停止使用

btn.disabled = true

具体路子是这种的,通过:active去促发transition变动,接着通过监听transition回调去动态设置按键的停止使用状况,同时实现如下

定义两个无关紧要的过渡属性,比如说opacity

button{ opacity: .99; transition: opacity 2s; } button:not(:disabled):active{ opacity: 1; transition: 0s; }

接着监听transition的起始回调

// 过渡开始 document.addEventListener(transitionstart, function(ev){ ev.target.disabled = true }) // 过渡结束 document.addEventListener(transitionend, function(ev){ ev.target.disabled = false })

这种做的最大好处是,这部分停止使用的逻辑是完全和业务逻辑是解耦的,能在任意时候,任意场合下无缝接入,也不受架构和环境影响,效果如下

还在用 JS 做节流吗?CSS 也可以防止按钮重复点击

完整代码也能查看以下任意链接:

CSS throttle disabled (codepen.io)[5]CSS throttle disabled – 码上掘金 (juejin.cn)[6]CSS throttle disabled (runjs.work)[7]四、总结一下

以上通过 CSS 的路子同时实现了类似“IIS”的机能,相比 JS 同时实现而言,同时实现更精简、使用更简单,没有架构管制,下面一同总结一下同时实现要点:

表达式IIS是两个十分常用的强化形式,能有效率避免表达式过分频密的继续执行CSS 的同时实现路子和 JS 相同,重点在于在于找到和该情景相关联的属性CSS 同时实现“IIS”只不过是掌控两个动画电影的精准掌控,假设有两个动画电影掌控按键从停止使用可点选的变动,每天点选时让这个动画电影再次继续执行一遍,在继续执行的过程中,一直处于停止使用状况,这种就达到了“IIS”的效果还可以通过 transition 的回调表达式动态设置按键停止使用态这种同时实现的好处在于停止使用逻辑和业务逻辑是完全解耦的

不过,这种同时实现形式还是比较有局限的,仅限于点选犯罪行为,像很多时候,IIS可能会用在滚动该事件或是键盘该事件上,像这些情景就用传统形式同时实现就行了。最后,如果觉得还不错,对你有帮助的话,欢迎点赞、收藏、转发❤❤❤

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务