2010年堆糖创办以来,网站界面经历过3-5次重大改版,logo也曾更换过两次,早期蓝红相间三个圈的logo恐怕很少有人记得了。与此同时,前端 js 框架也在默默的更新换代。最早堆糖上线时,js 采用的YUI2.0 框架,这也是传承自上一家公司。上线后空闲下来,经历3个月的时间,逐步的切换到jQuery1.3.2(后来升级版本到1.6.1)。估摸着是在2011年3月完成切换工作,那个时候瀑布流还没有兴起,堆糖网核心页面仍然是微博模式。3月底,一场基于jQuery的瀑布流开发工作由此开始。不记得开发经历了多久,只记得当时开发完上线,发现各种网站的瀑布流争相出炉,好不热闹。时至今日,堆糖的核心浏览模式仍旧是瀑布流。

  说到瀑布流,不得不提一下pinterst.com 这一瀑布流的始祖网站,以及masonry.js 这一核心技术支持,相信大多数开发瀑布流的前端攻城狮们都有研究过masonry.js 源代码,早期pinterst.com 的js 里就有它的影子。但对于一个纯粹的瀑布流页面,masonry.js 某些自动排版的功能显得多余,代码也过于繁琐,直到最后也只能从头写过。2011年中期,开源社区瀑布流组件已经应运而生,记得淘宝就已经由玉伯出品了。2011年底我也想过分享堆糖的瀑布流,但种种原因放弃了。其中一个原因是逻辑过于复杂,代码过于凌乱。堆糖的瀑布流大不同于inifinite 无限加载类型的瀑布流,适可而止的翻页机制才是重点,这一翻页机制全部由js 实现,而不是简单的刷新页面,这一点不同就让我难以起手整理。加上年底,归家心切,就推迟了。

  结果这一推迟,就快两年了。要不是这次Boss Jodyssey威胁我要分享前端相关的技术,这一推迟还不知道要延续多久。既然是要分享,我理解就是卖了,就卖得彻底一点,堆糖瀑布流前端整套解决方案今日和盘托出,拱手相赠,那边Laurence大哥可能会教导,“这是公司的核心资产,怎么能贱卖...” 我是想,待到人老珠黄了再卖,连吆喝声都赚不到就亏得没底了。虽说瀑布流体系的风头早已不如从前,但也还残存点商业价值,不知道现如今猪八戒网上仿堆糖还值多少钱,有识货的码农借去揽了生意,记得给点分成哈,联系邮箱: hr@duitang.com 。

下面可都是些干货了。

堆糖瀑布流(Woo) jQuery完整版,涵盖以下特点:

o) 数据配置灵活,可在html 里直接放置瀑布流单元(一般只放第一子页)。
o) 数据格式灵活,可处理josn格式的数据(推荐),也可兼容html字符串格式的数据。
o) 独立的数据控制文件 masnunit.js。
o) 同一页面上通过tab 切换植入多个不同类型的瀑布流,切换无刷新。
o) 不同于infinite 瀑布流,可进行翻页控制。子页数量设置无限大时等同于infinite。
o) 至页底时,会预加载下一页第一子页内容。
o) 实现hash 无刷新翻页,并兼容浏览器的前进后退功能。
o) 根据当前环境自动控制瀑布流列数,可自适应屏幕宽度,也可通过 data-domwidth 设置固定宽度。
o) 可采用 sink 模式,在瀑布流左侧或右侧第一列嵌入外部区块。
o) 可配置直接向前(后)翻页的小翻页器。
o) 自带回到顶部功能,并能控制距离顶部的准确位置,准确说是回到预埋锚点的位置(可设置偏移量)。
o) 强大的 window resize 自动重绘功能(IE下不建议打开此功能)。
o) 可通过配置参数激活特殊列(只能是最左或最右列),此列宽度可不同于其它列。
o) 灵活的参数设置,比如:子页数量、子页内单元数量、瀑布流单元宽度和间距 等等等等。

一些保留命名 >>

