generator-bannertime
Version:
Yeoman generator for creating HTML5 advertising campaigns
231 lines (202 loc) • 6.3 kB
JavaScript
;
var Banner = function () {
this.loader();
this.imageCache = {};
};
Banner.prototype.onInit = function () {
console.log('Banner initialised');
};
Banner.prototype.onPolite = function () {
console.log('Polite loading scripts');
};
/**
* Polite load scripts and trigger the
*/
Banner.prototype.onVisible = function () {
var _this = this;
this.politeLoad([
'https://cdnjs.cloudflare.com/ajax/libs/gsap/3.4.2/gsap.min.js'
], function () {
_this.start();
});
};
/**
* Set up smart object method.
*/
Banner.prototype.smartObject = function (_settings) {
var _this = this;
var settings = _settings || {};
settings.type = settings.type || 'div';
settings.position = settings.position || 'absolute';
settings.left = settings.left || '0';
settings.top = settings.top || '0';
var element = document.createElement(settings.type);
element._settings = settings.constructor();
for (var key in settings) {
element._settings[key] = settings[key];
}
switch (settings.type) {
case 'canvas' :
element.width = settings.width;
element.height = settings.height;
break;
case 'video' :
if (settings.autoplay) { element.autoplay = settings.autoplay; }
if (settings.loop) { element.loop = settings.loop; }
if (settings.controls) { element.controls = settings.controls; }
if (settings.muted) {
element.muted = settings.muted;
element.setAttribute('muted', '');
}
if (settings.poster) { element.poster = settings.poster; }
if (settings.preload) { element.preload = settings.preload; }
if (settings.playsinline) { element.setAttribute('playsinline', ''); }
if (settings.src) { element.src = settings.src; }
break;
case 'img' :
element.src = settings.src;
element.alt = settings.alt;
break;
}
if (settings.sources) {
var sources = settings.sources;
var fragment = document.createDocumentFragment();
for (var i = 0; i < sources.length; i++) {
var sourceTag = document.createElement('source');
sourceTag.src = sources[i].url;
sourceTag.type = sources[i].type;
fragment.appendChild(sourceTag);
}
element.appendChild(fragment);
}
function applySettings() {
if (settings.id) {
element.id = settings.id;
}
if (settings.parent) {
settings.parent.appendChild(element);
}
if (settings.innerHTML) {
element.innerHTML = settings.innerHTML;
}
delete settings.innerHTML;
delete settings.retina;
delete settings.parent;
delete settings.id;
delete settings.type;
delete settings.autoplay;
delete settings.loop;
delete settings.controls;
delete settings.muted;
delete settings.poster;
delete settings.preload;
delete settings.playsinline;
delete settings.sources;
delete settings.src;
delete settings.alt;
gsap.set(element, settings);
}
function setImage() {
var isSVG = this.src.slice(-4) === '.svg';
if (isSVG) {
document.body.appendChild(this);
}
settings.width = Math.round(settings.width || (settings.retina ? this.width / 2 : this.width));
settings.height = Math.round(settings.height || (settings.retina ? this.height / 2 : this.height));
settings.backgroundImage = 'url(' + this.src + ')';
applySettings();
if (isSVG) {
document.body.removeChild(this);
}
}
function loadImg(src, setImg) {
var img = _this.imageCache[src];
if (img) {
if (setImg) {
setImage.apply(img);
}
} else {
img = document.createElement('img');
img.src = src;
if (setImg) {
img.onload = setImage;
}
_this.imageCache[src] = img;
}
}
if (settings.backgroundImage) {
element.style.backgroundSize = settings.backgroundSize || '100% 100%';
element.style.backgroundPosition = settings.backgroundPosition || 'center';
element.style.backgroundRepeat = settings.backgroundRepeat || 'no-repeat';
if (Object.prototype.toString.call(settings.backgroundImage) === '[object Array]') {
element.images = settings.backgroundImage;
for (var j = 0; j < element.images.length; ++j) {
loadImg(element.images[j], j === 0);
}
} else {
loadImg(settings.backgroundImage, true);
}
} else {
applySettings();
}
// Helper functions
element.appendChildren = function (children) {
var fragment = document.createDocumentFragment();
for (var i = 0; i < children.length; i++) {
fragment.appendChild(children[i]);
}
this.appendChild(fragment);
};
element.set = function (settings) {
gsap.set(this, settings);
};
element.to = function (settings) {
gsap.to(this, settings);
};
element.from = function (settings) {
gsap.from(this, settings);
};
element.fromTo = function (from, to) {
gsap.fromTo(this, from, to);
};
element.get = function (property) {
return ((this._gsTransform && this._gsTransform[property]) || (this._gsTransform && this._gsTransform[property] === 0)) ? this._gsTransform[property] : (this.style[property].slice(-2) === 'px') ? parseFloat(this.style[property]) : this.style[property];
};
element.center = function () {
gsap.set(this, { top: '50%', marginTop: -this.offsetHeight / 2, left: '50%', marginLeft: -this.offsetWidth / 2 });
};
element.centerHorizontal = function () {
gsap.set(this, { left: '50%', marginLeft: -this.offsetWidth / 2 });
};
element.centerVertical = function () {
gsap.set(this, { top: '50%', marginTop: -this.offsetHeight / 2 });
};
element.getOriginal = function (property) {
return element._settings[property] || 0;
};
return element;
};
/**
* Preload images method.
*/
Banner.prototype.preloadImages = function (images, callback, scope) {
var _this = this;
var l = images.length;
var loaded = 0;
var img = null;
for (var i = 0; i < l; ++i) {
img = document.createElement('img');
img.src = img.microSrc = images[i];
img.onload = function () {
_this.imageCache[this.microSrc] = this;
loaded++;
if (loaded === l) {
if (scope) {
callback.call(scope);
} else {
callback();
}
}
};
}
};