实现瀑布流的几种方式(效果图)

简介: 实现瀑布流的几种方式(效果图)

一 . 使用css属性:column-count(不好)

column-count 是 CSS 中的一个属性,用于设置元素的内容应该被分割成多少列来显示,轻松地实现多列布局效果。

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <style>
    .waterfall-container {
      column-count: 2; /* 根据需要调整列数 使用这个属性就能实现----------------------------*/
      column-gap: 20px; /* 列与列之间的间距 */
      width: 90%; /* 容器宽度 */
      margin: 20px auto; /* 外边距,使容器居中 */
    }
    .waterfall-item {
      /* 这里可以添加一些基本的样式,如背景色、边框等 */
      background-color: #f4f4f4;
      margin-bottom: 20px; /* 元素之间的间距 */
      break-inside: avoid; /* 防止内容跨列显示,但这不是所有浏览器都支持 */
      /* 为了让内容在容器内垂直居中,可以添加以下样式(可选) */
      display: flex;
      flex-direction: column;
      justify-content: center;
      align-items: center;
      /* 设置一个固定的高度或最小高度来模拟不同高度的元素(可选) */
      /* height: 150px; 或 min-height: 100px; */
    }
    /* 为了更明显地看到效果,可以给每个元素添加一些随机高度 */
    /* 注意:实际项目中,你可能需要通过 JavaScript 来动态设置这些高度 */
    .waterfall-item:nth-child(odd) {
      height: 200px; /* 奇数项的高度 */
      background-color: red;
    }
    .waterfall-item:nth-child(even) {
      height: 150px; /* 偶数项的高度 */
      background-color: blue;
    }
  </style>
  <body>
    <div class="waterfall-container">
      <div class="waterfall-item">内容1</div>
      <div class="waterfall-item">内容2</div>
      <div class="waterfall-item">内容2</div>
      <div class="waterfall-item">内容1</div>
      <div class="waterfall-item">内容1</div>
      <div class="waterfall-item">内容2</div>
      <div class="waterfall-item">内容2</div>
    </div>
  </body>
</html>

是不是感觉瀑布流没那么难?一个样式就能实现我们要的效果,但是如果换成3列来看呢?

你就会发现他是垂直方向上的排列,只有第一列补充完后,第二列才开始补充,不是我们想要市面上所需要的横向排列瀑布流。

 .waterfall-container {
      column-count: 3; /* 根据需要调整列数 使用这个属性就能实现----------------------------*/
      column-gap: 20px; /* 列与列之间的间距 */
      width: 90%; /* 容器宽度 */
      margin: 20px auto; /* 外边距,使容器居中 */
    }

二 . 使用js定位实现(广泛使用)

先获取父盒子的宽度,试试能塞下多少个小图片,当第一行满了后,接下来就换行,就会获取第一行中最小图片的高度,后再获取它距离左边的宽度,然后才用定位属性,将第二行的图片添加到第一行最小图片高度的下面,具体不好讲,认真看代码就能理解了

<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    *{
      margin: 0;
      padding: 0;
    }
    #container{
      position: relative;
      /* overflow: hidden; */
      width: 1000px;
 
    }
    .box{
      float: left;
      padding: 5px;
      
    }
    .box-img{
      width: 250px;
      padding: 5px;
      /* border: 1px solid #aaa; */
    }
    img{
      width: 100%;
    }
  </style>
</head>
<body>
  <div id="container">
    <div class="box">
      <div class="box-img">
        <img src="https://gd-hbimg.huaban.com/ede93cf241ce93df1f824022ce1bc6dd042879819162e-fvCJH6" alt="">
      </div>
  </div>
    <div class="box">
      <div class="box-img">
        <img src="https://gd-hbimg.huaban.com/2d14622d76dbcd036cc47f240c80d5f1b9e6481da3430-r5cTIt" alt="">
      </div>
  </div>
    <div class="box">
      <div class="box-img">
        <img src="https://gd-hbimg.huaban.com/824306750839c34939b4345039e7425740598dd510a9c1-ewh29L" alt="">
      </div>
  </div>
    <div class="box">
      <div class="box-img">
        <img src="https://gd-hbimg.huaban.com/824306750839c34939b4345039e7425740598dd510a9c1-ewh29L" alt="">
      </div>
  </div>
    <div class="box">
      <div class="box-img">
        <img src="https://gd-hbimg.huaban.com/ce90e5b734b0c9933335d962a02ae6e8227965b6a984c-Gg1vRz" alt="">
      </div>
  </div>
    <div class="box">
      <div class="box-img">
        <img src="https://gd-hbimg.huaban.com/9fa5103953d1b3f2a70984f17395c1cf1eddc8db2af38-Q2fm1x" alt="">
      </div>
  </div>
    <div class="box">
      <div class="box-img">
        <img src="https://gd-hbimg.huaban.com/ce90e5b734b0c9933335d962a02ae6e8227965b6a984c-Gg1vRz" alt="">
      </div>
  </div>
