<template>
  <div class="waterfull">
    <h2>瀑布流布局</h2>
    <div class="v-waterfall-content" id="v-waterfall">
      <div
        v-for="(img, index) in waterfallList"
        :key="index"
        class="v-waterfall-item"
        :style="{
          top: img.top + 'px',
          left: img.left + 'px',
          width: waterfallImgWidth + 'px',
          height: img.height,
        }"
      >
        <img :src="img.src" alt="" />
        说明文字
        <p style="font-size: small; color: #666; margin: 4px">
          {{ img.title }}
        </p>
        <p
          style="
            font-size: x-small;
            color: #9e9e9e;
            margin: 4px;
            padding-bottom: 6px;
          "
        >
          {{ img.info }}
        </p>
      </div>
    </div>
  </div>
</template>
<script>
import axios from 'axios'
export default {
  name: "v-waterfall",
  data () {
    return {
      waterfallList: [],
      imgArr: [
        require('../assets/err.png'),
        require('../assets/img/1.jpg'),
        require('../assets/img/2.jpeg'),
        require('../assets/img/3.jpg'),
        require('../assets/img/4.jpg'),
        require('../assets/img/5.jpg'),
        require('../assets/img/6.jpg'),
        require('../assets/img/7.jpg'),
        require('../assets/img/8.jpg'),
        require('../assets/img/9.jpg'),
        require('../assets/img/10.jpeg'),
        require('../assets/img/11.jpeg'),
        require('../assets/img/12.jpg'),
        require('../assets/err.png'),
        require('../assets/img/1.jpg'),
        require('../assets/img/2.jpeg'),
        require('../assets/img/3.jpg'),
        require('../assets/img/4.jpg'),
        require('../assets/img/5.jpg'),
        require('../assets/img/6.jpg'),
        require('../assets/img/7.jpg'),
        require('../assets/img/8.jpg'),
        require('../assets/img/9.jpg'),
        require('../assets/img/10.jpeg'),
        require('../assets/img/11.jpeg'),
        require('../assets/img/12.jpg'),
        require('../assets/err.png'),
        require('../assets/img/1.jpg'),
        require('../assets/img/2.jpeg'),
        require('../assets/img/3.jpg'),
        require('../assets/img/4.jpg'),
        require('../assets/img/5.jpg'),
        require('../assets/img/6.jpg'),
        require('../assets/img/7.jpg'),
        require('../assets/img/8.jpg'),
        require('../assets/img/9.jpg'),
        require('../assets/img/10.jpeg'),
        require('../assets/img/11.jpeg'),
        require('../assets/img/12.jpg'),
        require('../assets/err.png'),
        require('../assets/img/1.jpg'),
        require('../assets/img/2.jpeg'),
        require('../assets/img/3.jpg'),
        require('../assets/img/4.jpg'),
        require('../assets/img/5.jpg'),
        require('../assets/img/6.jpg'),
        require('../assets/img/7.jpg'),
        require('../assets/img/8.jpg'),
        require('../assets/img/9.jpg'),
        require('../assets/img/10.jpeg'),
        require('../assets/img/11.jpeg'),
        require('../assets/img/12.jpg')
      ],
      
      waterfallImgWidth: 200,
      waterfallImgCol: 5,
      
      waterfallImgRight: 10,
      waterfallImgBottom: 10,
      waterfallDeviationHeight: [],
      imgList: []
    }
  },
  created () {
    axios.get('/data.json', {
    })
      .then(function (res) {
        this.imgArr = res
      })
      .catch(function (error) {
      })
    
    for (let i = 0; i < this.imgArr.length; i++) {
      
      this.imgList.push(this.imgArr[i]);
    }
  },
  mounted () {
    this.calculationWidth();
  },
  methods: {
    
    calculationWidth () {
      let domWidth = document.getElementById("v-waterfall").offsetWidth;
      if (!this.waterfallImgWidth && this.waterfallImgCol) {
        this.waterfallImgWidth = (domWidth - this.waterfallImgRight * this.waterfallImgCol) / this.waterfallImgCol;
      } else if (this.waterfallImgWidth && !this.waterfallImgCol) {
        this.waterfallImgCol = Math.floor(domWidth / (this.waterfallImgWidth + this.waterfallImgRight))
      }
      
      this.waterfallDeviationHeight = new Array(this.waterfallImgCol);
      for (let i = 0; i < this.waterfallDeviationHeight.length; i++) {
        this.waterfallDeviationHeight[i] = 0;
      }
      this.imgPreloading()
    },
    
    imgPreloading () {
      for (let i = 0; i < this.imgList.length; i++) {
        let aImg = new Image();
        aImg.src = this.imgList[i];
        aImg.onload = aImg.onerror = (e) => {
          let imgData = {};
          imgData.height = this.waterfallImgWidth / aImg.width * aImg.height;
          imgData.src = this.imgList[i];
          imgData.title = '标题';
          imgData.info = '详情说明:啦啦啦啦啦';
          this.waterfallList.push(imgData);
          this.rankImg(imgData);
        }
      }
    },
    
    rankImg (imgData) {
      let {
        waterfallImgWidth,
        waterfallImgRight,
        waterfallImgBottom,
        waterfallDeviationHeight,
        waterfallImgCol
      } = this;
      let minIndex = this.filterMin();
      imgData.top = waterfallDeviationHeight[minIndex];
      imgData.left = minIndex * (waterfallImgRight + waterfallImgWidth);
      
      waterfallDeviationHeight[minIndex] += imgData.height + waterfallImgBottom + 56;
      console.log(this.waterfallList);
    },
    
    filterMin () {
      const min = Math.min.apply(null, this.waterfallDeviationHeight);
      return this.waterfallDeviationHeight.indexOf(min);
    }
  }
}
</script>
<style scoped>
.waterfull {
  width: 1050px;
  padding: 0 10px;
  margin: 0 auto;
  background: #000;
}
.v-waterfall-content {
  
  width: 100%;
  
  position: relative;
  
}
.v-waterfall-item {
  
  float: left;
  position: absolute;
}
.v-waterfall-item img {
  
  
  width: 100%;
  height: auto;
  
  border-radius: 6px;
}
</style>