JSFiddle - React, Tailwind, and code Playground

by olegatilla

HTML

<ul>
  <li>
      <a>
          <video muted loop autoplay poster="https://ferner.tinyelephant.no/pub/media/wysiwyg/1done-_1_.jpg" data-echo="https://ferner.tinyelephant.no/pub/static/version1555424171/frontend/TE/ferner/nb_NO/images/video/fj-video.{mp4, webm}" width="500" height="350"></video>
      </a>
  </li>
  <li>
      <a>
          <video muted loop autoplay poster="https://ferner.tinyelephant.no/pub/media/wysiwyg/1done-_1_.jpg" data-echo="https://ferner.tinyelephant.no/pub/static/version1555424171/frontend/TE/ferner/nb_NO/images/video/fj-video.{mp4, webm}" width="500" height="350"></video>
      </a>
  </li>
    <li>
      <a>
          <video muted loop autoplay poster="https://ferner.tinyelephant.no/pub/media/wysiwyg/1done-_1_.jpg" data-echo="https://ferner.tinyelephant.no/pub/static/version1555424171/frontend/TE/ferner/nb_NO/images/video/fj-video.{mp4, webm}" width="500" height="350"></video>
      </a>
  </li>
    <li>
      <a>
          <video muted loop autoplay poster="https://ferner.tinyelephant.no/pub/media/wysiwyg/1done-_1_.jpg" data-echo="https://ferner.tinyelephant.no/pub/static/version1555424171/frontend/TE/ferner/nb_NO/images/video/fj-video.{mp4}" width="500" height="350"></video>
      </a>
  </li>
    <li>
      <a>
          <video muted loop autoplay data-echo="http://ak4.picdn.net/shutterstock/videos/646507/preview/stock-footage-abstract-green-tunnel-background.{mp4, webm}" width="200" height="268"></video>
      </a>
  </li>
</ul>

JavaScript

window.Echo = (function (window, document, undefined) {

  'use strict';

  var store = [], offset, throttle, poll;

  var _inView = function (el) {
    var coords = el.getBoundingClientRect();
    return ((coords.top >= 0 && coords.left >= 0 && coords.top) <= (window.innerHeight || document.documentElement.clientHeight) + parseInt(offset));
  };
  
 var _pollImages = function () {
    for (var i = store.length; i--;) {
      var self = store[i];
      var videoHTML = self.parentNode.innerHTML;
      var dataAttr = self.getAttribute('data-echo');
      var videoSource = dataAttr.substr(0, dataAttr.lastIndexOf('.')+ 1);
      var fileExts = dataAttr.substring(dataAttr.indexOf('{')+1,dataAttr.indexOf('}')).replace(/\s/g, '').split(',');
      var sourceVideo = "";
        for (var d = 0; d < fileExts.length; d++) {
          var extension = fileExts[d];
          var sourceSrc = videoSource + extension;
          var sourceType = 'video/' + extension;
          sourceVideo += "<source" + " " + "src=\"" + sourceSrc + "\"" + " " + "type=\"" + sourceType + "\"" + "/>";
        }
      if (_inView(self)) {
        var videoHybrid = videoHTML.replace(/></, '>' + sourceVideo + '<');
        self.parentNode.innerHTML = videoHybrid;
        store.splice(i, 1);
      }
    }
  };

  var _throttle = function () {
    clearTimeout(poll);
    poll = setTimeout(_pollImages, throttle);
  };

  var init = function (obj) {
    var nodes = document.querySelectorAll('[data-echo]');
    var opts = obj || {};
    offset = opts.offset || 0;
    throttle = opts.throttle || 250;

    for (var i = 0; i < nodes.length; i++) {
      store.push(nodes[i]);
    }

    _throttle();

    if (document.addEventListener) {
      window.addEventListener('scroll', _throttle, false);
    } else {
      window.attachEvent('onscroll', _throttle);
    }
  };

  return {
    init: init,
    render: _throttle
  };

})(window, document);

Echo.init({
    offset: 200,
    throttle: 50
  });