众所周知,函数节流(throttle)是 JS 中一个非常常见的优化手段,可以有效避免函数过于频繁的执行。

举个例子:一个保存按钮,为了避免重复提交或者服务器考虑,往往需要对点击行为做一定的限制,比如只允许每300ms提交一次,这时候我想大部分同学都会到网上直接拷贝一段throttle函数,或者直接引用lodash工具库

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

其实除了 JS 方式, CSS 也可以非常轻易实现这样一个功能,无需任何框架库,一起看看吧

CSS 实现思路分析

CSS 实现和 JS 的思维不同,需要从另一个角度去看待这个问题。

比如这里的需要对点击事件进行限制,也就是禁用点击事件,想想有什么方式可以禁用事件,没错,就是pointer-events;

然后是时间的限制,每次点击后需要自动禁用300ms,时间过后重新恢复,那么,有什么特性和时间以及状态恢复有关呢?没错,就是animation;

除此之外,还需要有触发时机,这里是点击行为,所以必然和伪类:active有关联。


<--  html  -->
<button onclick="console.log('保存')">保存</button>
<--  html  -->

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

注意,这里动画的缓动函数设置成了阶梯曲线,step-end,它可以很方便控制pointer-events的变化时间点。

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

最新文章

  1. Android 点击ListView(或GridView)的一个item,使其里面textview变色,点击另一个这个恢复原来颜色
  2. 修改编码格式MySQL
  3. MAC终端配色Solarized
  4. datatable列操作
  5. java 之 抽象工厂模式(大话设计模式)
  6. free 命令详解
  7. python3之迭代器&amp;生成器
  8. JAVA NIO之文件通道
  9. JVM(六)为什么新生代有两个Survivor分区?
  10. Openlayer 3加载本地ArcGIS切片
  11. [LeetCode] Binary Tree Pruning 二叉树修剪
  12. jQuery之遍历索引相关方法
  13. vue_drf之实现极验滑动验证码
  14. hiho1460 rmq模板题
  15. Spring Boot 集成 Mybatis 实现双数据源
  16. 使用spring-boot-starter-data-jpa 怎么配置使运行时输出SQL语句
  17. 喵哈哈村的魔法考试 Round #9 (Div.2) 题解
  18. spring-boot-mybatis-多数据源
  19. Visual Studio断点调试, 无法监视变量, 提示无法计算表达式
  20. Vagrant (1) —— 基本安装与配置(上)

热门文章

  1. C Primer Plus 5.11 編程練習
  2. 深入Typescript--02-Typescript数据类型
  3. 从0开始学习VUE3--01-Vue2与Vue3的不同点
  4. ionic+vue+capacitor系列笔记--03项目使用Native插件
  5. Spring AOP与AspectJ的对比及应用
  6. 关于Mysql外键从新学习
  7. JAVA虚拟机-01-JAVA虚拟机家族简介
  8. Linux07-常用命令-权限
  9. LeetCode HOT 100:乘积最大子数组(动态规划)
  10. 学习Java Day2