Как сделать js на моем сайте более эффективным?

#javascript #css #performance

#javascript #css #Производительность

Вопрос:

Итак, что я пытаюсь сделать, я меняю фон div, используя js. Код:

 let counter = 0;
setInterval(() => {
  counter   ;
  if(counter == 3) counter = 0;
  switch (counter) {
    case 0 : {
      background1.style.zIndex = "-1";
      background2.style.zIndex = "-2";
      background3.style.zIndex = "-2";

      background1.style.opacity = "1";
      background2.style.opacity = "0";
      background3.style.opacity = "0";
      break;
    }

    case 1 : {
      background2.style.zIndex = "-1";
      background1.style.zIndex = "-2";
      background3.style.zIndex = "-2";

      background2.style.opacity = "1";
      background3.style.opacity = "0";
      background1.style.opacity = "0";
      break;
    }

    case 2 : {
      background3.style.zIndex = "-1";
      background1.style.zIndex = "-2";
      background2.style.zIndex = "-2";

      background3.style.opacity = "1";
      background1.style.opacity = "0";
      background2.style.opacity = "0";
      break;
    }
  }
}, 25000);
 

Основной вывод из этого заключается в том, что я запускаю функцию в js каждые 25 секунд.

Теперь предположим, что 25 секунд вот-вот закончатся. И я нажимаю на «кнопку», которая Idk, запускает некоторую анимацию и прочее, затем ofc, поскольку js является однопоточным, ставит задачи в очередь, и это выглядит немного отстающим, как будто «кнопка» не работает.

Это не так уж плохо для пользователя, потому что функция изменения фона не выполняет большую часть тяжелой задачи. Итак, я должен игнорировать это и надеяться, что пользователь тоже проигнорирует это, или что бы вы сделали? Спасибо.

Ответ №1:

Функция JavaScript setInterval является асинхронной, поэтому она не блокирует основной поток, когда он находится в состоянии «ожидания». Вы нажимаете кнопку, чтобы выполнить какую-то анимацию, или что-то еще может вызвать задержку, о которой вы говорили выше, я думаю, вы можете использовать анимацию подавления с помощью requestAnimationFrame, поскольку она может достигать 60 кадров в секунду, если процессор не очень занят. Вот пример кода, который sinippet может помочь:

 function update() {
  let elapsedTime = Date.now() - startedAt

  // playback is a value between 0 and 1
  // being 0 the start of the animation and 1 its end
  let playback = elapsedTime / duration

  updateTarget(playback)
  
  if (playback > 0 amp;amp; playback < 1) {
    // Queue the next frame
    requestAnimationFrame(update)
  } else {
    // Wait for a while and restart the animation
    setTimeout(start, duration/10)
  }
}
 

Ответ №2:

Я думаю, вы получите лучшую производительность, если будете делать это вообще не через Javascript, а чисто в CSS, используя анимацию. Таким образом, система может использовать аппаратное обеспечение (GPU) там, где это возможно, и вы не загромождаете свой JS.

Вот простой пример, очевидно, вы хотите добавить свои собственные изображения, и если фон предназначен для какого-либо элемента, отличного от тела, измените CSS на это.

 body {
  width: 100vw;
  height: 100vh;
  animation-name: change;
  animation-duration: 75s;
  animation-iteration-count: infinite;
}

@keyframes change {
  0% {
    background: red;
  }
  0.01% {
    background: green;
    }
  33% {
    background: green;
    }
  33.01% {
    background: blue;
    }
  66% {
    background: blue;
    }
  66.01% {
    background: red;
    }
  99.99% {
    background: red;
    }
}