Skip to content
目录

常用工具相关

_遍历文件夹下图片并进行瀑布流布局和预览图片(有瑕疵没完善):https://github.com/Ybhdsg123/ybhdag-img/actions_

1. 图片的瀑布流排布

js
/**
 * @description: 瀑布流排法 等宽不等高
 * @param {*} data 图片数组 [{img:imgurl}]
 * @param {*} clientW 屏幕的总宽度
 * @param {*} columnNums columnNums 列数
 * @param {*} gap gap 间隔
 * @return {*}
 */
export function useWaterfall(data, clientW, columnNums, gap) {
  let pW = clientW - gap * (columnNums - 1); // 总宽度
  const columnHeights = []; // 列的高度
  let newList = JSON.parse(JSON.stringify(data)); // 深拷贝数据
  newList.length > 0 &&
    newList.forEach((obj, i) => {
      let index = i % columnNums; // 遍历的图片和列数取余
      obj.w = pW / columnNums; // 图片宽度
      // 创建图片对象获取图片的宽高
      let img = new Image();
      img.src = obj.img;
      obj.h = Number((img.height * (obj.w / img.width)).toFixed(0));
      obj.left = index * (obj.w + gap); //左边距离 2列的话,1/3/5距离左边距离为0,2/4/6距离左边距离为图片的宽度+间隔距离
      obj.top = columnHeights[index] + gap || 0; // 定位高度
      // 第一张和第二张距离顶部的高度为0
      if (isNaN(columnHeights[index])) {
        columnHeights[index] = obj.h;
      } else {
        // 第二张往后 找出前面的高度最小的索引
        index = columnHeights.indexOf(Math.min(...columnHeights));
        obj.left = index * (pW / columnNums + gap); // 改变每一张距离左边的距离
        obj.top = columnHeights[index] + gap || 0; // 距离上面的距离
        columnHeights[index] = obj.h + columnHeights[index] + gap; // 累加高度
      }
    });
  return newList;
}

2. 异步方式得到图片的大小

js
/**
 * @description:
 * @return {*} 返回一个异步的图片宽高信息
 */
export const getImgSize = (url) => {
  return new Promise((resolve, reject) => {
    let img = new Image();
    (img.onload = () => {
      resolve({
        width: img.width,
        height: img.height,
      });
    }),
      (img.onerror = () => {
        reject(new Error("error"));
      });
  });
};