co(n)                        单元块所在列数对应的className
sc(n)                        单元块所在屏数对应的className
woo-(*)                    Woo内部特殊用途的className or id
woo-form-(*)            form 表单的 id,用作请求地址url的拼装
srcd                         单元块内的图片src 属性的替代,图片延迟加载功能使用

一些依赖 >>

依赖 browser.js 用于兼容1.10 及以上jQuery 版本的$.browser 对象
依赖 history.js 监控hashchange 事件
依赖(非必需) template.min.js 组装html 字符串,详见 masnunit.js
依赖 tabswitch.js 用于不同瀑布流的切换

一些使用方法 >>

1) 在main.html 代码底部每一个<form >对应一个瀑布流的数据请求地址。
2) 如页面上只需要一个瀑布流,请相应的删除掉多余的form 表单和 .woo-swa .woo-swb节点。
3) 如不给定 .woo-masned 节点的宽度,会自动适应屏幕宽度。专辑类型示例中给定了 1000px 的宽度。
4) .woo-pcont 节点内可预先放好若干个单元(个数没有限制),预先放置的会被当做第一子页数据,后面会直接从第二子页开始。
5) 一个页面可以有多个瀑布流,不同瀑布流的配置可以差异化。通过在各自.woo-pcont节点上设置 data- 属性,例如:data-subpagenum data-unitsnum data-sink来覆盖全局配置。
6) .woo-pcont节点上目前支持的data- 配置有:data-domwidth data-subpagenum data-unitsnum data-totalunits data-wootemp data-sink data-sinkheight data-sinkright。
7) data-wootemp 取值为从0开始的整数,对应 masnunit.js 文件里定义的不同类型瀑布流。
8) 示例使用了DEBUG 并分别在 main.html 和 masnunit.js 里给定了模拟数据。
9) 可在 masnunit.js 里编写不同种类的瀑布流,示例给出了两种:图片类型和专辑类型。
10) 请仔细研究 masnunit.js。

 初始化方法 >>

<script>
$(function (){ // 可自行修改代码添加瀑布流的三个控制键 gonext gopre gotop
$('<div id="mycontrols"><a id="gonext" href="javascript:;" title="下一页"></a><a href="javascript:;" id="gotop"></a><a id="gopre" href="javascript:;" title="上一页"></a></div>').appendTo('body'); var conf = {
// 每个请求对应的form 的id 前缀,和 arrform 标识数组结合。
"formprefix" : '#woo-form-',
// 标识数组,每个标识对应一个瀑布流,本例有四个瀑布流。
// 容易看出每个标识前加上 formprefix 就能对应#win-holder 里的form 表单:
// <form id="woo-form-(collect|original|album|favalbum)">
"arrform" : ['album','favalbum','collect','original'], // 请求地址在页码处split分开的后半截(例如/message/list/1/?type=hot)
// 前半截在 <form action="/message/list/"> action 里,
// 后半截作为 arrsplit 参数值,上例中其值为 '/?type=hot'。
// 前后半截均不包含页码数。
// 这是为了应对页码数被设计在url 中间的悲剧情况。
// 请将页码数设计在地址最后的位置如 <form action="/people/list/?page=">
// 那么对应的 arrsplit 参数值为空字符串。
"arrsplit" : ['/?type=hot','','',''], // 瀑布流每一列扩展宽度,此宽度包含两列之间的间距。
"arrmasnw" : [245,250,250,245], // 瀑布流两列之间的间距。此例第一个瀑布流的可视宽度为 245-21=224
"arrmargin" : [21,42,42,21], // 第一列特殊宽度 默认等于 arrmasnw。
// 如果想让第一列(可左数第一列,也可右数第一列)宽度不同于其它列,
// arrfmasnw 应设置为第一列和其它列的宽度差值。
// 为什么参数值是一个数字0 而不是数组[0,0,0,0]?
// 这里简化了传参,如果数组里所有元素的值相同,可以只传这个值。
// 同理,上方的参数 arrsplit arrmasnw arrmargin 均适用这一简化规则
// arrform 不适用这一简化规则,原因不解释。
"arrfmasnw" : 0, /////////////////// 【上方各参数必须填写,否则后果自负】 // 可自由选择安装 $gopre $gonext $gotop 等操作键。
"gopre" : '#gopre',
"gonext" : '#gonext',
"gotop" : '#gotop', // footer 选择器,只要处于瀑布流翻页器下方的都可视为 footer。
// 它的隐藏和显示将会受到控制。
"footer" : '#footer,#preserve', // scroll 过程中触发的方法,可用于登录弹出框等
"onScroll" : function (tp){
// tp 为当前的scrolltop
// if( (typeof ALREADYNOTICED === 'undefined' || !ALREADYNOTICED) && tp >= 1000 ){
// ALREADYNOTICED = true
// alert("弹出登录框")
// }
}
} // 启动瀑布流,好短
$.Woo(conf);
})
</script>

