关于瀑布流的算法(转淘宝ued)

本文详细探讨了三种实现多列布局的方法:多列浮动、CSS3技术和绝对定位。通过KISSY.Waterfall实例,深入讲解了每种方法的优点、缺点及适用场景,特别是对于动态加载内容的支持。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 多列浮动

各列固定宽度,并且左浮动;

一列中的数据块为一组,列中的每个数据块依次排列即可;

更多数据加载时,需要分别插入到不同的列上;

优点:

布局简单,应该说没啥特别的难点;

不用明确知道数据块高度,当数据块中有图片时,就不需要指定图片高度。

缺点:

列数固定,扩展不易,当浏览器窗口大小变化时,只能固定的x列,如果要添加一列,很难调整数据块的排列;

滚动加载更多数据时,还要指定插入到第几列中,还是不方便。

2 CSS3 

指定容器的列个数,列间距,列中间边框,列宽度来实现

 1 #container {
 2         -webkit-column-count: 5;
 3         /*-webkit-column-gap: 10px;
 4         -webkit-column-rule: 5px solid #333;
 5         -webkit-column-width: 210px;*/
 6 
 7         -moz-column-count: 5;
 8         /*-moz-column-gap: 20px;
 9         -moz-column-rule: 5px solid #333;
10         -moz-column-width: 210px;*/
11 
12         column-count: 5;
13         /*column-gap: 10px;
14         column-rule: 5px solid #333;
15         column-width: 210px;*/
16     }

column-count 为列数; column-gap 为每列间隔距离; column-rule 为间隔边线大小; column-width 为每列宽度; 当只设置 column-width 时,浏览器窗口小于一列宽度时,列中内容自动隐藏; 当只设置 column-count 时,平均计算每列宽度,列内内容超出则隐藏; 都设了 column-count 和column-width,浏览器会根据 count 计算宽度和 width 比较,取大的那个值作为每列宽度,然后当窗口缩小时,width 的值为每列最小宽度。

优点:

直接 CSS 定义,最方便了;

扩展方便,直接往容器里添加内容即可。

缺点:

  • 只有高级浏览器中才能使用;
  • 还有一个缺点,他的数据块排列是从上到下排列到一定高度后,再把剩余元素依次添加到下一列,这个本质上就不一样了;
  • 鉴于这两个主要缺点,注定了该方法只能局限于高端浏览器,而且,更适合于文字多栏排列。

3) 绝对定位。示例:KISSY.Waterfall
优点:

方便添加数据内容,窗口变化,列数/数据块都会自动调整;

缺点:

需要实现知道数据块高度,如果其中包含图片,需要知道图片高度;

JS 动态计算数据块位置,当窗口缩放频繁,可能会狂耗性能。

实现思路

KISSY 的 Waterfall 组件主要包含两个部分,一个是对现有数据块进行排列计算各自所在的位置; 二是下拉滚动时,触发加载数据操作,并把数据添加到目标容器中。

1) 数据块排列算法:

  • 初始化时,对容器中已有数据块元素进行第一次计算,需要用户给定: a,容器元素 — 以此获取容器总宽度; b,列宽度; c,最小列数; 最终列数取的是容器宽度/列宽度和最小列数的最大值,这样保证了,当窗口很小时,仍然出现最小列数的数据;
  • 获得列数后,需要保存每个列的当前高度,这样在添加每个数据块时,才知道起始高度是多少;
  • 依次取容器中的所有数据块,先寻找当前高度最小的某列,之后根据列序号,确定数据块的left,top值,left 为所在列的序号乘以列宽,top 为所在列的当前高度,最后更新所在列的当前高度加上这个数据块元素的高度,至此,插入一个元素结束;
  • 当所有元素插入完毕后,调整容器的高度为各列最大的高度值,结束依次调整;
  • 性能效率上的注意点:a,如果当前正在调整中,又触发了 resize 事件,需要将上次调整暂停后执行这次调整(见 timedChunk 函数); b,resize 触发会很频繁,可以将回调函数缓存一段时候后执行,即当这段时间内多次触发了resize事件,但回调函数只会执行一次(见 S.buffer 函数)

