UNPKG

img-lightbox

Version:

Responsive no-jQuery pure JS/CSS Lightbox for images, no dependencies, 10kb unminified source code, with demo

260 lines (219 loc) 6.86 kB
/*! * @see {@link https://github.com/englishextra/img-lightbox} * imgLightbox * requires this very img-lightbox.js, and animate.css, img-lightbox.css * @params {String} linkClass * @params {Object} settings object * imgLightbox(linkClass, settings) * passes jshint */ /*jslint browser: true */ /*jslint node: true */ /*jshint -W014 */ (function(root, document) { "use strict"; var docElem = document.documentElement || ""; var docBody = document.body || ""; var animatedClass = "animated"; var btnCloseClass = "btn-close"; var containerClass = "img-lightbox"; var fadeInClass = "fadeIn"; var fadeInUpClass = "fadeInUp"; var fadeOutClass = "fadeOut"; var fadeOutDownClass = "fadeOutDown"; var imgLightboxWindowIsBindedClass = "img-lightbox-window--is-binded"; var imgLightboxOpenClass = "img-lightbox--open"; var imgLightboxLinkIsBindedClass = "img-lightbox-link--is-binded"; var isLoadedClass = "is-loaded"; var dummySrc = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII="; var isMobile = navigator.userAgent.match( /(iPad)|(iPhone)|(iPod)|(Android)|(PlayBook)|(BB10)|(BlackBerry)|(Opera Mini)|(IEMobile)|(webOS)|(MeeGo)/i ); var isTouch = isMobile !== null || document.createTouch !== undefined || "ontouchstart" in root || "onmsgesturechange" in root || navigator.msMaxTouchPoints; var debounce = function debounce(func, wait) { var timeout; var args; var context; var timestamp; return function () { context = this; args = [].slice.call(arguments, 0); timestamp = new Date(); var later = function later() { var last = new Date() - timestamp; if (last < wait) { timeout = setTimeout(later, wait - last); } else { timeout = null; func.apply(context, args); } }; if (!timeout) { timeout = setTimeout(later, wait); } }; }; var callCallback = function callCallback(func, data) { if (typeof func !== "function") { return; } var caller = func.bind(this); caller(data); }; var setDisplayBlock = function setDisplayBlock(e) { if (e) { e.style.display = "block"; } }; var setDisplayNone = function setDisplayNone(e) { if (e) { e.style.display = "none"; } }; var hideImgLightbox = function hideImgLightbox(callback) { var container = document.getElementsByClassName(containerClass)[0] || ""; var img = container ? container.getElementsByTagName("img")[0] || "" : ""; var hideContainer = function hideContainer() { container.classList.remove(fadeInClass); container.classList.add(fadeOutClass); var hideImg = function hideImg() { container.classList.remove(animatedClass); container.classList.remove(fadeOutClass); img.classList.remove(animatedClass); img.classList.remove(fadeOutDownClass); img.onload = function () { container.classList.remove(isLoadedClass); }; img.src = dummySrc; setDisplayNone(container); callCallback(callback, root); }; var timer = setTimeout(function () { clearTimeout(timer); timer = null; hideImg(); }, 400); }; if (container && img) { img.classList.remove(fadeInUpClass); img.classList.add(fadeOutDownClass); var timer = setTimeout(function () { clearTimeout(timer); timer = null; hideContainer(); }, 400); } docElem.classList.remove(imgLightboxOpenClass); docBody.classList.remove(imgLightboxOpenClass); }; var imgLightbox = function imgLightbox(linkClass, settings) { var _linkClass = linkClass || ""; var options = settings || {}; var rate = options.rate || 500; var touch = options.touch; var onError = options.onError; var onLoaded = options.onLoaded; var onCreated = options.onCreated; var onClosed = options.onClosed; var link = document.getElementsByClassName(_linkClass) || ""; var container = document.getElementsByClassName(containerClass)[0] || ""; var img = container ? container.getElementsByTagName("img")[0] || "" : ""; if (!container) { container = document.createElement("div"); container.classList.add(containerClass); var html = []; html.push('<img src="' + dummySrc + '" alt="" />'); html.push( '<div class="half-circle-spinner"><div class="circle circle-1"></div><div class="circle circle-2"></div></div>' ); html.push('<button class="btn-close"></button>'); container.innerHTML = html.join(""); docBody.appendChild(container); img = container ? container.getElementsByTagName("img")[0] || "" : ""; var btnClose = container ? container.getElementsByClassName(btnCloseClass)[0] || "" : ""; var handleImgLightboxContainer = function handleImgLightboxContainer() { hideImgLightbox(onClosed); }; container.addEventListener("click", handleImgLightboxContainer); btnClose.addEventListener("click", handleImgLightboxContainer); if (!docElem.classList.contains(imgLightboxWindowIsBindedClass)) { docElem.classList.add(imgLightboxWindowIsBindedClass); root.addEventListener("keyup", function(ev) { if (27 === (ev.which || ev.keyCode)) { hideImgLightbox(onClosed); } }); } } var arrange = function arrange(e) { var hrefString = e.getAttribute("href") || e.getAttribute("data-src") || ""; var dataTouch = e.getAttribute("data-touch") || ""; if (!hrefString) { return; } var handleImgLightboxLink = function handleImgLightboxLink(ev) { ev.stopPropagation(); ev.preventDefault(); docElem.classList.add(imgLightboxOpenClass); docBody.classList.add(imgLightboxOpenClass); container.classList.remove(isLoadedClass); var logic = function logic() { if (onCreated) { callCallback(onCreated, root); } container.classList.add(animatedClass); container.classList.add(fadeInClass); img.classList.add(animatedClass); img.classList.add(fadeInUpClass); img.onload = function () { container.classList.add(isLoadedClass); if (onLoaded) { callCallback(onLoaded, root); } }; img.onerror = function () { if (onError) { callCallback(onError, root); } }; img.src = hrefString; setDisplayBlock(container); }; debounce(logic, rate).call(); }; if (!e.classList.contains(imgLightboxLinkIsBindedClass)) { e.classList.add(imgLightboxLinkIsBindedClass); e.addEventListener("click", handleImgLightboxLink); if (isTouch && (touch || dataTouch)) { e.addEventListener("touchstart", handleImgLightboxLink); } } }; if (container && img && link) { var i, l; for (i = 0, l = link.length; i < l; i += 1) { arrange(link[i]); } i = l = null; } }; root.imgLightbox = imgLightbox; })("undefined" !== typeof window ? window : this, document);