请求url地址采用 form 存放,有不习惯的朋友,还请将就:

<form id="woo-form-favalbum" action="/blog/list/?page=">
<input type="hidden" name="user_id" value="48"/>
<input type="hidden" name="pic" value="1"/>
<input type="hidden" name="like" value="1"/>
</form>

github 地址: https://github.com/duitang/waterfall

纯静态demo演示(模拟数据): demo1  demo2  demo3  demo4

(如有使用上的问题,请联系作者新浪微博 @transmars )

  最后闲聊部分,聊聊人生,谈谈理想。在前端领域摸爬滚打将近7年,用html搭搭框架,用css描描色彩,用js写写动画,这些普通得不能再普通的工作填满了每天的8小时,而沉浸于此的动力,同时也是最大的成就感来自于“造梦者的点睛之笔”,当设定好了梦的场景和剧情,最后注入灵魂的一笔非前端莫属。或许有人会觉得前端的工作没有创造性,比起设计师的工作,那确实,但任何天马行空的构想,只有靠一砖一瓦的真材实料才能构筑,互联网也不例外。协作的共识是,不能让所有人都专注于一处,前端更需要的是代码的组织和管理能力,但没有人会阻止你在任何环节发挥你的创造力,没有哪个Boss会忽视任何对公司有价值的创造力表演。其实,前端领域本身就是一个充满创新的领域,随着html5 标准的不断普及,各大浏览器对标准的趋于一致,前端工程师们有朝一日终将抛掉ie旧版本的沉重包袱,投入更多的精力到新技术、新平台、新应用的研究开发中去,前端事业在不久的将来必定蒸蒸日上,不是早有预测给出,未来六大高薪职业中,前端(不算后端)居其一么。

  当前,我们正在招募前端开发伙伴,欢迎对堆糖前端职位有兴趣的同学大力将简历砸过来。收件箱:hr@duitang.com,并请尽量附上微博、个人主页链接。前端招聘要求 请戳这里 。

  有干货,有思想,分享来自堆糖网。

