整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

CSS3- 像小红书按行加载数据的瀑布流终于有方案了

CSS3: 像小红书按行加载数据的瀑布流终于有方案了!

么是瀑布流

瀑布流布局就像在游乐园里排队玩水滑梯一样有趣!想象一下,你站在一个高高的平台上,眼前是一排排的水滑道,每个滑道的终点都是个小水池。你站在起点,一溜烟地往下滑,速度飞快!你的朋友们也在旁边的滑道上滑来滑去,好不热闹。

瀑布流布局如此有趣,因为它不像传统的布局一样一行行地摆放元素,而是像水滑梯一样,元素从上到下、从左到右地排列。每个元素的大小不一,就像人们身材各异,有的高,有的矮,有的胖,有的瘦。它们像水滑道上的人一样紧紧挨着,在空间里形成了一个有趣的错落有致的景象。

想象一下,你站在最高的滑道上,你是那个最炫酷的元素,所有的目光都聚集在你身上。你自豪地往下滑,经过每个滑道上的人们,他们惊叹你的高度,赞叹你的美丽。你顺利地滑到终点,掀起一片水花,大家都为你鼓掌欢呼!

瀑布流布局就是这样有趣又引人注目,每个元素都有机会在舞台上展示自己的风采。它让我们的网页看起来活力十足,像一场欢乐的游乐园冒险!

小红书上的瀑布流布局

就是这样,每个商品就像超市里的货架,展示着各种各样的内容。你可以往下滑动页面,看到一个美食的推荐,继续滑动又遇到了一篇旅行攻略,再往下滑就是一篇关于时尚的文章。这些内容就像超市里的商品,你可以随心所欲地浏览,发现自己感兴趣的东西,积极互动,获取灵感

你以为的这样

哈哈,虽然不是这样,但却有共同的特性

从图中可以看出它的特性,

从布局角度来看,瀑布流布局更类似网格布局中自动放置网格项目的布局,但又没有严格遵循该布局模式。

最著名的瀑布流布当属 Pinterest,比如他的搜索结果页面的布局效果:

我们来看个例子

<div class="masonry--container">
   <div class="item">
       <img src="https://picsum.photos/1024/860?random=1" alt="">
       <h3>Blog Post</h3>
       <p>Lorem ipsum dolor si...</p>
   </div>
   <!-- 省略其他 item -->
</div>
@layer layout {
  .masonry--container {
      column-count: 4;
      column-gap: 1rem;
  }
}



在上面的例子中,你会看到整个布局看起来像瀑布流布局。然而,项目(卡片)的顺序沿着列运行。也就是说,使用多列布局来实现瀑布流布局和真正的瀑布流布局之间有着关键性的区别:“在多列布局中,项目(卡片)是按列显示的,通常在瀑布流布局中,希望项目(卡片)是按行显示”。

借网上的一个图:

因此,多列布局实现的“瀑布流布局”有可能无法满足我们实际的业务需求。例如,Pinterest 网站的搜索结果页,期望搜索出来的结果总是排列在前面,比如说页面最顶部就能看到搜索的结果,而不是像多列布局实现的效果那样,排在前面的都在第一列。

而且加载更多的时候,我们是希望按行加载的,而不是重新按多列排。

调研

目前单用css还是无法实现真正的瀑布流布局, 即便使用CSS 网格布局中自动放置网格项目的特性(即 grid-auto-flow: dense),也会有诸多问题。

只能通过js来弥补这个上面提到的缺陷 当使用JavaScript来实现按行加载的瀑布流时,可以结合使用DOM操作和CSS样式来达到效果。以下是一个简单的JavaScript方案:

首先,创建一个包含瀑布流元素的容器,并为每个元素添加一个自定义的类名,例如".item"。

<div class="container">
<div class="item">瀑布流元素1</div>
<div class="item">瀑布流元素2</div>
...
</div>

接下来,使用JavaScript来控制瀑布流的加载和排序。

window.addEventListener("load", function() {
// 获取容器和瀑布流元素
const container=document.querySelector(".container");
const items=document.querySelectorAll(".item");
  
// 记录每一行的高度
let rowHeights=[];
  
// 遍历瀑布流元素,计算每一行的高度并进行排序
items.forEach(function(item) {
// 将元素添加到容器中
container.appendChild(item);
  
// 获取元素的高度
const itemHeight=item.offsetHeight;
  
// 检查当前行是否有足够的空间容纳元素
const rowIndex=rowHeights.findIndex(function(rowHeight) {
return rowHeight + itemHeight <=container.offsetHeight;
});
  
if (rowIndex !==-1) {
// 如果有足够的空间,将元素添加到对应行中
item.style.order=rowIndex;
rowHeights[rowIndex] +=itemHeight;
} else {
// 如果没有足够的空间,创建新行并添加元素
const newRow=document.createElement("div");
newRow.classList.add("row");
newRow.appendChild(item);
container.appendChild(newRow);
rowHeights.push(itemHeight);
}
});
});

在这个JavaScript方案中,我们使用offsetHeight属性获取到每个瀑布流元素的高度,并根据容器的高度动态计算每一行的高度。然后,通过设置元素的order属性来实现按行排序的效果。