</body>
<script>
  //网页完全加载后执行特定的代码或函数。这意呀着,当网页上的所有内容
  //(包括图片、样式表、脚本文件等)都加载完成后,window.onload 事件会被触发
window.onload = function() {
    // 确定第一行能放几 n 张图
      // 1. 获取屏幕宽度
      // 2. 获取图片的宽度
    // 操作第 n+1 张 摆放它的位置  放在高度最小的那一列
      // 1. 获取每一列的高度
      // 2. 更新这一列的高度
    imgLocation('container', 'box')
    function imgLocation(parent, child) {
      var cParent = document.getElementById(parent)
      var cChild = cParent.getElementsByClassName(child)
      var screenWidth = cParent.offsetWidth
      console.log(screenWidth,'父亲的宽度',cChild);
      var imgWidth = cChild[0].offsetWidth
      var num = Math.floor(screenWidth / imgWidth)
      console.log(num);
    //   cParent.style.width = `${imgWidth * num}px`
      // 操作第 num+1 张
      var boxHeightArr = []
      for (var i = 0; i < cChild.length; i++) {
        if (i < num) {  // 第一行
          boxHeightArr.push(cChild[i].offsetHeight)
        } else {
          // 找数组最小值
          var minHeight = Math.min(...boxHeightArr)
          console.log(boxHeightArr,minHeight);
          var minIndex = boxHeightArr.indexOf(minHeight)
          // 摆放图片
          cChild[i].style.position = 'absolute'
          cChild[i].style.top = minHeight + 'px'
          cChild[i].style.left = cChild[minIndex].offsetLeft + 'px'
          // 更新这一列的高度
          boxHeightArr[minIndex] = boxHeightArr[minIndex] + cChild[i].offsetHeight
        }
      }
    }
  }
</script>
</html>


相关文章
|
5月前
uniapp实战 —— 轮播图【数字下标】(含组件封装,点击图片放大全屏预览)
uniapp实战 —— 轮播图【数字下标】(含组件封装,点击图片放大全屏预览)
117 1
|
6月前
Elementui-Image组件,单个图片点击放大展示
Elementui-Image组件,单个图片点击放大展示
254 2
|
7月前
【最简洁】一句CSS3代码实现不规则自定义背景图拼接样式,多用于异形弹窗背景图
【最简洁】一句CSS3代码实现不规则自定义背景图拼接样式,多用于异形弹窗背景图
|
7月前
|
数据可视化 大数据
【透明版九宫格背景图片】仅依靠background的几个属性组合搭配出酷炫的透明背景卡片效果→适用于大数据可视化、数据大屏展示页面
【透明版九宫格背景图片】仅依靠background的几个属性组合搭配出酷炫的透明背景卡片效果→适用于大数据可视化、数据大屏展示页面
【透明版九宫格背景图片】仅依靠background的几个属性组合搭配出酷炫的透明背景卡片效果→适用于大数据可视化、数据大屏展示页面
|
前端开发 JavaScript
前端切图:一句代码实现返回顶部
前端切图:一句代码实现返回顶部
56 0
|
前端开发 算法
怎么写一个可以拖拽缩放的div?
怎么写一个可以拖拽缩放的div?
107 0
|
移动开发 前端开发 HTML5
前端 HTML5 Svg 画板(支持视频、图片上涂鸦,支持缩放、修改、颜色、复选...)
前端 HTML5 Svg 画板(支持视频、图片上涂鸦,支持缩放、修改、颜色、复选...)
253 0
|
小程序 JavaScript
微信小程序图片放大预览效果的实现,轮播图点击放大预览
微信小程序图片放大预览效果的实现,轮播图点击放大预览
1056 0

热门文章

最新文章