前端自适应瀑布流布局

news2024/12/29 9:33:05

JS案例·自适应瀑布流

🌟效果预览

🌟什么是瀑布流

🌟制作思路

🌟具体实现 

页面结构

js代码实现

🌟写在最后 


🌟效果预览

前端自适应瀑布流效果预览

🌟什么是瀑布流

瀑布流,又称瀑布流式布局。是比较流行的一种网站页面布局,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部。

🌟制作思路

首先第一步,我们仔细观察上面的瀑布流图片,你会发现他们都是定宽不定高的。既然定宽,那么一共显示几列,我们也就能够计算出来。如下图所示:

列数出来之后,我们拿一个数组来保存一行的高度。什么意思?看下图:我们按照 4 列来算,一开始一张图片都没有放,每一列的高度都为 0,所以数组里面是 4 个 0

接下来放入第一张图片,找数组里面最小的,目前都是 0,就放在第一列,放完之后需要更新数组里面的最小值 

 然后依此类推,找数组最小的,会找到第二个 0,往第二列放入图片,更新数组,找到第三个 0,往第三列放入图片,更新数组...

目前第一行满了,该放在第二行了,但是放在第二行的第几列呢?实际上和上面的算法是一样的,找数组的最小值即可,哪个最小就放在哪一列,放完之后更新数组

新的高度的计算公式:

这一列新的高度 = 这一列高度(数组里面存储的有) + 间隙 + 新的图片高度

然而这只是计算了 top 值,还有 left 值我们需要计算。每张图片的 left 值只和该图片所在的列有关。

🌟具体实现 

页面结构

HTML和CSS都非常简单

js代码实现

创建图片,添加到容器,我这里的图片是从本地文件中获取

接下来就是根据上面的思路来设置每一张图片位置,在设置前,我们要先获取当前浏览器可展示的列数:

因为每一张图要加在高度数组的最小一列,另外因为图片是绝对定位,脱离了标准流,所以无法撑开盒子的高度,容器高度需要我们手动撑开,就需要计算高度,如下计算最大最小值:(有多种获取方式)

最后就可以来设置每一张图片的位置 

 最后我们需要使用 window.onresize来监听浏览器窗口变化,但是这里需要注意做一下防抖,如下

let timeId = null; // 一个计时器的 id

function bindEvent(){

    window.onresize = function(){

        // 该事件会在窗体大小发生改变的时候触发

        // 触发该事件,我们就需要重新对图片进行排列

        if(timeId){

            clearTimeout(timeId)

        }

        timeId = setTimeout(function(){

            setPositions();

        }, 500);

    }

}

🌟写在最后 

完整源码及图片素材免费下载地址:点击免费下载

本专栏将持续更新原生JS案例,提供一些工作中也能用上的一些小案例,详细讲解分析,提升JS开发水平与开发思路的积累,如果文中出现有瑕疵的地方各位通过评论或者私信联系我,我们一起进步,有兴趣的伙伴可以订阅一下:点击关注JS经典案例专栏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1005727.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

prize_p1

文章目录 解题过程代码审计思路问题解决数组绕过preg_match__destruct的触发修改phar文件以及签名phar://支持的后缀 题解方法一&#xff08;数组绕过&#xff09;方法二&#xff08;gzip绕过&#xff09; 解题过程 源代码 <META http-equiv"Content-Type" conte…

3D人体生成名人堂

一、马普所认知系统实验室。 Perceiving Systems - Max Planck Institute for Intelligent SystemsUsing computer vision, computer graphics, and machine learning, we teach computers to see people and understand their behavior in complex 3D scenes. We are located…

《Prometheus 监控实践:从零到英雄》

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f405;&#x1f43e;猫头虎建议程序员必备技术栈一览表&#x1f4d6;&#xff1a; &#x1f6e0;️ 全栈技术 Full Stack: &#x1f4da…

【服务器 | 宝塔】宝塔面板卸载重装教程:清理删除宝塔面板并重新开始

宝塔面板卸载重装怎么操作?我们很多用户可能安装宝塔之后会经常看一下有没有新版本&#xff0c;如果有新版直接右上角 宝塔面板卸载重装怎么操作?我们很多用户可能安装宝塔之后会经常看一下有没有新版本&#xff0c;如果有新版直接右上角”更新”升级一下版本就可以了&#…

1-4 AUTOSAR方法论

总目录——AUTOSAR入门详解AUTOSAR入门详解目录汇总&#xff1a;待续中。。。https://xianfan.blog.csdn.net/article/details/132818463 目录 一、前言 二、方法论 三、单个ECU开发流程 一、前言 汽车生产供应链上有以下角色&#xff1a;OEM、TIER1、TIER2&#xff0c;其主…

提示msvcr120.dll丢失怎样修复呢?全面分析msvcr120.dll解决方法

在计算机使用过程中&#xff0c;可能会遇到 msvcr120.dll 丢失的问题。msvcr120.dll 是 Microsoft Visual C Redistributable 的一部分&#xff0c;是一个动态链接库文件&#xff08;DLL&#xff09;&#xff0c;用于支持运行在 Windows 操作系统上使用了 Microsoft Visual C 2…

9.12|day 5|day 44 |完全背包| 518. 零钱兑换 II | 377. 组合总和 Ⅳ

