You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
112 lines
2.9 KiB
112 lines
2.9 KiB
6 years ago
|
/* jshint strict: false */
|
||
|
|
||
|
var progressElem, statusElem;
|
||
|
var supportsProgress;
|
||
|
var loadedImageCount, imageCount;
|
||
|
|
||
|
var container = document.querySelector('#image-container');
|
||
|
statusElem = document.querySelector('#status');
|
||
|
progressElem = document.querySelector('progress');
|
||
|
|
||
|
supportsProgress = progressElem &&
|
||
|
// IE does not support progress
|
||
|
progressElem.toString().indexOf('Unknown') === -1;
|
||
|
|
||
|
document.querySelector('#add').onclick = function() {
|
||
|
// add new images
|
||
|
var fragment = getItemsFragment();
|
||
|
container.insertBefore( fragment, container.firstChild );
|
||
|
// use ImagesLoaded
|
||
|
var imgLoad = imagesLoaded( container );
|
||
|
imgLoad.on( 'progress', onProgress );
|
||
|
imgLoad.on( 'always', onAlways );
|
||
|
// reset progress counter
|
||
|
imageCount = imgLoad.images.length;
|
||
|
resetProgress();
|
||
|
updateProgress( 0 );
|
||
|
};
|
||
|
|
||
|
// reset container
|
||
|
document.querySelector('#reset').onclick = function() {
|
||
|
empty( container );
|
||
|
};
|
||
|
|
||
|
// ----- set text helper ----- //
|
||
|
|
||
|
var docElem = document.documentElement;
|
||
|
var textSetter = docElem.textContent !== undefined ? 'textContent' : 'innerText';
|
||
|
|
||
|
function setText( elem, value ) {
|
||
|
elem[ textSetter ] = value;
|
||
|
}
|
||
|
|
||
|
function empty( elem ) {
|
||
|
while ( elem.firstChild ) {
|
||
|
elem.removeChild( elem.firstChild );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// ----- ----- //
|
||
|
|
||
|
// return doc fragment with
|
||
|
function getItemsFragment() {
|
||
|
var fragment = document.createDocumentFragment();
|
||
|
for ( var i = 0; i < 7; i++ ) {
|
||
|
var item = getImageItem();
|
||
|
fragment.appendChild( item );
|
||
|
}
|
||
|
return fragment;
|
||
|
}
|
||
|
|
||
|
// return an <li> with a <img> in it
|
||
|
function getImageItem() {
|
||
|
var item = document.createElement('li');
|
||
|
item.className = 'is-loading';
|
||
|
var img = document.createElement('img');
|
||
|
var size = Math.random() * 3 + 1;
|
||
|
var width = Math.random() * 110 + 100;
|
||
|
width = Math.round( width * size );
|
||
|
var height = Math.round( 140 * size );
|
||
|
var rando = Math.ceil( Math.random() * 1000 );
|
||
|
// 10% chance of broken image src
|
||
|
// random parameter to prevent cached images
|
||
|
img.src = rando < 100 ? '//foo/broken-' + rando + '.jpg' :
|
||
|
// use lorempixel for great random images
|
||
|
'//lorempixel.com/' + width + '/' + height + '/' + '?' + rando;
|
||
|
item.appendChild( img );
|
||
|
return item;
|
||
|
}
|
||
|
|
||
|
// ----- ----- //
|
||
|
|
||
|
function resetProgress() {
|
||
|
statusElem.style.opacity = 1;
|
||
|
loadedImageCount = 0;
|
||
|
if ( supportsProgress ) {
|
||
|
progressElem.setAttribute( 'max', imageCount );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function updateProgress( value ) {
|
||
|
if ( supportsProgress ) {
|
||
|
progressElem.setAttribute( 'value', value );
|
||
|
} else {
|
||
|
// if you don't support progress elem
|
||
|
setText( statusElem, value + ' / ' + imageCount );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// triggered after each item is loaded
|
||
|
function onProgress( imgLoad, image ) {
|
||
|
// change class if the image is loaded or broken
|
||
|
image.img.parentNode.className = image.isLoaded ? '' : 'is-broken';
|
||
|
// update progress element
|
||
|
loadedImageCount++;
|
||
|
updateProgress( loadedImageCount );
|
||
|
}
|
||
|
|
||
|
// hide status when done
|
||
|
function onAlways() {
|
||
|
statusElem.style.opacity = 0;
|
||
|
}
|