Skip to content

Instantly share code, notes, and snippets.

@TomasBouda
Created March 11, 2020 16:37
Show Gist options
  • Save TomasBouda/f091e3a7839cf561d5f007d2b0326c8b to your computer and use it in GitHub Desktop.
Save TomasBouda/f091e3a7839cf561d5f007d2b0326c8b to your computer and use it in GitHub Desktop.
(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