Gallery Block Grid Video

Description

  • gallery block grid video but make text/overlay color on hover + make full video slide up on item click
  • view demo – password: abc
  • buy me a coffee

06.26c19v3 Gallery Block Grid Video

#1. Install Code

#1.1. Make sure you use Gallery Block Grid + enable “Show Title”

06.26c19v3 Gallery Block Grid Video

#1.2. Add Video (Youtube/Vimeo)

06.26c19v3 Gallery Block Grid Video

Note: code will get text from Video + This Title field only.

06.26c19v3 Gallery Block Grid Video

It can’t get Description text here

06.26c19v3 Gallery Block Grid Video

#1.3. Hover on top right of section (where you added Gallery Block Grid) > Click EDIT SECTION

06.26c19v3 Gallery Block Grid Video

at Design > Anchor Link > enter word: gb-video

06.26c19v3 Gallery Block Grid Video

#1.4. Hover on Page where you use Gallery Block Grid > Click Gear icon

06.26c19v3 Gallery Block Grid Video

Click Advanced > Paste this code

  • If you use Personal/Basic Plan and your plan doesn’t support Injection, see #3.1
<!-- 06.26c19v3 Gallery Block Grid Video -->
<script>
window.GBVideoConfig = {
  sectionSelector: 'section[id*="gb-video"]',
  gallerySelector: '.sqs-gallery.sqs-gallery-design-grid',
  containerSelector: '.sqs-gallery-container',
  playerBlockId: 'gb-video-player-block',
  scrollPadding: 80,
  metaBackgroundColor: 'rgba(0, 21, 173, 0.85)',
  titleFontSize: '18px',
  descriptionFontSize: '14px',
  closeIconSize: '20px',
  closeIconColor: '#ffffff'
};
</script>

<script>
(function () {

  if (typeof window.EPPZScrollTo === 'undefined') {

    window.EPPZScrollTo =
    {
      documentVerticalScrollPosition: function ()
      {
        if (self.pageYOffset) return self.pageYOffset;
        if (document.documentElement && document.documentElement.scrollTop) return document.documentElement.scrollTop;
        if (document.body.scrollTop) return document.body.scrollTop;
        return 0;
      },

      viewportHeight: function ()
      { return (document.compatMode === "CSS1Compat") ? document.documentElement.clientHeight : document.body.clientHeight; },

      documentHeight: function ()
      { return (document.height !== undefined) ? document.height : document.body.offsetHeight; },

      documentMaximumScrollPosition: function ()
      { return this.documentHeight() - this.viewportHeight(); },

      elementVerticalClientPositionById: function (id)
      {
        var element = document.getElementById(id);
        var rectangle = element.getBoundingClientRect();
        return rectangle.top;
      },

      scrollVerticalTickToPosition: function (currentPosition, targetPosition)
      {
        var filter = 0.2;
        var fps = 60;
        var difference = parseFloat(targetPosition) - parseFloat(currentPosition);

        var arrived = (Math.abs(difference) <= 0.5);
        if (arrived)
        {
          scrollTo(0.0, targetPosition);
          return;
        }

        currentPosition = (parseFloat(currentPosition) * (1.0 - filter)) + (parseFloat(targetPosition) * filter);

        scrollTo(0.0, Math.round(currentPosition));

        setTimeout("EPPZScrollTo.scrollVerticalTickToPosition(" + currentPosition + ", " + targetPosition + ")", (1000 / fps));
      },

      scrollVerticalToElementById: function (id, padding)
      {
        var element = document.getElementById(id);
        if (element == null)
        {
          console.warn('Cannot find element with id \'' + id + '\'.');
          return;
        }

        var targetPosition = this.documentVerticalScrollPosition() + this.elementVerticalClientPositionById(id) - padding;
        var currentPosition = this.documentVerticalScrollPosition();

        var maximumScrollPosition = this.documentMaximumScrollPosition();
        if (targetPosition > maximumScrollPosition) targetPosition = maximumScrollPosition;

        this.scrollVerticalTickToPosition(currentPosition, targetPosition);
      }
    };

  }


  function initGBVideo(section) {

    if (section.dataset.gbVideoDone === 'true') return;

    var config = window.GBVideoConfig;
    if (!config) return;

    var S = config.sectionSelector;

    var galleryContainer = section.querySelector(config.containerSelector);
    var gallery = section.querySelector(config.gallerySelector);
    if (!galleryContainer || !gallery) return;

    section.dataset.gbVideoDone = 'true';


    var style = document.createElement('style');
    style.textContent =
      S + ' .sqs-gallery-design-grid-slide .margin-wrapper {' +
        'position: relative;' +
      '}' +
      S + ' .image-slide-meta {' +
        'display: flex;' +
      	'justify-content: center;' +
      	'align-items: center;' +
      	'flex-direction: column;' +
        'text-align: center;' +
        'position: absolute;' +
        'top: 0;' +
        'left: 0;' +
        'width: 100%;' +
        'height: 100%;' +
        'background-color: ' + config.metaBackgroundColor + ';' +
        'cursor: pointer;' +
        'opacity: 0;' +
        'visibility: hidden;' +
        'transition: opacity 0.3s ease;' +
        'z-index: 2;' +
      '}' +
      S + ' .slide:hover .image-slide-meta {' +
        'opacity: 1;' +
        'visibility: visible;' +
      '}' +
      S + ' .image-slide-meta-title {' +
        'color: #fff;' +
        'margin: 0 0 8px 0;' +
      	'padding: 0 10px;' +
        'font-size: ' + config.titleFontSize + ';' +
      '}' +
      S + ' .image-slide-meta .image-slide-title {' +
        'color: #fff;' +
        'margin: 0;' +
      	'padding: 0 10px;' +
      	'white-space: initial !important;' +
        'font-size: ' + config.descriptionFontSize + ';' +
      '}' +
      S + ' .gb-video-player-block {' +
        'position: relative;' +
        'width: 100%;' +
        'margin-bottom: 20px;' +
        'padding-top: 40px;' +
        'display: none;' +
      '}' +
      S + ' .gb-video-player-inner {' +
        'position: relative;' +
        'width: 100%;' +
        'padding-bottom: 56.25%;' +
        'background: #000;' +
      '}' +
      S + ' .gb-video-player-inner iframe {' +
        'position: absolute;' +
        'top: 0;' +
        'left: 0;' +
        'width: 100%;' +
        'height: 100%;' +
        'border: 0;' +
      '}' +
      S + ' .slb-close {' +
        'position: absolute;' +
        'top: 0;' +
        'right: 0;' +
        'background: transparent;' +
        'border: 0;' +
        'cursor: pointer;' +
        'display: flex;' +
        'align-items: center;' +
        'justify-content: center;' +
        'padding: 8px;' +
        'z-index: 3;' +
      '}';
    document.head.appendChild(style);


    var slides = gallery.querySelectorAll('.slide[data-type="video"]');
    var parser = new DOMParser();

    slides.forEach(function (slide) {

      if (slide.dataset.gbMetaDone === 'true') return;

      var videoWrapper = slide.querySelector('.sqs-video-wrapper');
      var titleEl = slide.querySelector('.image-slide-title');
      if (!videoWrapper) return;

      var dataHtml = videoWrapper.getAttribute('data-html') || '';

      var parsedDoc = parser.parseFromString(dataHtml, 'text/html');
      var parsedIframe = parsedDoc.querySelector('iframe');
      var titleText = parsedIframe ? (parsedIframe.getAttribute('title') || '') : '';

      var meta = document.createElement('div');
      meta.className = 'image-slide-meta';

      if (titleText) {
        var heading = document.createElement('h4');
        heading.className = 'image-slide-meta-title';
        heading.textContent = titleText;
        meta.appendChild(heading);
      }

      if (titleEl) {
        meta.appendChild(titleEl);
      }

      var contentWrapper = slide.querySelector('.content-wrapper');
      var insertParent = contentWrapper ? contentWrapper.parentNode : videoWrapper.parentNode;
      insertParent.appendChild(meta);

      meta.dataset.dataHtml = dataHtml;

      slide.dataset.gbMetaDone = 'true';
    });


    var playerBlock = document.createElement('div');
    playerBlock.className = 'gb-video-player-block';
    playerBlock.id = config.playerBlockId;

    var closeButton = document.createElement('button');
    closeButton.className = 'slb-close';
    closeButton.id = 'slbClose';
    closeButton.innerHTML =
      '<svg id="slbCloseSvg" viewBox="0 0 40 40" stroke-width="1.5" style="width: ' + config.closeIconSize +
      '; height: ' + config.closeIconSize + '; stroke: ' + config.closeIconColor +
      ';"><path d="M4.3,35.7L35.7,4.3"></path><path d="M4.3,4.3l31.4,31.4"></path></svg>';

    var playerInner = document.createElement('div');
    playerInner.className = 'gb-video-player-inner';

    playerBlock.appendChild(closeButton);
    playerBlock.appendChild(playerInner);

    var blockContent = galleryContainer.parentNode;
    blockContent.insertBefore(playerBlock, galleryContainer);


    var srcParser = new DOMParser();

    function extractSrcFromDataHtml(dataHtml) {
      var parsedDoc = srcParser.parseFromString(dataHtml, 'text/html');
      var parsedIframe = parsedDoc.querySelector('iframe');
      if (!parsedIframe) return null;

      var src = parsedIframe.getAttribute('src');
      if (!src) return null;

      if (src.indexOf('//') === 0) src = 'https:' + src;

      var separator = src.indexOf('?') === -1 ? '?' : '&';
      src += separator + 'autoplay=1&mute=1';

      return src;
    }

    function openPlayerWithDataHtml(dataHtml) {
      var src = extractSrcFromDataHtml(dataHtml);
      if (!src) return;

      playerInner.innerHTML = '';

      var iframe = document.createElement('iframe');
      iframe.src = src;
      iframe.setAttribute('allow', 'autoplay; fullscreen; picture-in-picture; clipboard-write; encrypted-media; web-share');
      iframe.setAttribute('allowfullscreen', '');
      iframe.setAttribute('frameborder', '0');
      iframe.setAttribute('referrerpolicy', 'strict-origin-when-cross-origin');

      playerInner.appendChild(iframe);

      playerBlock.style.display = 'block';

      EPPZScrollTo.scrollVerticalToElementById(config.playerBlockId, config.scrollPadding);
    }

    function closePlayer() {
      playerInner.innerHTML = '';
      playerBlock.style.display = 'none';
    }


    closeButton.addEventListener('click', function (e) {
      e.preventDefault();
      closePlayer();
    });

    var metas = gallery.querySelectorAll('.image-slide-meta');

    metas.forEach(function (meta) {
      meta.addEventListener('click', function () {
        var dataHtml = meta.dataset.dataHtml || '';
        openPlayerWithDataHtml(dataHtml);
      });
    });

  }


  function attemptInitAll() {
    var config = window.GBVideoConfig;
    if (!config) return false;

    var sections = document.querySelectorAll(config.sectionSelector);
    if (!sections.length) return false;

    var pending = 0;

    sections.forEach(function (section) {
      if (section.dataset.gbVideoDone === 'true') return;

      var container = section.querySelector(config.containerSelector);
      var gallery = section.querySelector(config.gallerySelector);
      var slides = gallery ? gallery.querySelectorAll('.slide[data-type="video"]') : null;

      if (container && gallery && slides && slides.length) {
        initGBVideo(section);
      } else {
        pending++;
      }
    });

    return pending === 0;
  }

  var pollTimer = null;

  function startPolling() {
    if (attemptInitAll()) return;

    if (pollTimer) clearInterval(pollTimer);

    var attempts = 0;
    var maxAttempts = 60;

    pollTimer = setInterval(function () {
      attempts++;
      if (attemptInitAll() || attempts >= maxAttempts) {
        clearInterval(pollTimer);
        pollTimer = null;
      }
    }, 150);
  }


  if (document.readyState === 'loading') {
    document.addEventListener('DOMContentLoaded', startPolling);
  } else {
    startPolling();
  }

  window.addEventListener('load', startPolling);
  window.addEventListener('mercury:load', startPolling);

})();
</script>
<style>
  button#slbClose {
    background-color: #000;
}
</style>

