Search code examples
javascriptphpimagepreloadhead

How to asynchronously preload images


I have a set of videos that I exported to frames and show current frame based on scroll position (something like this but using image frames instead of video)

And using this in <head> casues lots of initial delay but afterwards the frame transition is very smooth.

<?php for ($i = 0; $i <= 99; $i++) {
    $number =  $i < 10 ? '0'.$i : $i; ?>
    <link rel="preload" href="<?php echo get_stylesheet_directory_uri()?>/media/frames/01/optim/_scene-1-00<?php echo $number; ?>.jpg" as="image">
<?php } ?>
<?php for ($i = 0; $i <= 99; $i++) {
    $number =  $i < 10 ? '0'.$i : $i; ?>
    <link rel="preload" href="<?php echo get_stylesheet_directory_uri()?>/media/frames/01/optim/_scene-2-00<?php echo $number; ?>.jpg" as="image">
<?php } ?>
<?php for ($i = 0; $i <= 99; $i++) {
    $number =  $i < 10 ? '0'.$i : $i; ?>
    <link rel="preload" href="<?php echo get_stylesheet_directory_uri()?>/media/frames/01/optim/_scene-3-00<?php echo $number; ?>.jpg" as="image">
<?php } ?>
...

Any thought on how can I only preload the first scene and the rest to be preloaded after window.onload ?


Solution

  • I ended up Doing it like so:

    function preloadRestOfScenes() {
      /* Scene 2 */
      let html = "";
      for (let i = 0; i <= 249; i++) {
        let number;
        if (i < 10) {
          number = "00" + i;
        } else if (i >= 10 && i < 100) {
          number = "0" + i;
        } else {
          number = i;
        }
        html += `<link rel="preload" href="${stylesheet_directory_uri}/media/frames/02/optim/scene-2-${number}.jpg" as="image">`;
      }
      document.querySelector("head").insertAdjacentHTML("beforeend", html);
    
      /* Scene 3 */
      html = "";
      for (let i = 0; i <= 549; i++) {
        let number;
        if (i < 10) {
          number = "00" + i;
        } else if (i >= 10 && i < 100) {
          number = "0" + i;
        } else {
          number = i;
        }
        html += `<link rel="preload" href="${stylesheet_directory_uri}/media/frames/03/optim/scene-3-${number}.jpg" as="image">`;
      }
      document.querySelector("head").insertAdjacentHTML("beforeend", html);
    
      /* Scene 4 */
      html = "";
      for (let i = 0; i <= 299; i++) {
        let number;
        if (i < 10) {
          number = "00" + i;
        } else if (i >= 10 && i < 100) {
          number = "0" + i;
        } else {
          number = i;
        }
        html += `<link rel="preload" href="${stylesheet_directory_uri}/media/frames/04/optim/scene-4-${number}.jpg" as="image">`;
      }
      document.querySelector("head").insertAdjacentHTML("beforeend", html);
    }
    

    And

    window.onload = () => {
      preloadRestOfScenes();
    };