返回

动画里的防抖与节流

前端

防抖与节流的概念

防抖和节流是JavaScript中常用的函数执行控制手段,常用于处理一些事件触发频繁的情况,避免不必要的函数调用或对系统造成过大的负荷。

防抖 是指在一定时间间隔内,只执行一次函数。如果在该时间间隔内函数被多次调用,那么只有最后一次调用会被执行。

节流 是指在一定时间段内,只执行一次函数。如果在该时间段内函数被多次调用,那么只有第一次调用会被执行,后面的调用都会被忽略。

防抖与节流在动画中的应用

防抖和节流在动画中都有着广泛的应用。例如,在滚动页面时,如果对每个滚动事件都进行处理,可能会导致动画卡顿或不流畅。这时,我们可以使用防抖或节流来控制函数的执行频率,从而避免动画卡顿或不流畅的情况发生。

使用canvas实现一个简单的防抖节流动画

我们可以使用canvas来实现一个简单的防抖节流动画,帮助您直观地理解防抖和节流的概念。

const canvas = document.getElementById('canvas');
const context = canvas.getContext('2d');

let requestId = null;

const draw = () => {
  context.clearRect(0, 0, canvas.width, canvas.height);
  context.fillStyle = 'red';
  context.fillRect(0, 0, 100, 100);

  requestId = requestAnimationFrame(draw);
};

const debounce = (func, delay) => {
  let timer = null;

  return function (...args) {
    clearTimeout(timer);

    timer = setTimeout(() => {
      func.apply(this, args);
    }, delay);
  };
};

const throttle = (func, delay) => {
  let last = 0;

  return function (...args) {
    const now = Date.now();

    if (now - last < delay) {
      return;
    }

    last = now;

    func.apply(this, args);
  };
};

const debouncedDraw = debounce(draw, 100);
const throttledDraw = throttle(draw, 100);

canvas.addEventListener('mousemove', debouncedDraw);
canvas.addEventListener('mousemove', throttledDraw);

这个动画使用了一个红色的矩形来表示函数的执行情况。当鼠标在canvas上移动时,红色矩形会跟随鼠标移动。

如果使用防抖来控制函数的执行,那么红色矩形只会跟随鼠标移动一定时间间隔后才会移动。

如果使用节流来控制函数的执行,那么红色矩形只会跟随鼠标移动一定时间段内才会移动。

通过这个动画,您可以直观地理解防抖和节流的概念,以及它们在动画中的应用。