Lazy load Youtube Video Iframe


How to prevent loading youtube video iframe & related files until the user clicks to play the video.






Why not directly add youtube video iframe snippet?

Youtube's iframe snippet brings ~500 KB (gzipped) worth of files with it. Around 85% of this is JavaScript. This will cause your video thumbnail display to be slower (look here). On mobile networks & devices, it shall also adversely affect the speed of loading other parts of the page.

Not every visitor to your page will play the youtube video. As a result, it is optimal to load the youtube video iframe files when the user clicks the play button. This how-to provides steps to do so. For the sake of this how-to, let's assume below is your youtube iframe snippet:

<iframe style="max-width:100%" width="560" height="315" src="https://www.youtube.com/embed/e1gAyQuIFQo" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

Changing the iframe snippet to not load any files

An easy way to prevent the iframe snippet from loading files is to:

<iframe style="max-width:100%;display:none;" id="youtube-embed-iframe" width="560" height="315" data-src="https://www.youtube.com/embed/e1gAyQuIFQo" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

Setting up the preview thumbnail

A simple way to extract the preview thumbnail for your youtube video is to use the following URL pattern `https://img.youtube.com/vi/{video-id}/mqdefault.jpg`. We need to set this image as a hyperlink to load the youtube video and also have a 'Play' button on top of it. The below snippet does so:

<style>
  .youtube {
      position: relative;
      display: inline-block;
  }
  .youtube:before {
      content: "";
      position: absolute;
      width: 100%;
      height: 100%;
      z-index: 10;
      background-size: 30%;
      background: transparent url('url_for_play_button.svg') center center no-repeat;
  }
  </style>
<a href="javascript:void(0);" onclick="showVideo();" id="youtube-link" class="youtube" >
	<img id="youtube-thumb" src="https://img.youtube.com/vi/e1gAyQuIFQo/mqdefault.jpg" width="560" style="max-width:100%" alt="{ video title }" />
</a>

With the above code snippet, we are yet to specify how to load the youtube video on clicking the above link (via showVideo() function).

Loading & playing Youtube video on thumbnail click

Below JavaScript defines showVideo(). This function:

<script>
  var player;
  function onYouTubeIframeAPIReady() {
      player = new YT.Player('youtube-embed-iframe', {
        height: '315',
        width: '560',
        videoId: 'e1gAyQuIFQo',
        events: {
          'onReady': onPlayerReady,
        }
      });
  }
  
  function onPlayerReady(event) {
          console.log('player ready');
      event.target.playVideo();
  }
  
  
  function stopVideo() {
      player.stopVideo();
  }
  
  function showVideo()
  {
          document.getElementById('youtube-link').style.display = "none";
          document.getElementById('youtube-embed-iframe').style.display="block";
          document.getElementById('youtube-thumb').style.display="none";
          let ifr = document.getElementById('youtube-embed-iframe');
          ifr.setAttribute('src',ifr.getAttribute('data-src'))
          var tag = document.createElement('script');
          tag.src = "https://www.youtube.com/iframe_api";
          var firstScriptTag = document.getElementsByTagName('script')[0];
          firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
  }
  </script>

Bringing it all together

Here's a CodePen that brings into action all of the above listed code snippets for you to explore further.