DEMOs

导航页

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();
};