CSS实现防止按钮重复点击,双击进入两次单机的情况

14,068次阅读
没有评论

共计 1494 个字符,预计需要花费 4 分钟才能阅读完成。

前言

之前有文章写过 如何避免双击进入两次单机 的情况,当然你也可以通过节流来实现,实现的方案很多,今天主要介绍一下如何通过 css 来实现,也就是 css 来实现按钮节流。

实现思路

我们可以用 pointer-events 或者 disabled 等方式,对按钮进行节流,如何操作呢?

实现方案

pointer-events 加 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 的状态。

思路延展

其实,根据这个,我们有很多按钮动画特性可以实现,特别是利用 active

:root{--primary-color: royalblue;}
.button{
  padding: 5px 16px;
  color: #000000d9;
  border: 1px solid #d9d9d9;
  background-color: transparent;
  border-radius: 2px;
  line-height: 1.4;
  box-shadow: 0 2px #00000004;
  cursor: pointer;
  transition: .3s;
}
.button:hover{color: var(--primary-color);
  border-color: currentColor;
}

.button::after{
  content: '';
  position: absolute;
  inset: 0;
  border-radius: inherit;
  opacity: 0.4;
  transition: .3s;
}

假如我们通过如下方式触发动画的话

.button:active::after{box-shadow: 0 0 0 6px var(--primary-color);
  opacity: 0;
}

发现动画出现了,可能抬起之后瞬间结束,比较生硬。
那时因为:active。:active 只有在鼠标按下时才会起作用,通常在点击一个按钮时,都是轻轻地点击,而不是长按,如果在:active 上添加动画,那么在鼠标抬起的时候,动画一般都没有结束,所以会导致在鼠标抬起的时候,动画马上就停止了,如果是 transition,还会有一个“回退”的过渡效果。

所以改进如下:

.button::after{
  /* 其他样式 */
  opacity: 0;
  box-shadow: 0 0 0 6px var(--primary-color);
  transition: .3s;
}
/* 点击 */
.button:active::after{
  box-shadow: none;
  opacity: 0.4;
  transition: 0s; /* 取消过渡 */
}

这样就比较完美,我们可以再 active 的时候取消动画。和上面节流的原理一样。

小结

本文,除了 css 控制点击节流之外,css 按钮动画,添加动画的时候,我们给按钮添加一个动画,

.button{animation: 动画名字 1s;}

我们可以通过 active 控制结束动画,例如:

.button:active{animation: none;}

这样就可以实现比较好看的点击动画效果。

    正文完
     0
    Yojack
    版权声明:本篇文章由 Yojack 于1970-01-01发表,共计1494字。
    转载说明:
    1 本网站名称:优杰开发笔记
    2 本站永久网址:https://yojack.cn
    3 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行删除处理。
    4 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
    5 本站所有内容均可转载及分享, 但请注明出处
    6 我们始终尊重原创作者的版权,所有文章在发布时,均尽可能注明出处与作者。
    7 站长邮箱:laylwenl@gmail.com
    评论(没有评论)