滚动的魅力:如何实现大厂也在用的瀑布流布局

瀑布流

定义

在一些主流的一些软件当中我们常常可以看见这样的一种布局,内容区块(如图片或卡片)按列从上至下排列,当一个内容区块排满一列时,下一个内容区块会填补下一行最短的列,以此类推,形成一种类似瀑布般错落有致的效果,也就是瀑布流布局(Masonry Layout 或瀑布流式布局) 下图的手机淘宝和小红书网站上都采用了这种布局,源码放在文章的最后面。

好处

瀑布流布局的好处主要包括以下几点:

  1. 空间利用率高:瀑布流布局能够根据内容的大小自动填充不同的列,有效地利用页面空间,避免了传统网格布局可能出现的大面积空白。

  2. 视觉吸引力强:瀑布流的不对称分布使得页面看起来富有变化和层次感,给用户带来新颖且有趣味性的视觉体验,有利于提升用户的关注度和参与度。

  3. 沉浸式浏览:用户只需要上下滚动屏幕即可连续不断地查看内容,流畅的滚动体验增强了用户沉浸式阅读或浏览的感觉,有助于延长用户在页面上的停留时间。

  4. 触屏设备友好:对于智能手机和平板电脑等触屏设备,瀑布流布局符合用户滑动浏览的习惯,减少了翻页操作,提高了移动端的浏览效率。

  5. 动态加载与个性化推荐:瀑布流布局便于实现"无限滚动",即当用户滚动到底部时自动加载更多内容,同时可以根据用户行为数据进行个性化推荐,进一步提升用户体验。

  6. 内容多样性展示:对于包含不同尺寸或类型内容的页面,瀑布流布局能很好地适应这些差异,将各种内容有机地结合在一起展示。

实现

使用一个父容器container,图片容器img包裹要展示的图片;通过js获取父容器的DOM结构,之后再获取其子元素图片容器img然后将其按照瀑布流的规则使用绝对定位放置;使用一个heightArr高度数组,在放置的时候记录每一列图片的高度,图片应该放置在高度最低的那一列。

1. html,css部分

先将图片容器.img设置为固定宽度,并设置展示方式为行内块display:inline-block,并将其对齐方式设置为 顶部对齐vertical-align:top,因为行内块默认是底部对齐;

图片设置宽度为父容器的100%

将图片容器放在父容器中

此时的页面

按照一行一行排列但是之间还是有空隙因为我们此时还没使用js来控制元素的位置,瀑布流主要就是通过js来控制图片的位置实现的

2.js部分

js的逻辑需要等待页面元素加载完成之后不然,也获取不到元素的DOM结构。咱们把js部分的主要逻辑写在window.onLoad()中。window.onload() 是 JavaScript 中的一个内置函数,它会在整个页面(包括所有资源如图片、脚本文件、样式表等)加载完毕后执行。换句话说,当浏览器完成解析 HTML 文档,并加载完页面内所有外部资源后,才会触发 window.onload 事件

1. 获取父容器以及所有的图片容器

通过控制台,打印结果获取成功

2.获取当前一行应该放置多少张图片num=math.floor(父容器宽度/子容器)

3.开始放置

调用start函数,传入图片容器数组,一行最多放置图片最大数量

start函数的定义,使用一个for循环遍历所有图片容器,定义一个高度数组存储每列图片的高度

第一行的图片先不管,将高度存储到数组heightArr中,从第二行开始,使用Math.min.apply(null,heightArr)获取高度数组中最小的值min,并使用数组自带的.indexOf方法获取min的下标minIndex

对此时遍历到的图片设置绝对定位,top设置为高度数组中的最小值min,left设置为minIndex*imgW 这样就将图片放置在了上一行图片的高度最低的地方

最后再更新一下高度数组的min的值

最终效果

点击获取源码

本人目前在准备春招,也希望和一起准备春招的佬们互相交流一下,一起冲刺大厂,欢迎私信评论或加v:guanyiiu1314

相关推荐
阿伟来咯~36 分钟前
记录学习react的一些内容
javascript·学习·react.js
吕彬-前端42 分钟前
使用vite+react+ts+Ant Design开发后台管理项目(五)
前端·javascript·react.js
学前端的小朱44 分钟前
Redux的简介及其在React中的应用
前端·javascript·react.js·redux·store
guai_guai_guai1 小时前
uniapp
前端·javascript·vue.js·uni-app
也无晴也无风雨1 小时前
在JS中, 0 == [0] 吗
开发语言·javascript
bysking2 小时前
【前端-组件】定义行分组的表格表单实现-bysking
前端·react.js
独行soc2 小时前
#渗透测试#SRC漏洞挖掘#深入挖掘XSS漏洞02之测试流程
web安全·面试·渗透测试·xss·漏洞挖掘·1024程序员节
王哲晓2 小时前
第三十章 章节练习商品列表组件封装
前端·javascript·vue.js
fg_4112 小时前
无网络安装ionic和运行
前端·npm
理想不理想v2 小时前
‌Vue 3相比Vue 2的主要改进‌?
前端·javascript·vue.js·面试