2) 异步加载数据

前面讲的是如何对容器中已有元素进行排列,但很多情况下,还需要不断加载新数据块,为此专门设计了一个独立的模块 KISSY.Waterfall.Loader,其实这个功能就更简单了,仅包含两个步骤:

    • 绑定滚动事件,并确定预加载线高度值,即滚动到哪个高度后,需要去加载数据,其实这个就是列的最小高度值,这样当前滚动值和最小高度值比较一下即可判断出来,是否要触发加载数据;
    • 加载数据,为了不对数据源做太多限制,完全由使用者自己决定数据源从哪边获取和其格式,这样更好的方便用户使用。为此,该组件只提供一个load(success,end) 接口,怎样load 由用户自己去定义,而其中的 success/end,分别给出如何添加新数据(suceess 即同 addItems)/如何停止加载的接口。这样真是太方便了~~

转载于:https://www.cnblogs.com/guoyongfeng/p/3906535.html

33号铺是使用codeigniter和淘宝API制作的淘宝瀑布系统 33号铺的设计理念是,做一个体验最好的导购系统。 相信PGC(Professional Generated Content),而不是蘑菇街那样的UGC。但不排除加入投票系统。 相信人工的推荐,而不是机器采集。机器采集的垃圾站我见过很多,大部分是根据taobao API批量拉取数据,这个功能很好做,但是我不希望做自动采集的站点,这对用户是没有好处的。所以33号铺的优化目标是尽量优化人工采集的程,后台也好,书签也好,url化也好。 重视用户体验,相信用户体验也可以卖钱。所以33号铺会不断优化站长和访客的体验。 下载 Clone代码到本地,git clone git://github.com/yuguo/33pu.git 或者下载最新的ZIP 安装 配置 application/config/config.php 为你的站点url,配置 application/config/site_info.php 中的站点名称、appkey、secret还有最重要的taobaoke pid。taobaoke pid不再作为参数传入,现在是以自己的开发账户为准,官方解释如下: 未来pid、nick入参将取消,程序会自动根据appkey对应的nick去查询pid。pid、nick入参将兼容支持到10月31日,请ISV做好改造工作,不要传入pid或nick。 首先自己在数据库中创建一个数据库(比如使用phpmyadmin之类的可视化工具 ),然后配置application/database 中的 username,password,database 访问 站点url/index.php/login/install ,输入管理员的email和密码 访问 站点url/index.php/login 登录 访问 站点url/index.php/admin/cat 新增你的站点的商品类别(类别会出现在首页tab中) 访问 站点url/index.php/admin/cat 修改类别slug为英文(中文url目前有bug,而且不优雅) 访问 站点url/index.php/admin ,选择类别之后搜索关键词,点击某个条目之后再选择图片,条目就会出现在首页(请选择类别之后再搜索关键词,这样条目会自动添加到该类别) 请修改 application/views/home.php 底部的统计代码为你自己的百度统计或者Google Analytics. 说明 后台搜索的时候的过滤条件在后台配置是,您可以自己修改配置application/models/m_taobaoapi.php: 佣金比5% - 50% 天猫商品 按卖家信用排序 每页80条 关于为什么要想到做这个系统的两篇文章:先做一半 利用淘宝API构建淘宝客自动发布系统 为了帮助更多人,希望你能保留底部的版权,声明站点是由33号铺构建,但这并不是必须的 系统架构 整站大部分代码是PHP,基于CodeIgniter构建,CodeIgniter是一个非常适合快速开发的PHP框架。 后台UI基于Bootstrap构建。 整站的JS都是基于jQuery构建。 数据来源于淘宝开放平台。 demo:33号铺 标签:33号铺
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值