聊聊双列瀑布流

今天我们来聊聊实现一个双列瀑布流

效果展示

什么是双列瀑布流?

双列瀑布流布局是一种常见的网页设计布局,通常用于展示图片、文章或其他内容。当内容较多时,这种布局能够有效利用屏幕空间,创造出一种动态和流畅的视觉效果。

特点

  1. 两列布局:内容被分为两列,通常是左右对称,适合在较宽的屏幕上显示。
  2. 不规则高度:每个内容项的高度可以不同,类似于瀑布流的效果,内容项从上到下排列,形成自然的流动感。
  3. 响应式设计:在不同屏幕尺寸上,列数和内容排列方式可以自动调整,以适应设备的宽度。

实现

首先我们想一下这个要什么实现呢?

实现的方式有很多种,这里我们讲一种,通过js动态计算高度去实现

  • 首先我们准备两列用于做双列
js 复制代码
<div class="masonry">
     <div class="column" id="left"></div>
     <div class="column" id="right"></div>
 </div>

接下来我们就需要往这里里面去插方块了

插方块的逻辑其实很容易想到,那不就是那边高度矮就将方块插入到那边吗?

逻辑有了,我们说干就干

首先写一个创建随机高度item的方法

js 复制代码
function createItem(index) {
     const div = document.createElement('div');
     div.className = 'item';
     const height = Math.floor(Math.random() * 100 + 80); // 80 ~ 180
     div.style.height = `${height}px`;
     div.innerHTML = `<h4>方块 ${index}</h4><p>高度:${height}px</p>`;
     return div;
}

接下来我们就剩下往双列表里插入数据了

js 复制代码
 function addItem(index) {
     const item = createItem(index);
     document.body.appendChild(item);
     setTimeout(() => {
         const leftHeight = left.offsetHeight;
         const rightHeight = right.offsetHeight;
         if (leftHeight <= rightHeight) {
             left.appendChild(item);
         } else {
             right.appendChild(item);
         }
     }, 0);
 }
js 复制代码
function addItem(index) {
    const item = createItem(index);
    document.body.appendChild(item);
 }
  1. function addItem(index) :定义一个名为 addItem 的函数,接受一个参数 index,通常表示项目的索引或标识符。
  2. const item = createItem(index); :调用 createItem 函数,生成一个新的项目(item),并将其赋值给变量 item
  3. document.body.appendChild(item); :将生成的项目暂时添加到 document.body 中。这是为了确保项目在 DOM 中可见。
js 复制代码
setTimeout(() => {
    const leftHeight = left.offsetHeight;
    const rightHeight = right.offsetHeight;
}
  1. setTimeout(() => { ... }, 0); :使用 setTimeout 将后续代码放入事件队列,以确保在 DOM 更新后执行。这使得浏览器可以先渲染 DOM,再测量高度。
  2. const leftHeight = left.offsetHeight; :获取左列(left)的当前高度。
  3. const rightHeight = right.offsetHeight; :获取右列(right)的当前高度。
js 复制代码
if (leftHeight <= rightHeight) {
        left.appendChild(item);
    } else {
        right.appendChild(item);
    }
}, 0);
  1. if (leftHeight <= rightHeight) { ... } :判断左列的高度是否小于或等于右列的高度。
  2. left.appendChild(item); :如果左列较短,将新项目添加到左列。
  3. right.appendChild(item); :如果右列较短,将新项目添加到右列。

接下来执行循环将item插入到双列

js 复制代码
   for (let i = 1; i <= 20; i++) {
            addItem(i);
}

这样我们就成功实现了双列瀑布流

总结

通过上述步骤,我们成功实现了一个双列瀑布流布局。该布局能够动态地根据内容高度将项目插入到适当的列中,保持视觉上的平衡与美观

相关推荐
雨季66614 分钟前
Flutter 三端应用实战:OpenHarmony 简易“动态内边距调节器”交互模式深度解析
javascript·flutter·ui·交互·dart
天人合一peng29 分钟前
Unity中button 和toggle监听事件函数有无参数
前端·unity·游戏引擎
会飞的战斗鸡1 小时前
JS中的链表(含leetcode例题)
javascript·leetcode·链表
多米Domi0111 小时前
0x3f 第48天 面向实习的八股背诵第五天 + 堆一题 背了JUC的题,java.util.Concurrency
开发语言·数据结构·python·算法·leetcode·面试
方也_arkling1 小时前
别名路径联想提示。@/统一文件路径的配置
前端·javascript
毕设源码-朱学姐1 小时前
【开题答辩全过程】以 基于web教师继续教育系统的设计与实现为例,包含答辩的问题和答案
前端
qq_177767371 小时前
React Native鸿蒙跨平台剧集管理应用实现,包含主应用组件、剧集列表、分类筛选、搜索排序等功能模块
javascript·react native·react.js·交互·harmonyos
qq_177767372 小时前
React Native鸿蒙跨平台自定义复选框组件,通过样式数组实现选中/未选中状态的样式切换,使用链式调用替代样式数组,实现状态驱动的样式变化
javascript·react native·react.js·架构·ecmascript·harmonyos·媒体
web打印社区2 小时前
web-print-pdf:突破浏览器限制,实现专业级Web静默打印
前端·javascript·vue.js·electron·html
RFCEO2 小时前
前端编程 课程十三、:CSS核心基础1:CSS选择器
前端·css·css基础选择器详细教程·css类选择器使用方法·css类选择器命名规范·css后代选择器·精准选中嵌套元素