堆糖瀑布流完整解决方案(jQuery)的更多相关文章

  1. 瀑布流插件(jquery.masonry.js)

    什么是瀑布流?去看看Pinterest(这才是鼻祖),Mark之,蘑菇街,点点网,还有腾讯的微博广场吧.随着页面滚动条向下滚动,还会不断加载数据块并附加至当前尾部. Masonry是一款很好用的jqu ...

  2. jquery.masonry瀑布流插件的4个使用步骤

    1.分别加载jquery插件与jquery.masonry插件两个文件 下载jquery插件:http://jquery.com也可以引用google的cdn外部jquery核心库JS文件下载jque ...

  3. thinkPHP实现瀑布流的方法

    thinkPHP实现瀑布流的方法 文章TAG:thinkphp 瀑布流 时间:2014-11-29来源:www.aspku.com 作者:源码库 文章热度: 131 ℃ 过期已备案域名,注册就能用!终 ...

  4. ThinkPHP官网瀑布流实现分享

    很多人都想做瀑布流的效果,这里告诉大家官网使用的方法. 首先要下载瀑布流的插件jquery.masonry.min.js 地址:http://masonry.desandro.com/index.ht ...

  5. jquery瀑布流的制作

    首先,还是来看一下炫酷的页面: 今天就边做边说了: 一.准备工作 新建css,js,img文件夹存放相应文件,并在demo.html文件中引入外部文件(注意要把jquery文件引入),这里就不过多描述 ...

  6. 用jquery实现瀑布流案例

    一.瀑布流是我们常见的案例,这里主要讲述,用jquery的方式实现瀑布流的功能! 引言:我们经常见到很多网站的瀑布流功能,如淘宝.京东这些商品等等.. 实现它我们首先考虑几个问题:1.获取到数据   ...

  7. 利用jQuery来扩展一个瀑布流插件

      简单了解jQuery.fn.extend() jQuery.fn.extend()函数用于为jQuery扩展一个或多个实例属性和方法(主要用于扩展方法). (截图来自jQuery文档) 为了更清晰 ...

  8. jQuery瀑布流插件——jQuery.Waterfall

    插件--jQuery.Waterfall 思路: 其实只要了解了整个流程,要实现这个插件也不难,大家都玩过俄罗斯方块吧,原理差不多,找到合适的地方叠上去就好了,在这里,每个块的宽度是必需给定的,然后计 ...

  9. jQuery实现瀑布流

    瀑布流布局多用于加载图片,或者图片配上文字.视觉表现为参差不齐的多栏布局.随着页面滚动条向下滚动,还会不断加载数据块并附加至当前尾部.本文就来利用jQuery实现一个图片瀑布流的效果. 1.布局. 首 ...

随机推荐

  1. PHP获取当前时间戳,当前时间、及解决时区问题

    一.获取当前时间戳 方法1:通过time函数 time(); 方法2:通过$_SERVER中的REQUEST_TIME元素 $_SERVER['REQUEST_TIME']; 方法3:通过strtot ...

  2. PHP简单文件上传

    一个简单的PHP上传文件的例子: upload.html <html> <body> <form action="upload.php" method ...

  3. MemCache缓存multiget hole详解

    multiget 是什么 multiget 指的是从 memcache(或其他分布式缓存) 一次性获得多个键值,一般由 memcached client 自行实现. multiget hole是什么 ...

  4. openssl lhash 数据结构哈希表

    哈希表是一种数据结构,通过在记录的存储位置和它的关键字之间建立确定的对应关系,来快速查询表中的数据: openssl lhash.h 为我们提供了哈希表OPENSSL_LHASH 的相关接口,我们可以 ...

  5. 转:Linux内部的时钟处理机制全面剖析

    Linux内部的时钟处理机制全面剖析 在 Linux 操作系统中,很多活动都和时间有关,例如:进程调度和网络处理等等.所以说,了解 Linux 操作系统中的时钟处理机制有助于更好地了解 Linux 操 ...

  6. hdu1754 I Hate It

    题目链接:hdu1754 I Hate It 树状数组学习参考博客:http://blog.csdn.net/u010598215/article/details/48206959 树状数组之前没看懂 ...

  7. 关于css

    已经学了四天的css.现在对于css的了解还很肤浅,首先,我对基础的还不是很了解. 级联样式表(Cascading Style Sheet)简称“CSS”,通常又称为“风格样式表(Style Shee ...

  8. Eclipse 安装需要的 JDK 版本简要说明

    Eclipse 4.6 (Neon) Eclipse 4.6 (Neon)is scheduled for release on June 22, 2016. Consider using the I ...

  9. [转]搭建高可用mongodb集群(二)—— 副本集

    在上一篇文章<搭建高可用MongoDB集群(一)——配置MongoDB> 提到了几个问题还没有解决. 主节点挂了能否自动切换连接?目前需要手工切换. 主节点的读写压力过大如何解决? 从节点 ...

  10. git clone带用户名和密码的方式

    git clone http://username:password@127.0.0.1/res/res.git