首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

js中的瀑布流

瀑布流(Waterfall Layout)是一种常见的网页布局方式,特别适用于图片展示。它能够让网页元素按照不同的列进行排列,每列的高度由内容决定,形成类似瀑布的效果。

基础概念

  • 瀑布流布局通过将页面元素分成多列,然后逐个将元素添加到当前高度最低的列中。
  • 这种布局方式可以有效地利用页面空间,使得内容排列更加美观和有序。

优势

  1. 视觉效果好:元素排列自然,页面看起来更整洁。
  2. 空间利用率高:能够充分利用页面空间,减少空白区域。
  3. 适应性强:可以适应不同大小和数量的元素。

类型

  • 固定列数瀑布流:列数固定,适用于已知内容量的情况。
  • 自适应列数瀑布流:根据屏幕大小或内容量动态调整列数。

应用场景

  • 图片库
  • 新闻列表
  • 商品展示

常见问题及解决方法

  1. 布局错乱
    • 原因:窗口大小变化或内容动态加载时,布局没有重新计算。
    • 解决方法:监听窗口大小变化事件和内容加载事件,重新计算布局。
    • 解决方法:监听窗口大小变化事件和内容加载事件,重新计算布局。
  • 图片加载延迟导致的布局问题
    • 原因:图片未加载完成时,占位高度不准确。
    • 解决方法:使用图片的 onload 事件确保图片加载完成后再进行布局计算。
    • 解决方法:使用图片的 onload 事件确保图片加载完成后再进行布局计算。
  • 性能问题
    • 原因:大量DOM操作导致页面重绘和重排频繁。
    • 解决方法:使用文档片段(DocumentFragment)批量操作DOM,减少重绘和重排次数。
    • 解决方法:使用文档片段(DocumentFragment)批量操作DOM,减少重绘和重排次数。

示例代码: 以下是一个简单的瀑布流布局实现示例:

代码语言:txt
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Waterfall Layout</title>
    <style>
        .waterfall {
            display: flex;
            flex-direction: row;
        }
        .column {
            flex: 1;
            margin: 5px;
            display: flex;
            flex-direction: column;
        }
        .item {
            margin: 5px;
            background-color: #ccc;
            padding: 10px;
        }
    </style>
</head>
<body>
    <div class="waterfall" id="waterfall">
        <!-- Columns will be created here -->
    </div>

    <script>
        const items = Array.from({ length: 20 }, (_, i) => `<div class="item">Item ${i + 1}</div>`).join('');
        document.getElementById('waterfall').innerHTML = items;

        function layoutWaterfall() {
            const waterfall = document.getElementById('waterfall');
            const columnCount = 3;
            const columns = Array.from({ length: columnCount }, () => []);

            const items = waterfall.children;
            for (let i = 0; i < items.length; i++) {
                const column = columns[i % columnCount];
                column.push(items[i]);
            }

            columns.forEach((column, index) => {
                const columnDiv = document.createElement('div');
                columnDiv.className = 'column';
                column.forEach(item => columnDiv.appendChild(item));
                waterfall.appendChild(columnDiv);
            });
        }

        layoutWaterfall();
        window.addEventListener('resize', layoutWaterfall);
    </script>
</body>
</html>

这个示例展示了如何使用JavaScript实现一个简单的瀑布流布局,并在窗口大小变化时重新计算布局。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

分享:纯 css 瀑布流 和 js 瀑布流

博客地址:https://ainyi.com/60 分享一次纯 css 瀑布流  和 js 瀑布流 纯 css 写瀑布流 1.multi-columns 方式: 通过 Multi-columns 相关的属性...看到这里,我们可以发现,使用纯 css 写瀑布流,每一块 item 都是从上往下排列,不能做到从左往右排列: ? 这样子若是动态加载图片的瀑布流,体验就会很不好 我们想要的是这样: ?...这样做只能通过 js 来写瀑布流 js 写瀑布流: html 结构与上面类似,这里我用图片来做示例: 1 2 瀑布流实现方式: css 的绝对定位方式:根据每张图片的位置设置 top 和 left 值: 1 //瀑布流效果 2 //这里有一个坑(已经修复): 3 //因为是动态加载远程图片,在未加载完全无法获取图片宽高...就可以设置每张图片在瀑布流中每块item的top值(每一行中最小的item高度,数组查找) 9 //item的left值:第一行:按照每块item的宽度值*块数 10 // 其他行

8.9K40

分享一次纯 css 瀑布流 和 js 瀑布流

