Created
March 11, 2020 16:37
-
-
Save TomasBouda/f091e3a7839cf561d5f007d2b0326c8b to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(function webpackUniversalModuleDefinition(root, factory) { | |
if(typeof exports === 'object' && typeof module === 'object') | |
module.exports = factory(); | |
else if(typeof define === 'function' && define.amd) | |
define("Gifffer", [], factory); | |
else if(typeof exports === 'object') | |
exports["Gifffer"] = factory(); | |
else | |
root["Gifffer"] = factory(); | |
})(this, function() { | |
var d = document; | |
var playSize = 60; | |
var Gifffer = function() { | |
var images, i = 0, gifs = []; | |
images = d.querySelectorAll('[data-gifffer]'); | |
for(; i<images.length; ++i) process(images[i], gifs); | |
// returns each gif container to be usable programmatically | |
return gifs; | |
}; | |
function formatUnit(v) { | |
return v + (v.toString().indexOf('%') > 0 ? '' : 'px'); | |
}; | |
function createContainer(w, h, el, altText) { | |
var alt; | |
var con = d.createElement('BUTTON'); | |
var cls = el.getAttribute('class'); | |
var id = el.getAttribute('id'); | |
cls ? con.setAttribute('class', el.getAttribute('class')) : null; | |
id ? con.setAttribute('id', el.getAttribute('id')) : null; | |
con.setAttribute('style', 'position:relative;cursor:pointer;background:none;border:none;padding:0;'); | |
con.setAttribute('aria-hidden', 'true'); | |
// creating play button | |
var play = d.createElement('DIV'); | |
play.setAttribute('class','gifffer-play-button'); | |
play.setAttribute('style', 'width:' + playSize + 'px;height:' + playSize + 'px;border-radius:' + (playSize/2) + 'px;background:rgba(0, 0, 0, 0.3);position:absolute;top:50%;left:50%;margin:-' + (playSize/2) + 'px'); | |
var trngl = d.createElement('DIV'); | |
trngl.setAttribute('style', 'width:0;height: 0;border-top:14px solid transparent;border-bottom:14px solid transparent;border-left:14px solid rgba(0, 0, 0, 0.5);position:absolute;left:26px;top:16px;'); | |
play.appendChild(trngl); | |
// create alt text if available | |
if (altText) { | |
alt = d.createElement('p'); | |
alt.setAttribute('class','gifffer-alt'); | |
alt.setAttribute('style', 'border:0;clip:rect(0 0 0 0);height:1px;overflow:hidden;padding:0;position:absolute;width:1px;'); | |
alt.innerText = altText + ', image'; | |
} | |
// dom placement | |
con.appendChild(play); | |
el.parentNode.replaceChild(con, el); | |
altText ? con.parentNode.insertBefore(alt, con.nextSibling) : null; | |
return { c: con, p: play }; | |
}; | |
function calculatePercentageDim (el, w, h, wOrig, hOrig) { | |
var parentDimW = el.parentNode.offsetWidth; | |
var parentDimH = el.parentNode.offsetHeight; | |
var ratio = wOrig / hOrig; | |
if (w.toString().indexOf('%') > 0) { | |
w = parseInt(w.toString().replace('%', '')); | |
w = (w / 100) * parentDimW; | |
h = w / ratio; | |
} else if (h.toString().indexOf('%') > 0) { | |
h = parseInt(h.toString().replace('%', '')); | |
h = (h / 100) * parentDimW; | |
w = h / ratio; | |
} | |
return { w: w, h: h }; | |
}; | |
function process(el, gifs) { | |
var url, con, c, w, h, duration,play, gif, playing = false, cc, isC, durationTimeout, dims, altText; | |
url = el.getAttribute('data-gifffer'); | |
w = el.getAttribute('data-gifffer-width'); | |
h = el.getAttribute('data-gifffer-height'); | |
duration = el.getAttribute('data-gifffer-duration'); | |
altText = el.getAttribute('data-gifffer-alt'); | |
el.style.display = 'block'; | |
// creating the canvas | |
c = document.createElement('canvas'); | |
isC = !!(c.getContext && c.getContext('2d')); | |
if(w && h && isC) cc = createContainer(w, h, el, altText); | |
// waiting for image load | |
el.onload = function() { | |
if(!isC) return; | |
w = w || el.width; | |
h = h || el.height; | |
// creating the container | |
if (!cc) cc = createContainer(w, h, el, altText); | |
con = cc.c; | |
play = cc.p; | |
dims = calculatePercentageDim(con, w, h, el.width, el.height); | |
// add the container to the gif arraylist | |
gifs.push(con); | |
// listening for image click | |
con.addEventListener('click', function() { | |
clearTimeout(durationTimeout); | |
if(!playing) { | |
playing = true; | |
gif = document.createElement('IMG'); | |
gif.setAttribute('style', 'width:100%;height:100%;'); | |
gif.setAttribute('data-uri', Math.floor(Math.random()*100000) + 1); | |
setTimeout(function() { | |
gif.src = url; | |
}, 0); | |
con.removeChild(play); | |
con.removeChild(c); | |
con.appendChild(gif); | |
if(parseInt(duration) > 0) { | |
durationTimeout = setTimeout(function() { | |
playing = false; | |
con.appendChild(play); | |
con.removeChild(gif); | |
con.appendChild(c); | |
gif = null; | |
}, duration); | |
} | |
} else { | |
playing = false; | |
con.appendChild(play); | |
con.removeChild(gif); | |
con.appendChild(c); | |
gif = null; | |
} | |
}); | |
// canvas | |
c.width = dims.w; | |
c.height = dims.h; | |
c.getContext('2d').drawImage(el, 0, 0, dims.w, dims.h); | |
con.appendChild(c); | |
// setting the actual image size | |
con.setAttribute('style', 'position:relative;cursor:pointer;width:' + dims.w + 'px;height:' + dims.h + 'px;background:none;border:none;padding:0;'); | |
c.style.width = '100%'; | |
c.style.height = '100%'; | |
if (w.toString().indexOf('%') > 0 && h.toString().indexOf('%') > 0) { | |
con.style.width = w; | |
con.style.height = h; | |
} else if (w.toString().indexOf('%') > 0) { | |
con.style.width = w; | |
con.style.height = 'inherit'; | |
} else if (h.toString().indexOf('%') > 0) { | |
con.style.width = 'inherit'; | |
con.style.height = h; | |
} else { | |
con.style.width = dims.w + 'px'; | |
con.style.height = dims.h + 'px'; | |
} | |
}; | |
el.src = url; | |
} | |
return Gifffer; | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment