Javascript の代わりに Css で Throttle を使用する方法

Nov 26 2022
ご存知のように、関数スロットルは JS で非常に一般的な最適化方法であり、関数の実行頻度が高すぎるのを効果的に回避できます。実際、JS メソッドに加えて、CSS もフレームワーク ライブラリなしで非常に簡単にそのような関数を実装できます。 、見てみましょう。

ご存知のように、関数スロットルは JS で非常に一般的な最適化方法であり、関数の実行頻度が高すぎるのを効果的に回避できます。実際、JS メソッドに加えて、CSS もフレームワーク ライブラリなしで非常に簡単にそのような関数を実装できます。 、見てみましょう。

例: 保存ボタンは、送信の繰り返しやサーバーの考慮事項を避けるために、300 ミリ秒ごとに 1 つの送信のみを許可するなど、クリック動作に特定の制限を必要とすることがよくあります。現時点では、ほとんどの学生はインターネット上のスロットル関数を直接コピーすると思います。または、lodash ツール ライブラリを直接参照します。

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

ここでは、クリック イベントを制限する、つまりクリック イベントを無効にする必要があります。イベントを無効にする方法を考えてください。はい、ポインターイベントです。
次に制限時間です。クリックするたびに、300 ミリ秒の間自動的に無効にする必要があり、時間が経過すると復元されます。では、時間と状態の復元に関連する機能は何ですか? そうです、アニメーションです。
さらに、トリガー時間が必要です。これはクリック動作です。したがって、疑似クラス: activeに関連付ける必要があります。
したがって、包括的な分析は、ポインターイベントアニメーション、および:activeを示していますこのような機能を実現するためには、これらのアイデアをどのように直列に接続する必要がありますか?

考えたことはありますか?

実際、このようなシーンは CSS アニメーションの制御として理解できます。たとえば、無効からクリック可能に変わるアニメーション コントロール ボタンがあり、クリックするたびにアニメーションが再実行されます。実行プロセス中は、常に無効になります。「絞り」の効果は得られましたか?

クリック イベントにバインドされたボタンがあるとします。

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

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

次に、このアニメーションをボタンにバインドします

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

以下に示すように、pointer-events の値は 0 ~ 0.3 秒以内でありません。0.3秒に達すると、すぐにすべてになります。フォワードなので、常にすべての状態を維持します。

最後に、クリック時にアニメーションを再実行し、押したときにアニメーションをなしに設定するだけです。

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

具体的な考え方は次のとおりです。次のように、遷移の変更をトリガーするためにアクティブにしてから、遷移コールバックをリッスンしてボタンの無効状態を動的に設定します。

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

// start
document.addEventListener('transitionstart', function(ev){
  ev.target.disabled = true
})
// end
document.addEventListener('transitionend', function(ev){
  ev.target.disabled = false
})

ただし、この実装方法はまだ比較的限定されており、クリック動作に限定されています。多くの場合、スロットリングはスクロール イベントまたはキーボード イベントに使用できます。このようなシナリオは、従来の方法で実装できます。