博客地址:https://ainyi.com/60 现在百度图片,360 图片搜索,都是以一种瀑布流的形式展示,那么接下来,分享一波纯 css 瀑布流 和 js 瀑布流 纯 css 写瀑布流 multi-columns...-- more items --> .masonry 是瀑布流容器,里面放置了列表 item,在 .masonry 中设置 column-count(列数) 和 column-gap(列间距...,体验就会很不好 我们想要的是这样: [no351tx20r.jpeg] 要实现如上,只能通过 js 来写瀑布流 js 写瀑布流 html 结构与上面类似,但这里我用图片来做示例 瀑布流实现方式 css 的绝对定位方式:根据每张图片的位置设置 top 和 left 值 // 瀑布流效果 // 这里有一个坑(已经修复): // 因为是动态加载远程图片,在未加载完全无法获取图片宽高...就可以设置每张图片在瀑布流中每块 item 的 top 值(每一行中最小的 item 高度,数组查找) // item 的 left 值:第一行:按照每块 item 的宽度值*块数 //

2.4K40
  • 多栏布局与JS实现瀑布流

    css3属性之多栏布局与JS实现瀑布流    背景:之前打算自己总结一下flex布局的知识点,发现自己无从下手,原因在何处:我反思了一下,其实原因很简单,使用的次数少,更多的时间使用了百分比,浮动和定位解决...有的时候甚至出现了这样的笔记: 我打算坚持写博客,不论自己总结有多么差劲,也要坚持写,哪怕几年后我看到以前的笔记,自己会偷偷笑出声。想想原来大一时的技术还是那样的稚嫩啊。...设定的值,否则就会减少栏数来增加每栏宽度 css3多列和JS实现瀑布流  给自己安利一波吧,看到网上很多瀑布流的效果,哇,简直棒极了有没有;于是我迫不及待的打开V**,打开了pinterest的官网...自己也梳理梳理逻辑:js代码之前,一定要先搞清逻辑,再动手写代码> 我们都不陌生瀑布流是同宽的,但是高度不一,js主要的工作就是根据高度来进行布局, 1)当一行排满后,准备排第二行的时候,....box .pic img { display: block; width: 100%; } 梳理完了逻辑,该动手写js

    3K90

    分享 1个原生 JS 瀑布流案例

    瀑布流布局中的图片有一个核心特点 —— 等宽不定等高,瀑布流布局在国内网网站都有一定规模的使用,比如pinterest、花瓣网等等。那么接下来就基于这个特点开始瀑布流探索之旅。...pointer = this.getMinPointer(perList) } } 细心的朋友也许发现了代码中获取图片的高度用到了offsetHeight 这个属性,这个属性的高度之和等于图片高度...waterfall-box { float: left; width: 200px; padding-left: 10px; padding-bottom: 10px; } 至此完成了瀑布流的基本布局...联想到业务场景中瀑布流中下拉加载的图片一般都来自 Ajax 异步获取,那么加载的数据必然不能写死在库里,期望能实现如下调用(此处借鉴了 waterfall 的使用方式), const waterfall...waterfall.on("load", function () { // 此处进行 ajax 同步/异步添加图片 }) 观察调用方式,不难联想到使用发布/订阅模式来实现它,关于发布/订阅模式,之前在Node.js

    1.9K20

    简单瀑布流

    瀑布流 什么是瀑布流 又称为瀑布流布局,是一种比较经典的网站布局方式,尤其多见于图片较多的页面。常见有两种瀑布流方式。...分别为 定宽不定高 定高不定宽 定宽不定高 定高不定宽 定宽不定高-思路 动态生成 1000 个 li 标签,设置统一的宽度 设置透明度 (实际开发中,只需要获取 1000 个图片对应的高度即可) 开启定时器...,每一行只放 3 个 li 标签 ,三个 li 标签,按照正常顺序依次摆放即可,后面的 li 标签切换逻辑 每显示一个 li 标签,就需要自己维护好一个数组 [第 1 列的 li 标签高度集合,第 2...列的 li 标签高度集合,第 3 列的 li 标签高度集合] 统计出那一列 最低 和 对应的下标(0,1,2) 将下一个 li 标签 放在对应下标的位置,同时计算出下标对应列的高度总和,设置为 即将显示的...li 标签的 top 代码 <!

    8610

    原生 JS 实现一个瀑布流插件

    瀑布流布局中的图片有一个核心特点 —— 等宽不定等高,瀑布流布局在国内外网站都有一定规模的使用,比如pinterest、花瓣网等等。那么接下来就基于这个特点开始瀑布流探索之旅。...pointer = this.getMinPointer(perList) } } 细心的朋友也许发现了代码中获取图片的高度用到了 offsetHeight 这个属性,这个属性的高度之和等于图片高度...waterfall-box { float: left; width: 200px; padding-left: 10px; padding-bottom: 10px; } 至此完成了瀑布流的基本布局...联想到业务场景中瀑布流中下拉加载的图片一般都来自 Ajax 异步获取,那么加载的数据必然不能写死在库里,期望能实现如下调用(此处借鉴了 waterfall 的使用方式), const waterfall...waterfall.on("load", function () { // 此处进行 ajax 同步/异步添加图片 }) 观察调用方式,不难联想到使用发布/订阅模式来实现它,关于发布/订阅模式,之前在 Node.js

    2.4K40

    iOS 瀑布流封装

    [瀑布流.gif] 功能描述:WSLWaterFlowLayout 是在继承于UICollectionViewLayout的基础上封装的带头脚视图的瀑布流控件。...目前支持竖向瀑布流(item等宽不等高、支持头脚视图)、水平瀑布流(item等高不等宽 不支持头脚视图)、竖向瀑布流( item等高不等宽、支持头脚视图)三种样式的瀑布流布局。...前言 :近几个月一直在忙公司的ChinaDaily和国务院项目,没有抽出时间来写简书,现在终于算是告一段落了,抽出时间来更一篇 实现:主要是重写父类的几个涉及布局属性的方法,在对应的布局属性方法中根据需求自定义视图布局属性信息...下面是WSLWaterFlowLayout.h中的属性方法和代理方法,含义注释的还算清晰: typedef enum { WSLVerticalWaterFlow = 0, /** 竖向瀑布流...、头脚视图的大小、行列数以及间距都可以在对应样式的代理方法中自定义,然后设置为UICollectionView的自动流水布局样式,并结合UICollectionView的用法使用,详情看示例 WSLWaterFlowLayout

    1.6K80

    iOS 瀑布流封装

    瀑布流.gif 功能描述:WSLWaterFlowLayout 是在继承于UICollectionViewLayout的基础上封装的带头脚视图的瀑布流控件。...目前支持竖向瀑布流(item等宽不等高、支持头脚视图)、水平瀑布流(item等高不等宽 不支持头脚视图)、竖向瀑布流( item等高不等宽、支持头脚视图)三种样式的瀑布流布局。...前言 :近几个月一直在忙公司的ChinaDaily和国务院项目,没有抽出时间来写简书,现在终于算是告一段落了,抽出时间来更一篇 实现:主要是重写父类的几个涉及布局属性的方法,在对应的布局属性方法中根据需求自定义视图布局属性信息...下面是WSLWaterFlowLayout.h中的属性方法和代理方法,含义注释的还算清晰: typedef enum { WSLVerticalWaterFlow = 0, /** 竖向瀑布流...、头脚视图的大小、行列数以及间距都可以在对应样式的代理方法中自定义,然后设置为UICollectionView的自动流水布局样式,并结合UICollectionView的用法使用,详情看示例 WSLWaterFlowLayout

    2K80

    图片瀑布流,so easy!

    什么是图片瀑布流 用一张花瓣网页的图片布局可以很清楚看出图片瀑布流的样子: ?...简单来说,就是有很多图片平铺在页面上,每张图片的宽度相同,但是高度不同,这样错落有致的排列出 n 列的样子很像瀑布,于是就有了瀑布流图片一说。...实现原理 1、第一种方式 第一种方式前提是:图片的宽度固定,但是列可变(根据屏幕大小) 通过上面的介绍,我们知道要实现瀑布流的前提是宽度一致(假如为100px),高度可以不相同。...我们首先确定排布的列数(假如为4列),那么第一行只能放4张图片,然后将每个图片的高度放入一个数组中(假如为 heightArr = [100,50, 200,30]),当我们在放入下一张图片的时候就要判断这个数组中哪个高度是最小的...然后遍历图片,将图片放入容器高度最小的容器中即可。 这里我们使用js来添加图片,而不是事先写好在html中了。 实现代码 <!

    1.6K10

    原生javascript 实现瀑布流

    前言 刚用 jquery 实现了瀑布流效果。但是其实现方法,我并不满意,所以我还在思考,如何更加简单明了的实现瀑布流效果。...让我们抛开 jquery,忘掉各种高级方法,用最原始的方法去实现 瀑布流效果。...javascript版本的瀑布流 代码原理已经写在注释里了。不再重复 /* 瀑布流原生 javascript 实现方法 之前已经用 jquery 方法已经实现了瀑布流。...(_obj,"li"); // 瀑布流函数 function WaterFall(){ var _blank = 20, // 瀑布流间距...但是,在原生JS中,我用默认最小值为无穷大,var _minH = +Infinity 然后拿数组中的数字来和这个无穷大进行对比,如果这个数字比无穷大小,则将_minH赋值为当前数组的值,然后再拿下一个数组中的数字来进行对比

    1.4K20
    领券