File list
文件总数: 文件总大小:
#file-api { .btn { display: inline; border: 0; color: var(--green); font-size: torem(14px); line-height: 1.5; text-decoration: underline; background-color: var(--white); cursor: pointer; } .detail { @include flexbox(row, wrap, flex-start, flex-start); align-content: flex-start; .item { flex: 0 0 auto; width: torem(60px); height: torem(60px); object-fit: cover; object-position: center center; margin: torem(5px); overflow: hidden; } } }
/** * 选取的文件信息 */ const FILE = { queue: [], size: 0, }; /** * 初始化 */ function init() { FILE.queue = []; FILE.size = 0; document.querySelector('.fileLength').innerHTML = 0; document.querySelector('.fileSize').innerHTML = 0; document.querySelector('.detail').innerHTML = ''; } /** * 创建缩略图 * @param {File} file - 图片对象 * @return {Image} 缩略图 */ function buildThumbnail(file) { const imgURL = window.URL.createObjectURL(file); const img = new Image(); img.src = imgURL; img.onload = () => { window.URL.revokeObjectURL(imgURL); }; return img; } /** * 处理添加的图片,包括预览和全局对象存储图片信息 * @param {FileList} files - 选取的图片 */ function handleFiles(files) { const unit = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; const frag = document.createDocumentFragment(); // 文件总大小 let size = 0; for (let i = 0; i < files.length; i += 1) { const img = buildThumbnail(files[i]); img.classList.add('item'); frag.appendChild(img); // update Global information FILE.queue = FILE.queue.concat(files[i]); FILE.size += files[i].size; } // 添加图片预览信息 document.querySelector('.detail').appendChild(frag); // 更新已选图片信息 for (let j = 0, temp = FILE.size; temp > 1; temp /= 1024, j += 1) { size = temp.toFixed(3) + unit[j]; } document.querySelector('.fileLength').innerHTML = FILE.queue.length; document.querySelector('.fileSize').innerHTML = size; } /** * 图片进入drop zone时触发的事件 */ function dragenter(e) { e.preventDefault(); e.target.classList.add('file-control__drop--hover'); } /** * 图片在drop zone时连续触发的事件 */ function dragover(e) { e.preventDefault(); } /** * 图片移出drop zone时触发的事件 */ function dragleave(e) { e.preventDefault(); e.target.classList.remove('file-control__drop--hover'); } /** * 通过drag & drop选取图片 */ function drop(e) { e.preventDefault(); e.target.classList.remove('file-control__drop--hover'); handleFiles(e.dataTransfer.files); } /** * 通过文件输入框选择图片 */ function select(e) { handleFiles(e.target.files); this.value = ''; } document.addEventListener('DOMContentLoaded', () => { const clear = document.querySelector('.clear'); clear.addEventListener('click', init, false); // select file const input = document.querySelector('.file-select__input'); input.addEventListener('change', select, false); // Drag & Drop const dropbox = document.querySelector('.file-control__drop'); dropbox.addEventListener('dragenter', dragenter, false); dropbox.addEventListener('dragover', dragover, false); dropbox.addEventListener('dragleave', dragleave, false); dropbox.addEventListener('drop', drop, false); }, false); window.onload = () => { init(); };