React 实现瀑布流布局

1.话不多说直接上代码

        

let onload = function () {
    // 首先拿到容器的宽度 因为等宽不等高 我们可以拿宽度除于宽度得到最多放多少张图片
    let contentWidth = document.getElementsByClassName('content')[0]
    // 获取单个图片的宽度
    let imgs = contentWidth.children
    let imgWidth = imgs[0].offsetWidth
    // 通过总宽度 来获取一行最多多少张图片
    let nums = Math.floor(contentWidth.offsetWidth / imgWidth)
    console.log(nums)

    // 获取第一排的所有高度
    
    let arrHeight = [] //存储图片高度的列表

    for (let i = 0; i < imgs.length; i++) {
      if (i < nums) {
        // 将每张图片的高度都添加到 arrHeight列表中
        arrHeight.push(imgs[i].offsetHeight)
      } else {
        // 第二排图片 默认添加到第一个照片下面
        let obj = { minH: arrHeight[0], minI: 0 }
        // 循环判断 那个高度最小 将第二排的图片进行排比
        for (let j = 0; j < arrHeight.length; j++) {
          // 找到高度最小的将那个默认的给进行替换
          if (arrHeight[j] < obj.minH) {
            obj.minH = arrHeight[j]
            obj.minI = j
          }
        }
        console.log(obj)
        // 给不是第一排的数据进行设置 样式定位
        imgs[i].style.position = 'absolute'
        imgs[i].style.left = imgs[obj.minI].offsetLeft + 'px'
        imgs[i].style.top = obj.minH + 'px'
        arrHeight[obj.minI] = arrHeight[obj.minI] + imgs[i].offsetHeight
      }
    }

  }

 2.布局

 <div className='content'>
      {
        list.map((item, index) => {
          return (
            <div className='content_item' key={index}>
              <img src={item} alt={index} />
            </div>
          )
        })
      }

    </div>
  )

3.css 样式

* {
  margin: 0;
  padding: 0;
}

.content {
  width: 100vw;
}

.content_item{
  padding: 10px;
  border: 1px solid #ccc;
  float: left;
}

.content_item>img{
  width: 130px;
}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

来都来了_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值