06.26c19v3 Gallery Block Grid Video

#2. Customize

#2.1. To change overlay color over video, change Line 09

metaBackgroundColor: 'rgba(0, 21, 173, 0.85)',

#2.2. To change Title, Description size, change Line 09, Line 10

titleFontSize: '18px',
descriptionFontSize: '14px',

#2.3. To change Close icon size/color, change Line 11, Line 12

closeIconSize: '20px',
closeIconColor: '#ffffff'

#2.4. To change black background behind X icon, change Line 366

background-color: #000;

#3. Other

#3.1. If you use Personal/Basic Plan and your plan doesn’t support Injection, you can add a Block under Gallery Block

05.26c16v1 Hover Text Show Image Follow Cursor

Add a Markdown Block

04.26c10v2 Header Sound Icon

Paste this code into Markdown Block

<script>
window.GBVideoConfig = {
  sectionSelector: 'section[id*="gb-video"]',
  gallerySelector: '.sqs-gallery.sqs-gallery-design-grid',
  containerSelector: '.sqs-gallery-container',
  playerBlockId: 'gb-video-player-block',
  scrollPadding: 80,
  metaBackgroundColor: 'rgba(0, 21, 173, 0.85)',
  titleFontSize: '18px',
  descriptionFontSize: '14px',
  closeIconSize: '20px',
  closeIconColor: '#ffffff'
};
</script>

