- 浏览: 1466241 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
luhouxiang:
写的很不错,学习了
Extjs 模块化动态加载js实践 -
kingkongtown:
如果想改成淘宝后台那样,可以在编辑器批量上传图片呢?
kissy editor 阶段体会 -
317966578:
兄弟我最近也在整jquery和caja 开放一些接口。在git ...
caja 原理 : 前端 -
liuweihug:
Javascript引擎单线程机制及setTimeout执行原 ...
setTimeout ,xhr,event 线程问题 -
辽主临轩:
怎么能让浏览器不进入 文档模式的quirks模式,进入标准的
浏览器模式与文本模式
简介
如果你经常网上冲浪,这样参差不齐的多栏布局,是不是很眼熟啊?
类似的布局,似乎一夜之间出现在国内外大大小小的网站上,比如 Pinterest (貌似是最早使用这种布局的网站了),Mark之,蘑菇街,点点网,以及淘宝最新上线的“我要买” 等等,倒是很流行哈~ 在淘宝即将上线的众多产品中,你还会大量看到这样的形式呢。
这种布局适合于小数据块,每个数据块内容相近且没有侧重。通常,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部。所以,我们给这样的布局起了一个形象的名字 — 瀑布流式布局。
几种实现方式
随着越来越多设计师爱用这种布局,我们作为前端,要尽可能满足视觉/交互设计师的需求。所以,我们整理了下这种布局的几种实现方式,有三种:
1) 传统多列浮动。
即 蘑菇街和哇哦 采用的方式,如下图所示:
各列固定宽度,并且左浮动;
一列中的数据块为一组,列中的每个数据块依次排列即可;
更多数据加载时,需要分别插入到不同的列上;
线上例子。
优点:
布局简单,应该说没啥特别的难点;
不用明确知道数据块高度,当数据块中有图片时,就不需要指定图片高度。
缺点:
列数固定,扩展不易,当浏览器窗口大小变化时,只能固定的x列,如果要添加一列,很难调整数据块的排列;
滚动加载更多数据时,还要指定插入到第几列中,还是不方便。
2) CSS3 定义。
W3C 中有讲述关于多列布局的文档,排列出来的样子:
由 chrome/ff 浏览器直接渲染出来,可以指定容器的列个数,列间距,列中间边框,列宽度来实现;
#container { -webkit-column-count: 5; /*-webkit-column-gap: 10px; -webkit-column-rule: 5px solid #333; -webkit-column-width: 210px;*/ -moz-column-count: 5; /*-moz-column-gap: 20px; -moz-column-rule: 5px solid #333; -moz-column-width: 210px;*/ column-count: 5; /*column-gap: 10px; column-rule: 5px solid #333; column-width: 210px;*/ }
column-count 为列数;
column-gap 为每列间隔距离;
column-rule 为间隔边线大小;
column-width 为每列宽度;
当只设置 column-width 时,浏览器窗口小于一列宽度时,列中内容自动隐藏;
当只设置 column-count 时,平均计算每列宽度,列内内容超出则隐藏;
都设了 column-count 和column-width,浏览器会根据 count 计算宽度和 width 比较,取大的那个值作为每列宽度,然后当窗口缩小时,width 的值为每列最小宽度。这边其实很简单,简易自己尝试下,详细可参考
https://developer.mozilla.org/en/CSS3_Columns
中的说明。
线上例子。
优点:
直接 CSS 定义,最方便了;
扩展方便,直接往容器里添加内容即可。
缺点:
只有高级浏览器中才能使用;
还有一个缺点,他的数据块排列是从上到下排列到一定高度后,再把剩余元素依次添加到下一列,这个本质上就不一样了;
鉴于这两个主要缺点,注定了该方法只能局限于高端浏览器,而且,更适合于文字多栏排列。
3) 绝对定位。
即 Pinterest ,Mark之,KISSY 采用的方式:
可谓是最优的一种方案,方便添加数据内容,窗口变化,列数/数据块都会自动调整;
线上例子。
缺点:
需要实现知道数据块高度,如果其中包含图片,需要知道图片高度;
JS 动态计算数据块位置,当窗口缩放频繁,可能会狂耗性能。
KISSY.Waterfall 实现思路
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)/如何停止加载的接口。这样真是太方便了~~
感兴趣的可以参见源码。
KISSY.Waterfall 示例和文档
看到这边,是不是很想试用一下~~ 嗯嗯,这里给出一些相关学习资料和示例,以供参考:
Waterfall API 文档,相关构造器,配置项,方法都在这里;
示例,包含静态和动态两种。
欢迎试用和提出意见~~
来自:
评论
http://docs.kissyui.com/docs/html/api/component/waterfall/
发表评论
-
continuation, cps
2013-09-12 16:49 2813起 随着 nodejs 的兴起,异步编程成为一种潮流 ... -
一种基于匹配回朔的 css3 选择器引擎实现
2013-05-07 20:40 3416一种基于匹配回朔的 css3 选择器引擎实现 介绍 C ... -
模块化高扩展性的前端框架 KISSY
2013-03-14 14:58 8636模块化高扩展性的前端框架 KISSY 注:本文为 2 ... -
cubic-bezier 模拟实现
2013-01-05 16:34 14111cubic-bezier 曲线是 css3 动画的一个重要基石 ... -
构建前端 DSL
2012-10-11 22:10 5375目前在传统的软件开 ... -
KISSY kisses bootstrap navbar
2012-08-03 01:12 6060看了下 bootstrap 的导航菜单,立刻非常喜欢,注意是浅 ... -
css reset revisit
2012-07-25 00:32 4264正如 javascript 兼容库的作用, css r ... -
Get cursor position and coordinates from textarea
2012-04-10 20:50 5074最近需要从 textarea 中获 ... -
兼容 ie 的 transform
2012-02-23 14:00 6445css 2d transform 是 css3 引入的一个新的 ... -
promise api 与应用场景
2012-02-07 17:34 7403promise 是 commonjs 社区中提出的异步规范,其 ... -
closure compiler 代码优化实例
2012-01-08 03:23 2845closure compiler 可以进行不少有意思的优化 ... -
circular dependency
2011-12-11 18:23 3939循环依赖是和语言无关 ... -
write html parser
2011-12-01 02:48 2927首先需要声明 html 不能用正则表达式来直接匹配进行内容抽取 ... -
获取剪贴板数据
2011-11-07 23:31 6461兼容性: 获取剪贴板数据这块各个浏览器间存在很大的 ... -
url 映射问题
2011-11-07 21:52 3231背景 url mapping 我最早知道是作为 j ... -
tip:如何原生播放声音
2011-10-19 12:45 2987如果不想考虑浏览器间 ... -
unified event model
2011-10-14 23:02 1791为了处理原生事件在各 ... -
cross domain request
2011-09-29 18:39 2854场景 跨域请求是随着 ... -
基于多继承的树设计
2011-09-18 03:42 2273分类 树是一种常见 ... -
caja 原理 : 前端
2011-09-01 16:48 7080作为前端开放的基础安全保证,caja 是目前比较合 ...
相关推荐
r融文:专题研究-浅析农业绿色低碳转型之路
瀑布流布局浅析 浅谈个人在瀑布流网页的实现中遇到的问题和解决方法 折腾:瀑布流布局(基于多栏列表流体布局实现) javascript 瀑布流、各大瀑布流简析与建议 因为自己用jquery比较多,便萌生了把瀑布流做成插件的...
[第27讲:ADO.NET实例浅析(C#视频教程 + C#源代码).zip] 根据【田洪川 天轰穿 C#视频教程】的【第27讲:ADO.NET实例浅析】实现,VS2010编译运行正常;SQL Server数据库文件包括2005和2008两个版本的。 源代码与...
开题报告:运用SWOT理论浅析邮政储蓄银行XX分行改革过程中存在的问题及对策分析..doc
本文从底层IPC机制出发,结合UNIX核心系统参数和ATMI技术,借用ipcs观察Tuxedo所消耗的IPC系统资源状况,浅析了Tuxedo强大功能背后的工作原理,进一步加深对Tuxedo应用和ATMI编程的理解,提出了解决实际工作中关键...
20210430-头豹研究院-化工行业:2021年浅析数字化工厂五大核心系统.pdf
电动汽车充电站是发展电动汽车所必须的重要配套基础设施,对电动汽车的充电需求进行了分析,提 出了发展电动汽车对充电技术的要求,分析了影响电动汽车充电站规划的几方面因素,并对其布局规划提出 了原则性建议。
4C之新蓝海:汽车电子PCB市场浅析.pdf
资治通鉴:三大案例,浅析大智慧
在机器之心举办的 ChatGPT 及大模型技术大会上,哈尔滨工业大学计算学部长聘教授、博士生导师车万翔发表主题演讲《ChatGPT 浅析》,在演讲中,他回答了 ChatGPT 究竟解决了什么科学问题,是如何解决该问题的,以及...
[第25讲:委托与事件实例浅析(C#视频教程 + C#源代码).zip] 根据【田洪川 天轰穿 C#视频教程】的【第25讲:委托与事件实例浅析】实现,VS2010编译运行正常。 源代码与视频教程中略有不同! 本人不是天轰穿,在此对...
中信证券-电子行业科技安全专题:半导体产业链安全浅析及投资策略-230602.pdf
软文:教育信息化四大业务浅析.pdf
2021年浅析数字化工厂五大核心系统.pdf
浅析微信支付系列已经更新六篇了哟~,没有看过的朋友们可以看一下哦。 浅析微信支付:支付结果通知 浅析微信支付:统一下单接口 浅析微信支付:微信公众号网页授权 声明:这里的查询订单、关闭订单接口仅适用于 小...
20210524-广发证券-轻工制造行业新型烟草与个护月报:浅析宠物卫生用品与依依股份.pdf
论文题目:浅析小学英语.doc
从NAT的概念,到搭建NAT,分别用思科模拟器和在虚拟器中进行试验,再次阐述Nat技术,并用抓包工具进行抓包,更加直观
【标题】:“张泽燕 浅析中小企业应收账款的管理” 这篇文档主要探讨的是中小企业在经营过程中应收账款的管理问题。应收账款是企业在销售商品或提供服务后,客户未立即支付的款项,它反映了企业的销售业绩和客户的...