成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

函數節流,CSS也能輕松實現:CSS防止按鈕重復點擊

開發 前端
一個保存按鈕,為了避免重復提交或者服務器考慮,往往需要對點擊行為做一定的限制,比如只允許每300ms提交一次,這時候我想大部分同學都會到網上直接拷貝一段throttle函數,或者直接引用lodash工具庫

眾所周知,函數節流(throttle)是 JS 中一個非常常見的優化手段,可以有效的避免函數過于頻繁的執行。

舉個例子:一個保存按鈕,為了避免重復提交或者服務器考慮,往往需要對點擊行為做一定的限制,比如只允許每300ms提交一次,這時候我想大部分同學都會到網上直接拷貝一段throttle函數,或者直接引用lodash工具庫。

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

其實除了 JS 方式, CSS 也可以非常輕易的實現這樣一個功能,無需任何框架庫,一起看看吧

一、CSS 實現思路分析

CSS 實現和 JS 的思維不同,需要從另一個角度去看待這個問題。

比如這里的需要對點擊事件進行限制,也就是禁用點擊事件,想想有什么方式可以禁用事件,沒錯,就是pointer-events;

然后是時間的限制,每次點擊后需要自動禁用300ms,時間過后重新恢復,那么,有什么特性和時間以及狀態恢復有關呢?沒錯,就是animation;

除此之外,還需要有觸發時機,這里是點擊行為,所以必然和偽類:active有關聯。

因此,綜合分析,實現這樣一個功能需要用到pointer-events、animation以及:active,那么如何將這些思路串聯起來呢?

思考3秒...

你想到了嗎?

其實這種場景可以理解成是對 CSS 動畫的控制,比如有一個動畫控制按鈕從禁用->可點擊的變化,每次點擊時讓這個動畫重新執行一遍,在執行的過程中,一直處于禁用狀態,是不是就達到了“節流”的效果了?

接下來看看具體實現

二、CSS 動畫的精準控制

假設有一個按鈕,綁定了一個點擊事件

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

這時的按鈕連續點擊就會不斷地觸發,效果如下:

下面定義一個關于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的變化時間點。

如下示意,pointer-events在0~2秒內的值都是none,一旦到達2秒,就立刻變成了all,由于是forwards,會一直保持all的狀態

最后,在點擊時重新執行一遍動畫,只需要在按下時設置動畫為none就行了

實現如下:

button:active{
animation: none;
}

為了演示方便,我們暫時把顏色變化也加在動畫里

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

現在如果文字是red,表示是禁用態,只有是green,才表示可以被點擊,非常清晰明了,如下:

下面是最終點擊對比效果,很好地限制了點擊頻率。

完整代碼如下,就這么幾行,如果需要改限制時間,直接改動畫時間就行了。

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

三、CSS 實現的其他思路

為了更好的體驗,可以用上真正的按鈕禁用

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
})

這樣做的最大好處是,這部分禁用的邏輯是完全和業務邏輯是解耦的,可以在任意時候,任意場合下無縫接入,也不受框架和環境影響,效果如下:

四、總結一下

以上通過 CSS 的思路實現了類似“節流”的功能,相比 JS 實現而言,實現更精簡、使用更簡單,沒有框架限制,下面一起總結一下實現要點:

  1. 函數節流是一個非常常見的優化方式,可以有效避免函數過于頻繁的執行
  2. CSS 的實現思路和 JS 不同,重點在于在于找到和該場景相關聯的屬性
  3. CSS 實現“節流”其實就是控制一個動畫的精準控制,假設有一個動畫控制按鈕從禁用->可點擊的變化,每次點擊時讓這個動畫重新執行一遍,在執行的過程中,一直處于禁用狀態,這樣就達到了“節流”的效果
  4. 還可以通過 transition 的回調函數動態設置按鈕禁用態
  5. 這種實現的好處在于禁用邏輯和業務邏輯是完全解耦的

不過,這種實現方式還是比較有局限的,僅限于點擊行為,像很多時候,節流可能會用在滾動事件或者鍵盤事件上,像這些場景就用傳統方式實現就行了。

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2022-11-14 18:43:03

JSCSS節流

2021-12-27 07:45:30

CSS 技巧煙霧效果

2021-10-19 22:23:47

CSSBeautiful按鈕

2010-09-13 16:04:27

CSS控制自動換行

2011-09-29 09:50:44

JavaScript

2022-02-21 07:02:16

CSSbeautiful按鈕

2010-09-03 14:09:28

CSSCSS樣式

2010-09-14 12:58:41

DIV+CSS圓角

2024-02-20 12:49:00

CSS函數前端

2012-04-10 10:49:45

WEBCSS

2023-11-08 08:43:08

calc函數CSS

2024-03-20 09:40:27

動畫技巧CSS逐幀動畫

2010-08-19 13:54:51

FirefoxIECSS

2022-03-28 08:44:15

css3水波動畫

2011-05-17 09:36:57

div+css

2025-03-07 10:14:31

2021-08-12 06:08:15

CSS 技巧組件狀態

2024-04-22 09:12:36

CSSflexgrid

2021-02-09 07:26:38

前端css技術熱點

2023-02-20 09:48:00

CSS浮動布局
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久久综合 | 天天操 夜夜操 | 欧美日韩国产中文字幕 | 免费看淫片 | 午夜精品三区 | 国产在线一区二区三区 | 国产精品久久久久久久久久久久久久 | 二区三区视频 | 草比av| 99亚洲精品 | 好婷婷网| 成人亚洲视频 | 久久久久一区二区三区 | 国产精品成人一区二区 | 91看片网址| 99久久婷婷国产亚洲终合精品 | 午夜免费在线 | 亚洲国产一区二区视频 | 懂色中文一区二区在线播放 | 精品国产18久久久久久二百 | www.欧美 | 中文字幕一区二区视频 | 91视频电影 | 亚洲免费精品 | 亚洲最大福利网 | 性福视频在线观看 | 久久国产精品一区二区三区 | 99精品国产一区二区青青牛奶 | a视频在线观看 | 国产欧美精品一区二区色综合朱莉 | 日韩字幕 | 在线观看视频h | 亚洲一区二区三区观看 | 不卡视频一区二区三区 | 国产精品久久久久久久久久99 | 日韩精品一区二区三区老鸭窝 | 国产精品一区二区久久久久 | 九九热国产精品视频 | 成人一区二区三区 | 一区二区国产在线观看 | 国产精品99久久免费观看 |