<script>
(function () {

  if (typeof window.EPPZScrollTo === 'undefined') {

    window.EPPZScrollTo =
    {
      documentVerticalScrollPosition: function ()
      {
        if (self.pageYOffset) return self.pageYOffset;
        if (document.documentElement && document.documentElement.scrollTop) return document.documentElement.scrollTop;
        if (document.body.scrollTop) return document.body.scrollTop;
        return 0;
      },

      viewportHeight: function ()
      { return (document.compatMode === "CSS1Compat") ? document.documentElement.clientHeight : document.body.clientHeight; },

      documentHeight: function ()
      { return (document.height !== undefined) ? document.height : document.body.offsetHeight; },

      documentMaximumScrollPosition: function ()
      { return this.documentHeight() - this.viewportHeight(); },

      elementVerticalClientPositionById: function (id)
      {
        var element = document.getElementById(id);
        var rectangle = element.getBoundingClientRect();
        return rectangle.top;
      },

      scrollVerticalTickToPosition: function (currentPosition, targetPosition)
      {
        var filter = 0.2;
        var fps = 60;
        var difference = parseFloat(targetPosition) - parseFloat(currentPosition);

        var arrived = (Math.abs(difference) <= 0.5);
        if (arrived)
        {
          scrollTo(0.0, targetPosition);
          return;
        }

        currentPosition = (parseFloat(currentPosition) * (1.0 - filter)) + (parseFloat(targetPosition) * filter);

        scrollTo(0.0, Math.round(currentPosition));

        setTimeout("EPPZScrollTo.scrollVerticalTickToPosition(" + currentPosition + ", " + targetPosition + ")", (1000 / fps));
      },

      scrollVerticalToElementById: function (id, padding)
      {
        var element = document.getElementById(id);
        if (element == null)
        {
          console.warn('Cannot find element with id \'' + id + '\'.');
          return;
        }

        var targetPosition = this.documentVerticalScrollPosition() + this.elementVerticalClientPositionById(id) - padding;
        var currentPosition = this.documentVerticalScrollPosition();

        var maximumScrollPosition = this.documentMaximumScrollPosition();
        if (targetPosition > maximumScrollPosition) targetPosition = maximumScrollPosition;

        this.scrollVerticalTickToPosition(currentPosition, targetPosition);
      }
    };

  }


  function initGBVideo(section) {

    if (section.dataset.gbVideoDone === 'true') return;

    var config = window.GBVideoConfig;
    if (!config) return;

    var S = config.sectionSelector;

    var galleryContainer = section.querySelector(config.containerSelector);
    var gallery = section.querySelector(config.gallerySelector);
    if (!galleryContainer || !gallery) return;

    section.dataset.gbVideoDone = 'true';


    var style = document.createElement('style');
    style.textContent =
      S + ' .sqs-gallery-design-grid-slide .margin-wrapper {' +
        'position: relative;' +
      '}' +
      S + ' .image-slide-meta {' +
        'display: flex;' +
      	'justify-content: center;' +
      	'align-items: center;' +
      	'flex-direction: column;' +
        'text-align: center;' +
        'position: absolute;' +
        'top: 0;' +
        'left: 0;' +
        'width: 100%;' +
        'height: 100%;' +
        'background-color: ' + config.metaBackgroundColor + ';' +
        'cursor: pointer;' +
        'opacity: 0;' +
        'visibility: hidden;' +
        'transition: opacity 0.3s ease;' +
        'z-index: 2;' +
      '}' +
      S + ' .slide:hover .image-slide-meta {' +
        'opacity: 1;' +
        'visibility: visible;' +
      '}' +
      S + ' .image-slide-meta-title {' +
        'color: #fff;' +
        'margin: 0 0 8px 0;' +
      	'padding: 0 10px;' +
        'font-size: ' + config.titleFontSize + ';' +
      '}' +
      S + ' .image-slide-meta .image-slide-title {' +
        'color: #fff;' +
        'margin: 0;' +
      	'padding: 0 10px;' +
      	'white-space: initial !important;' +
        'font-size: ' + config.descriptionFontSize + ';' +
      '}' +
      S + ' .gb-video-player-block {' +
        'position: relative;' +
        'width: 100%;' +
        'margin-bottom: 20px;' +
        'padding-top: 40px;' +
        'display: none;' +
      '}' +
      S + ' .gb-video-player-inner {' +
        'position: relative;' +
        'width: 100%;' +
        'padding-bottom: 56.25%;' +
        'background: #000;' +
      '}' +
      S + ' .gb-video-player-inner iframe {' +
        'position: absolute;' +
        'top: 0;' +
        'left: 0;' +
        'width: 100%;' +
        'height: 100%;' +
        'border: 0;' +
      '}' +
      S + ' .slb-close {' +
        'position: absolute;' +
        'top: 0;' +
        'right: 0;' +
        'background: transparent;' +
        'border: 0;' +
        'cursor: pointer;' +
        'display: flex;' +
        'align-items: center;' +
        'justify-content: center;' +
        'padding: 8px;' +
        'z-index: 3;' +
      '}';
    document.head.appendChild(style);


    var slides = gallery.querySelectorAll('.slide[data-type="video"]');
    var parser = new DOMParser();

    slides.forEach(function (slide) {

      if (slide.dataset.gbMetaDone === 'true') return;

      var videoWrapper = slide.querySelector('.sqs-video-wrapper');
      var titleEl = slide.querySelector('.image-slide-title');
      if (!videoWrapper) return;

      var dataHtml = videoWrapper.getAttribute('data-html') || '';

      var parsedDoc = parser.parseFromString(dataHtml, 'text/html');
      var parsedIframe = parsedDoc.querySelector('iframe');
      var titleText = parsedIframe ? (parsedIframe.getAttribute('title') || '') : '';

      var meta = document.createElement('div');
      meta.className = 'image-slide-meta';

      if (titleText) {
        var heading = document.createElement('h4');
        heading.className = 'image-slide-meta-title';
        heading.textContent = titleText;
        meta.appendChild(heading);
      }

      if (titleEl) {
        meta.appendChild(titleEl);
      }

      var contentWrapper = slide.querySelector('.content-wrapper');
      var insertParent = contentWrapper ? contentWrapper.parentNode : videoWrapper.parentNode;
      insertParent.appendChild(meta);

      meta.dataset.dataHtml = dataHtml;

      slide.dataset.gbMetaDone = 'true';
    });


    var playerBlock = document.createElement('div');
    playerBlock.className = 'gb-video-player-block';
    playerBlock.id = config.playerBlockId;

    var closeButton = document.createElement('button');
    closeButton.className = 'slb-close';
    closeButton.id = 'slbClose';
    closeButton.innerHTML =
      '<svg id="slbCloseSvg" viewBox="0 0 40 40" stroke-width="1.5" style="width: ' + config.closeIconSize +
      '; height: ' + config.closeIconSize + '; stroke: ' + config.closeIconColor +
      ';"><path d="M4.3,35.7L35.7,4.3"></path><path d="M4.3,4.3l31.4,31.4"></path></svg>';

    var playerInner = document.createElement('div');
    playerInner.className = 'gb-video-player-inner';

    playerBlock.appendChild(closeButton);
    playerBlock.appendChild(playerInner);

    var blockContent = galleryContainer.parentNode;
    blockContent.insertBefore(playerBlock, galleryContainer);


    var srcParser = new DOMParser();

    function extractSrcFromDataHtml(dataHtml) {
      var parsedDoc = srcParser.parseFromString(dataHtml, 'text/html');
      var parsedIframe = parsedDoc.querySelector('iframe');
      if (!parsedIframe) return null;

      var src = parsedIframe.getAttribute('src');
      if (!src) return null;

      if (src.indexOf('//') === 0) src = 'https:' + src;

      var separator = src.indexOf('?') === -1 ? '?' : '&';
      src += separator + 'autoplay=1&mute=1';

      return src;
    }

    function openPlayerWithDataHtml(dataHtml) {
      var src = extractSrcFromDataHtml(dataHtml);
      if (!src) return;

      playerInner.innerHTML = '';

      var iframe = document.createElement('iframe');
      iframe.src = src;
      iframe.setAttribute('allow', 'autoplay; fullscreen; picture-in-picture; clipboard-write; encrypted-media; web-share');
      iframe.setAttribute('allowfullscreen', '');
      iframe.setAttribute('frameborder', '0');
      iframe.setAttribute('referrerpolicy', 'strict-origin-when-cross-origin');

      playerInner.appendChild(iframe);

      playerBlock.style.display = 'block';

      EPPZScrollTo.scrollVerticalToElementById(config.playerBlockId, config.scrollPadding);
    }

    function closePlayer() {
      playerInner.innerHTML = '';
      playerBlock.style.display = 'none';
    }


    closeButton.addEventListener('click', function (e) {
      e.preventDefault();
      closePlayer();
    });

    var metas = gallery.querySelectorAll('.image-slide-meta');

    metas.forEach(function (meta) {
      meta.addEventListener('click', function () {
        var dataHtml = meta.dataset.dataHtml || '';
        openPlayerWithDataHtml(dataHtml);
      });
    });

  }


  function attemptInitAll() {
    var config = window.GBVideoConfig;
    if (!config) return false;

    var sections = document.querySelectorAll(config.sectionSelector);
    if (!sections.length) return false;

    var pending = 0;

    sections.forEach(function (section) {
      if (section.dataset.gbVideoDone === 'true') return;

      var container = section.querySelector(config.containerSelector);
      var gallery = section.querySelector(config.gallerySelector);
      var slides = gallery ? gallery.querySelectorAll('.slide[data-type="video"]') : null;

      if (container && gallery && slides && slides.length) {
        initGBVideo(section);
      } else {
        pending++;
      }
    });

    return pending === 0;
  }

  var pollTimer = null;

  function startPolling() {
    if (attemptInitAll()) return;

    if (pollTimer) clearInterval(pollTimer);

    var attempts = 0;
    var maxAttempts = 60;

    pollTimer = setInterval(function () {
      attempts++;
      if (attemptInitAll() || attempts >= maxAttempts) {
        clearInterval(pollTimer);
        pollTimer = null;
      }
    }, 150);
  }


  if (document.readyState === 'loading') {
    document.addEventListener('DOMContentLoaded', startPolling);
  } else {
    startPolling();
  }

  window.addEventListener('load', startPolling);
  window.addEventListener('mercury:load', startPolling);

})();
</script>
<style>
  button#slbClose {
    background-color: #000;
}
</style>

06.26c19v3 Gallery Block Grid Video

 

 

Buy me a coffee