● 完全背包 主要是看清01背包和完全背包的区别 //01背包 for(int i 0;i<weight.size();i){ for(int j bagWeight;j>weight[i];j--){dp[j] Math.max(dp[j],dp[j-weight[i]]value[i]); } } //完全背包 for(int i 0;i<weight.size();i){for(int j weight[i];j<…

数据结构——排序算法——冒泡排序

冒泡排序1 void swap(vector<int> arr, int i, int j) {int temp arr[i];arr[i] arr[j];arr[j] temp;}void bubbleSort1(vector<int> arr) {for (int i 0; i < arr.size() - 1; i){for (int j 0; j < arr.size() - 1 - i; j){if (arr[j] > arr[j 1…

c++ 学习 之 常函数 和 常对象

前言 常函数 成员函数后加 const 我们可以称这个函数为 常函数 常函数内不可以修改成员属性 成员属性声明时加关键字 mutable 后&#xff0c;在常函数中依然可以修改 常对象 常对象 声明对象前加 const 称该对象为常对象 常对象只能调用常函数 正文 常函数 class Person…

《深入分布式追踪:OpenTracing 实践手册》

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f405;&#x1f43e;猫头虎建议程序员必备技术栈一览表&#x1f4d6;&#xff1a; &#x1f6e0;️ 全栈技术 Full Stack: &#x1f4da…

【面试题精讲】你知道MySQL中有哪些隔离级别吗

uuid: 7ae741a0-517a-11ee-93e3-6f2b73edb0c7 title: 【面试题精讲】你知道MySQL中有哪些隔离级别吗 tags: [MySQL, 隔离级别, 脏读, 幻读, 不可重复读] categories: [技术文章, 后端技术, 系列文章, 面试题精讲] abbrlink: 14595062 date: 2023-09-12 22:41:38 有时博客内容会…

Linux CentOS7修改命令行提示符

在CentOS操作系统中&#xff0c;命令和文件是我们与计算机进行交互的重要方式之一。有时候我们可能需要对某些命令、变量或文件进行修改&#xff0c;以满足特定的需求或提高工作效率。 本人在文章《Linux CentOS7命令及命令行》中对命令行提示符的修改作了初步介绍&#xff0c…

抖音中文点选验证码识别方案

最近研究了一下抖音中文点选验证码的识别&#xff0c;居然正确率高达98%。 首先我们来看一下效果 一、识别方法 1、数据集准备 我们需要借助爬虫去下载大量的验证码图片。这些有两种图片&#xff0c;一种是小图&#xff0c;包含需要点选的中文和顺序&#xff0c;还有一种是大…

记录一次部署Hugo主题lotusdocs到Github Pages实践

引言 随着开源项目的越来越复杂&#xff0c;项目文档的重要性日渐突出。一个好的项目要有一个清晰明了的文档来帮助大家使用。最近一直有在找寻一个简洁明了的文档主题来放置项目的各种相关文档。最终找到这次的主角&#xff1a;Lotus Docs 基于Hugo的主题。Lotus Docs的样子&…

【LeetCode题目详解】第九章 动态规划part16 583. 两个字符串的删除操作 ● 72. 编辑距离 ● 编辑距离总结篇 (day56补)

本文章代码以c为例&#xff01; 本文章转自代码随想录 一、力扣第583题&#xff1a;两个字符串的删除操作 题目&#xff1a; 给定两个单词 word1 和 word2 &#xff0c;返回使得 word1 和 word2 相同所需的最小步数。 每步 可以删除任意一个字符串中的一个字符。 示例 1…

[Qt]窗口

文章摘于 爱编程的大丙 文章目录 1. 基础窗口类1.1 QWidget1.1.1 设置父对象1.1.2 窗口位置1.1.3 窗口尺寸1.1.4 窗口标题和图标1.1.5 信号1.1.6 槽函数 1.2 QDialog1.2.1 常用API1.2.2 常用使用方法 1.3 QDialog的子类1.3.1 QMessageBox1.3.1.1 API - 静态函数1.3.1.2 测试代码…

第10章_freeRTOS入门与工程实践之同步互斥与通信

本教程基于韦东山百问网出的 DShanMCU-F103开发板 进行编写&#xff0c;需要的同学可以在这里获取&#xff1a; https://item.taobao.com/item.htm?id724601559592 配套资料获取&#xff1a;https://rtos.100ask.net/zh/freeRTOS/DShanMCU-F103 freeRTOS系列教程之freeRTOS入…

HBASE知识点

HBASE是什么&#xff1f; 高可靠、高性能、面向列、可伸缩、实时读写的分布式数据库。利用HDFS作为其文件存储系统&#xff0c;利用MapReduce来处理HBase中的海量数据。利用Zookeeper作为其分布式协同服务。用于存储非结构化和半结构化的松散数据。 HBase数据模型 RowKey: 唯…

makefile的编写:由浅入深

文章目录 准备文件Makefile版本一Makefile版本二Makefile版本三Makefile版本四Makefile版本五 准备文件 // fun1.c #include <stdio.h> void fun1() {printf("this is fun1\n"); }// fun2.c #include <stdio.h> void fun2() {printf("this is fun2…

Java面试常用函数

1. charAt() 方法用于返回字符串指定索引处的字符。索引范围为从 0 到 length() - 1。 map.getOrDefault(num, 0) :如果map存在num这个key&#xff0c;则返回num对应的value&#xff0c;否则返回0. Arrays.sort(nums); 数组排序 Arrays.asList("a","b",&q…