记得在CSS中设置.row类的样式,以便美化新创建的行。

.row {
display: flex;
}

以上的JavaScript方案会在页面加载完成后自动按行加载和排序瀑布流元素


作者:糖墨夕
链接:https://juejin.cn/post/7340909611098079273

生JavaScript实现一个瀑布流布局

瀑布流布局概念

瀑布流,又称瀑布流式布局。是比较流行的一种网站页面布局,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部。最早采用此布局的网站是Pinterest,逐渐在国内流行开来。国内大多数清新站基本为这类风格。

瀑布流布局特点

  1. 琳琅满目:整版以图片为主,大小不一的图片按照一定的规律排列。

  2. 唯美:图片的风格以唯美的图片为主。

  3. 操作简单:在浏览网站的时候只需要轻轻滑动一下鼠标滚轮,一切的美妙的图片精彩便可呈现在你面前。

代码实现

源代码地址:https://github.com/microzz/waterfall-js

效果预览

在线预览地址1: http://microzz.cn/waterfall/

在线预览地址2: https://microzz.github.io/waterfall-js/

瀑布流布局优缺点

布局优点

  1. 有效的降低了界面复杂度,节省了空间:我们不再需要臃肿复杂的页码导航链接或按钮了。

  2. 对触屏设备来说,交互方式更符合直觉:在移动应用的交互环境当中,通过向上滑动进行滚屏的操作已经成为最基本的用户习惯,而且所需要的操作精准程度远远低于点击链接或按钮。

  3. 更高的参与度:以上两点所带来的交互便捷性可以使用户将注意力更多的集中在内容而不是操作上,从而让他们更乐于沉浸在探索与浏览当中。

    布局缺点

  4. 有限的用例:

    无限滚动的方式只适用于某些特定类型产品当中一部分特定类型的内容。

    例如,在电商网站当中,用户时常需要在商品列表与详情页面之间切换,这种情况下,传统的、带有页码导航的方式可以帮助用户更稳妥和准确的回到某个特定的列表页面当中。

  5. 额外的复杂度:

    那些用来打造无限滚动的JS库虽然都自称很容易使用,但你总会需要在自己的产品中进行不同程度的定制化处理,以满足你们自己的需求;另外这些JS库在浏览器和设备兼容性等方面的表现也参差不齐,你必须做好充分的测试与调整工作。

  6. 再见了,页脚:

    如果使用了比较典型的无限滚动加载模式,这就意味着你可以和页脚说拜拜了。

    最好考虑一下页脚对于你的网站,特别是用户的重要性;如果其中确实有比较重要的内容或链接,那么最好换一种更传统和稳妥的方式。

    千万不要耍弄你的用户,当他们一次次的浏览到页面底部,看到页脚,却因为自动加载的内容突然出现而无论如何都无法点击页脚中的链接时,他们会变的越发愤怒。

  7. SEO:

    集中在一页当中动态加载数据,与一页一页的输出相比,究竟那种方式更利于SEO,这是你必须考虑的问题。对于某些以类型网站来说,在这方面进行冒险是很不划算的。

  8. 关于页面数量的印象:

    其实站在用户的角度来看,这一点并非负面;不过,如果对于你的网站来说,通过更多的内容页面展示更多的相关信息(包括广告)是很重要的策略,那么单页无限滚动的方式对你并不适用。

关于

GitHub:https://github.com/microzz

个人网站:https://microzz.com/

相关链接

CSS3实现一个瀑布流布局:https://microzz.com/2017/02/19/waterfallcss3/

jQuery实现一个瀑布流布局:https://microzz.com/2017/02/20/waterfalljq/

击查看瀑布特效

HTML5+javascript打造瀑布特效,canvas绘图!


实话说,这不像是一个瀑布,倒像是天上下石头,但是咱们写代码的,不要在意这些细节,重点是思路,逻辑,以及具体实现效果的方法。在布局方面,因为是用HTML5/canvas,所以只需要一个canvas画布即可,也就是一行代码:

<canvas id="canvas" width="400" height="500"></canvas>

CSS样式也只需要大概的设置下,代码量不多,这次的效果重点是javascript的代码,因为都是用的原生javascript,没有调用插件,看过我以前写的特效的朋友就知道,我一般都强调的就是基础的原生javascript的重要性,特别是现在各种插件以及框架流行,初学者一旦盲目的去学框架,而忽略原生javascript的话其实是很难找工作的,因为每个公司使用的插件以及框架都未必是一样的,也未必会一直使用。但是如果你原生javascript的基础很扎实,那么不管是什么框架或者插件,你都能在很短时间内掌握,使用,迅速创造价值,这也是很多公司喜欢的人才!万丈高楼平地起!不多说,直接上源码!

如果想要更多的企业求职加分项目,案例,学习方法可以来一下我的前端群570946165,每天都会精挑细选一个特效,项目出来详细讲解,分享!包括答疑解惑!


HTML5+javascript打造瀑布特效源码:

代码过长需要文档版源码来我的前端群570946165,已上传到群文件

头条号里有许多web前端学习视频/源码,企业常用特效/案例/项目,敬请关注!

这是哪?