슬라이드와 같은 방식으로 다음 이미지를 순차적으로 불러와 보여줄 때, 미리 이미지를 불러와 이미지 전환간에 깜박임없이 부드럽게 이미지를 전환하고자 하였다. 이를 위해 이미지를 미리 로드하는 두가지 방법을 기록하고자 한다.

function preloadImages(images) {
  images.forEach(function (src) {
    setTimeout(() => {
      let img = new Image();
      img.src = src;
      img.onload = () => {
        img = null;
      };
    });
  });
}
preloadImages(imageSet2);이미지들을 순환하며 임시 이미지 앨리먼트에 넣어 미리 로드한 후에 해당 엘리먼트를 제거하는 방식으로 구현한다. JavsScript로 이미지들을 동적으로 미리 로드하고자 한다면 좋은 선택인 것 같다.

<style>
  #preload-00 {
    background: url(https://dummyimage.com/600x400/52ACEEBE5D21) no-repeat -9999px -9999px;
  }
  #preload-01 {
    background: url(https://dummyimage.com/600x400/FD8F265C45CF) no-repeat -9999px -9999px;
  }
  #preload-02 {
    background: url(https://dummyimage.com/600x400/768D21AD6511) no-repeat -9999px -9999px;
  }
  #preload-03 {
    background: url(https://dummyimage.com/600x400/5A686067C23F) no-repeat -9999px -9999px;
  }
  #preload-04 {
    background: url(https://dummyimage.com/600x400/0E070CEAB80B) no-repeat -9999px -9999px;
  }
  #preload-05 {
    background: url(https://dummyimage.com/600x400/C13FC82B1BE7) no-repeat -9999px -9999px;
  }
  #preload-06 {
    background: url(https://dummyimage.com/600x400/B0663BC483CB) no-repeat -9999px -9999px;
  }
  #preload-07 {
    background: url(https://dummyimage.com/600x400/0244D9F1BA6F) no-repeat -9999px -9999px;
  }
  #preload-08 {
    background: url(https://dummyimage.com/600x400/3311445D45EF) no-repeat -9999px -9999px;
  }
  #preload-09 {
    background: url(https://dummyimage.com/600x400/075247DAAB1C) no-repeat -9999px -9999px;
  }
</style>CSS에 미리 로드할 이미지들을 등록해서 로드한다. 미리 로드해야할 이미지가 적고 정적으로 등록할 수 있다면, 추가적으로 JavaScript 코드를 작성하지 않고 사용할 수 있을 것 같다.
주의할 점은 이미지들이 preload가 되기 위해서는 지정한 id에 대한 Dom이 존재해야 한다. Dom을 숨겨서 해결이 가능할 것으로 보이나 이런 경우라면 JavaScript를 통해 preload하는 것이 나아 보인다.
window.onload = function () {
  setTimeout(function () {
    // XHR to request a JS and a CSS
    var xhr = new XMLHttpRequest();
    xhr.open('GET', 'https://domain.tld/preload.js');
    xhr.send('');
    xhr = new XMLHttpRequest();
    xhr.open('GET', 'https://domain.tld/preload.css');
    xhr.send('');
    // preload image
    new Image().src = 'https://domain.tld/preload.png';
  }, 1000);
};상단의 코드처럼 AJAX를 통해 이미지 뿐만 아니라 JavaScript나 CSS도 미리 로드를 할 수 있다.