`

简单瀑布流的实现(服务器不给出图片高度版)

 
阅读更多

额,这篇文章是从迅雷CUED博客 转过来的,虽然那篇也是我写的,国际惯例给个链接吧……

先上Demo

瀑布流排序 : http://cued.xunlei.com/demos/publ/demo1.html

瀑布流+无限拖  http://cued.xunlei.com/demos/publ/demo2.html

瀑布流+无限拖 (js获取图片高度版)  http://cued.xunlei.com/demos/publ/demo3.html

随着pinterest的走红,瀑布流式的布局被越来越多的网站所使用,这种布局确实有很多好处,图片列表页有很强大的视觉感染力,而且还提高了用 户“发现好图”的效率。瀑布流的实现有很多种方式,之前淘宝UED有篇文章详细的介绍过各种方式的优劣。今天我们主要讨论一下绝对排序来实现瀑布流的方式 即 Pinterest 采用的方式。

首先说下瀑布流的排序算法,参考demo1 ,思路非常简单,我们把瀑布流拆成三个部分来看:容器、列、格子

1.先计算当前屏幕最多能容纳几列瀑布,其值为 “向下取整(屏幕可见区域宽度/(格子宽度+间距))”;

2.为了保证容器的居中,将容器的宽度设置为 列数* (格子宽度+间距) – 间距,这里需要注意的是 当容器的宽度计算出来之后再显示,否则会造成页面宽度的抖动,影响体验。;

3.排序开始,先把前N(N为列数)个格子分别放到每一列中,然后每次寻找高度最小的一列,把格子放进去(left值为列序号*(格子宽度+间距),top值为 列高+间距),并刷新列的高度,遍历所有格子直到所有的格子都被排序。
最后将事件句柄绑定到window.onload和window.onresize上,一个瀑布流布局的页面就出来了。

 

 

这样的排序算法看起来很美好,可真正结合异步加载数据应用到页面里还要解决以下几个问题

1.当缩放浏览器窗口时会不断地触发事件,如果每次都响应的话会狂耗性能,需要在缩放动作结束后再执行重排方法。

2.页面滚动到底部请求数据成功之后只对新增的节点重排。

3.如果服务器无法给出图片高度,需要在图片加载完毕之后再进行重排。

 

第一个问题我是用setTimeout和clearTimeout来解决的,思路是窗口变化之后开始计时,如果窗口还在变换则从新开始计时,窗口不再变化则延时(很短的时间)触发重排事件。暂时只想到这个,这里应该还有更好的方法。
代码如下

var re;
window.onresize = function() {
    clearTimeout(re);
    re = setTimeout(resize,100);
};

 

第二个问题在于如果每次有新的数据加载,都要对整个容器内的节点进行重排,非常消耗性能。解决思路:

1.将列保存在全局数组中,每次重排或者新增格子之后更新数组的数据,这样下次执行排序算法的时候可以直接调用。
2.将新增格子保存在数组中作为参数传递给排序算法,仅对新格子进行遍历和操作。

第三个问题是如果服务器无法给出图片尺寸,那么必须在图片完全加载完毕之后才可进行排序(因为高度是实时获取的,图片不全高度有误差),这里没有什 么好办法,只能遍历图片,每张图片加载成功后执行一个回调函数,将加载成功的图片数量+1,当加载成功的图片数量等于图片总数的时候执行排序方法。缺点是 有一张图片加载不成功就无法看到所有的,真正项目中还是需要在异步加载数据的时候获取图片尺寸。

好了,以上就是在这次瀑布流实现过程中遇到的问题和解决方法,由一开始加载3-4屏就卡死到现在可以无限加载(ff,chrome),深感优化js的必要性和无限性。一点小心得写在这里权当抛砖引玉,大家对瀑布流实现的优化有什么见解欢迎一起交流讨论。

分享到:
评论

相关推荐

    js简单瀑布流图片无限加载带鼠标悬停图片遮罩效果

    1. 计算元素大小:根据不同的屏幕尺寸和图片宽高比,计算出合适的元素宽度和高度。 2. 布局计算:当新图片加载时,调整瀑布流布局,确保元素能正确地排列在合适的位置。 3. 事件监听:监听滚动事件,当滚动到底部时...

    瀑布流实现

    瀑布流布局,也被称为Masonry布局,是一种常用于图片展示或商品列表的网页设计样式,它的特点是每一列的高度不固定,新元素会自动填充到最短的列下方,形成一种像瀑布一样流淌的效果。这种布局在社交媒体、电商网站...

    特效源码瀑布流demo

    这种布局方式的特点是元素(如图片)会像瀑布一样垂直排列,每列的高度不固定,新行的起始位置会根据上一行元素的结束位置进行对齐,从而形成一种错落有致的效果。在前端开发中,实现瀑布流布局通常需要借助...

    JS实现瀑布流布局

    JS实现瀑布流布局是前端开发中常见的页面布局技术,它能够让页面上的元素像瀑布一样,沿着垂直方向流动展示,且每列高度不一。这种布局特别适合用于图片展示、产品展示等场景,因为它能有效地利用垂直空间,给用户...

    横向排序的瀑布流jquery实现,完整项目

    在这个瀑布流实现中,jQuery被用来监听滚动事件、计算元素位置、调整布局以及实现动态加载。开发者可能使用了`$(window).scroll()`函数来检测用户的滚动行为,并在用户接近页面底部时加载更多内容,以实现无限滚动的...

    瀑布流的实现

    在“puBuliu”这个项目中,虽然没有详细代码,我们可以推测这是一个简单的瀑布流实现,适合初学者学习和实践。通过理解和应用以上技术点,开发者可以创建出类似蘑菇街那样具有动态加载和瀑布流布局的网页应用。

    瀑布图片waterfall----简单案例 .Net

    在.Net框架中,实现瀑布流布局可以通过多种技术来完成,包括但不限于HTML、CSS、JavaScript以及可能的服务器端编程。这份"waterfall----简单案例 .Net"压缩包文件很可能包含了一个示例项目,用于演示如何在.Net环境...

    php+pubuliu瀑布流

    Pubu Liu是用于实现瀑布流效果的一个JavaScript库,它提供了一种简单的方法来创建动态加载的瀑布流布局。在前端,开发者需要将PHP返回的数据解析,并通过Pubu Liu库对这些元素进行渲染和布局。这个库通常会监听滚动...

    jquery简单的瀑布流布局点击无限加载效果代码

    瀑布流布局是一种常见的网页设计模式,它以一种不规则的方式排列元素,通常用于展示图片或内容,使得页面在视觉上更具吸引力。在这种布局中,每一列的高度会自适应,使得内容像瀑布一样逐个流下。jQuery是一个轻量级...

    Android瀑布流实现,类似于蘑菇街和迷尚 应用里的排列.zip

    3. **StaggeredGridLayoutManager**:Android SDK内置的`StaggeredGridLayoutManager`用于创建不规则网格,即每个子项的高度可能不同,这为实现瀑布流提供了基础。我们可以直接使用这个布局管理器,并通过调整列数来...

    css+jQuery实现瀑布流

    瀑布流布局,也被称为Masonry布局,是一种网页布局方式,常用于图片展示或者商品陈列,其特点是每一列的顶部对齐,而每一列的高度则根据内容动态调整,形成一种自适应且错落有致的效果。在Web开发中,通常会结合CSS...

    简单的瀑布流网站代码

    瀑布流布局,也被称为Masonry布局,是一种常用于图片展示的网页设计模式,因其效果像瀑布一样逐级下落而得名。这种布局方式最早由Pinterest引领流行,后来被蘑菇街、美丽说等电商网站广泛采用,使得用户在浏览图片时...

    一款简单jquery瀑布流无限加载图片特效.zip

    瀑布流布局是一种常见的网页设计样式,它以一种不规则的方式排列元素,通常用于展示图片或商品,使得页面看起来像水流一样自然下落。在这款"简单jquery瀑布流无限加载图片特效.zip"中,我们将深入探讨如何利用jQuery...

    微信小程序瀑布流waterfall简单的实现方法

    总之,微信小程序的瀑布流实现并不复杂,主要涉及动态计算和布局调整。理解这一过程可以帮助你在开发过程中节省时间和精力,同时为用户提供流畅的视觉体验。通过不断学习和实践,你将能更熟练地运用这一技术,打造...

    瀑布流(加载更多)完整demo

    瀑布流布局,也被称为Masonry布局,是一种常用于图片展示或商品列表的网页设计模式,它的特点是每一列的顶部对齐,而每行的长度不一,形成类似瀑布的效果。这种布局方式最早由Pinterest网站引入并流行起来,因为它...

    瀑布流式页面布局源码--(AJAX与静态两种实例)

    通过CSS3的`column-count`或`column-gap`属性,可以在静态页面中实现简单的瀑布流效果。 2. **JavaScript计算**:为了实现更动态的效果,我们通常会用到JavaScript或者jQuery。在页面加载或滚动事件触发时,计算...

    ios 瀑布流的应用。

    7. 垂直滚动指示器:由于瀑布流布局的高度不确定,我们还需要确保滚动条正确显示当前的滚动位置。 8. 空白填充:在内容不足一整列时,需要添加空白占位符,以保持布局的美观和平衡。 在给定的压缩包文件中,你可能...

    jQuery响应式横向瀑布流图片布局代码.zip

    这段代码可能会使用jQuery的`.each()`方法遍历所有的图片元素,然后通过计算元素的宽度和高度,以及它们在容器中的位置,来调整每个图片的位置,从而实现瀑布流效果。为了实现响应式,代码可能还包含了对窗口大小...

    jQuery底部自动填充瀑布流代码.zip

    瀑布流布局,又称Masonry布局,是一种常见的网页布局方式,尤其在图片展示、商品列表等场景下广泛应用。这种布局的特点是每一列的顶部对齐,而每一列的高度根据其内容自适应,形成一种类似瀑布倾泻的效果。在...

Global site tag (gtag.js) - Google Analytics