13 |
column_className: 'waterfall_column' ,
|
15 |
cell_selector: '.cell' ,
|
21 |
getResource: function (index){ }
|
24 |
waterfall=$.waterfall={},
|
26 |
waterfall.load_index=0,
|
28 |
waterfall: function (opt){
|
30 |
setting=$.extend(setting,opt);
|
31 |
$container=waterfall.$container=$( this );
|
32 |
waterfall.$columns=creatColumn();
|
33 |
render($( this ).find(setting.cell_selector).detach(), false );
|
34 |
waterfall._scrollTimer2= null ;
|
35 |
$(window).bind( 'scroll' , function (){
|
36 |
clearTimeout(waterfall._scrollTimer2);
|
37 |
waterfall._scrollTimer2=setTimeout(onScroll,300);
|
39 |
waterfall._scrollTimer3= null ;
|
40 |
$(window).bind( 'resize' , function (){
|
41 |
clearTimeout(waterfall._scrollTimer3);
|
42 |
waterfall._scrollTimer3=setTimeout(onResize,300);
|
46 |
function creatColumn(){
|
47 |
waterfall.column_num=calculateColumns();
|
50 |
for ( var i=0;i<waterfall.column_num;i++){
|
52 |
<div class= "'+setting.column_className+'" style= "width: '+setting.column_width+'px; display: inline-block; *display: inline; zoom: 1; margin-left: '+setting.column_space/2+'px; margin-right: '+setting.column_space/2+'px; vertical-align: top; overflow: hidden;" ></div>
|
56 |
$container.prepend(html);
|
57 |
return $( '.' +setting.column_className,$container);
|
59 |
function calculateColumns(){
|
60 |
var num=Math.floor(($container.innerWidth())/(setting.column_width+setting.column_space));
|
63 |
var src=$( this )[0].nodeName.toLowerCase()== 'img' ?$( this ).attr( 'src' ):$( this ).find(setting.img_selector).attr( 'src' );
|
64 |
image.onload= function (){
|
65 |
image.onreadystatechange= null ;
|
66 |
if (setting.insert_type==1){
|
67 |
insert($(elements).eq(i),setting.fadein&&fadein);
|
68 |
} else if (setting.insert_type==2){
|
69 |
insert2($(elements).eq(i),i,setting.fadein&&fadein);
|
73 |
image.onreadystatechange= function (){
|
74 |
if (image.readyState == "complete" ){
|
76 |
if (setting.insert_type==1){
|
77 |
insert($(elements).eq(i),setting.fadein&&fadein);
|
78 |
} else if (setting.insert_type==2){
|
79 |
insert2($(elements).eq(i),i,setting.fadein&&fadein);
|
86 |
if (setting.insert_type==1){
|
87 |
insert($(elements).eq(i),setting.fadein&&fadein);
|
88 |
} else if (setting.insert_type==2){
|
89 |
insert2($(elements).eq(i),i,setting.fadein&&fadein);
|
94 |
function public_render(elems){
|
97 |
function insert($element,fadein){
|
99 |
$element.css( 'opacity' ,0).appendTo(waterfall.$columns.eq(calculateLowest())).fadeTo(setting.fadein_speed,1);
|
101 |
$element.appendTo(waterfall.$columns.eq(calculateLowest()));
|
104 |
function insert2($element,i,fadein){
|
106 |
$element.css( 'opacity' ,0).appendTo(waterfall.$columns.eq(i%waterfall.column_num)).fadeTo(setting.fadein_speed,1);
|
108 |
$element.appendTo(waterfall.$columns.eq(i%waterfall.column_num));
|
111 |
function calculateLowest(){
|
112 |
var min=waterfall.$columns.eq(0).outerHeight(),min_key=0;
|
113 |
waterfall.$columns.each( function (i){
|
114 |
if ($( this ).outerHeight()=bottom-windowHeight){
|
115 |
render(getElements(), true );
|
120 |
if (calculateColumns()==waterfall.column_num) return ;
|
121 |
var $cells=waterfall.$container.find(setting.cell_selector);
|
122 |
waterfall.$columns.remove();
|
123 |
waterfall.$columns=creatColumn();
|
124 |
render($cells, false );
|
插件使用方法:
1 |
$(selector).waterfall(opt);
|
所需的html结构:
html结构可以就是一个空容器元素,如
,里面的砖块元素通过动态加载进来。当然也可以预先放一些砖块进去,如demo页中的
2 |
< div class = "cell" >< img src = "P_000.jpg" />< p >00</ p ></ div >
|
3 |
< div class = "cell" >< img src = "P_001.jpg" />< p >01</ p ></ div >
|
4 |
< div class = "cell" >< img src = "P_002.jpg" />< p >02</ p ></ div >
|
5 |
< div class = "cell" >< img src = "P_003.jpg" />< p >03</ p ></ div >
|
6 |
< div class = "cell" >< img src = "P_004.jpg" />< p >04</ p ></ div >
|
7 |
< div class = "cell" >< img src = "P_005.jpg" />< p >05</ p ></ div >
|
8 |
< div class = "cell" >< img src = "P_006.jpg" />< p >06</ p ></ div >
|
9 |
< div class = "cell" >< img src = "P_007.jpg" />< p >07</ p ></ div >
|
10 |
< div class = "cell" >< img src = "P_008.jpg" />< p >08</ p ></ div >
|
11 |
< div class = "cell" >< img src = "P_009.jpg" />< p >09</ p ></ div >
|
12 |
< div class = "cell" >< img src = "P_010.jpg" />< p >10</ p ></ div >
|
13 |
< div class = "cell" >< img src = "P_011.jpg" />< p >11</ p ></ div >
|
14 |
< div class = "cell" >< img src = "P_012.jpg" />< p >12</ p ></ div >
|
15 |
< div class = "cell" >< img src = "P_013.jpg" />< p >13</ p ></ div >
|
16 |
< div class = "cell" >< img src = "P_014.jpg" />< p >14</ p ></ div >
|
17 |
< div class = "cell" >< img src = "P_015.jpg" />< p >15</ p ></ div >
|
18 |
< div class = "cell" >< img src = "P_016.jpg" />< p >16</ p ></ div >
|
19 |
< div class = "cell" >< img src = "P_017.jpg" />< p >17</ p ></ div >
|
20 |
< div class = "cell" >< img src = "P_018.jpg" />< p >18</ p ></ div >
|
21 |
< div class = "cell" >< img src = "P_019.jpg" />< p >19</ p ></ div >
|
下面详细说下配置参数对象opt的各属性的作用及其默认值。
column_width:204 //瀑布流是由列组成的,该参数规定了每列的宽度,该参数会直接影响到瀑布流的列数
column_className:’waterfall_column’ //列的类名,便于自定义样式
column_space:10 //列与列之间的间距
cell_selector:’.cell’ //要排列的砖块的选择器,限定在瀑布流的容器内,即插件是通过这个选择器来获取砖块元素的,并且是在瀑布流的容器内来查找这个选择器匹配的元素。
img_selector:’img’ //要加载的图片的选择器。如果你的瀑布流要加载的砖块元素的主题内容是大小不固定的图片,则该参数就是这些图片的选择器,插件需要获取这些图片来进行计算。
auto_imgHeight:true //是否需要自动计算图片的高度,如果图片的大小是固定的,则把该参数设为false吧
fadein:true //是否渐显载入
fadein_speed:600 //渐显速率,单位毫秒
insert_type:1 //砖块插入方式,1为插入最短那列,2为按序轮流插入
getResource:function(index,render){ } //获取动态资源函数,必须返回一个砖块元素集合,传入的第一个参数index为已加载的次数,第二个参数为渲染函数,它可以接受一个砖头元素集合作为参数,如果是使用ajax加载数据,则得到数据后要手动调用该函数来进行渲染 。每次到达瀑布流底部时会自动触发该函数来加载更多资源。
吐槽时间:
瀑布流加载的内容一般都宽度相同,高度不同的图片,如果能预先知道图片的高度,那就简单多了,但如果不能,则必须等到图片加载后才能计算出图片的高度,这是瀑布流最烦人的地方,也正是因为这样,如果是那些不知道高度的图片,则插入的顺序可能会有些混乱,而且每次刷新顺序都不同,因为每张图片加载完成的先后顺序并不是固定的,也许这次这个快一点,下次那个快一点。所以如果图片高度事先不知道,则整个砖块的高度也会不知道,必须等砖块里的图片加载完成后才能算出砖块的高度。如果是这样但又想保证砖块的插入顺序,则建议使用按顺序轮流插入的方式插入砖块,即把insert_type参数设为2。因为是插件,所以要考虑使用简便,但使用起来越简便,插件内部就会越复杂,漏洞、bug也会增多,所以我会继续完善这个插件。
本插件支持IE6+、chrome、firefox、opera、safari等主流浏览器。
分享到:
相关推荐
Jquery 瀑布流插件
Jquery瀑布流插件
JQuery瀑布流插件Grid-A-Licious是一款简单易用的jQuery插件,可用于创建响应式瀑布流布局,针对不同设备可自动适应宽度。
jQuery瀑布流插件masonry实现的瀑布流布局网页,很不错的瀑布流插件,采用lightbox插件放大展示图片,非常的漂亮的布局。
jquery瀑布流插件
这是一个基于jQuery 瀑布流插件 压缩后代码 889 Byte 里面有源代码和注释。
jQuery瀑布流插件BlocksIt.zip
jQuery Wookmark瀑布流插件
Jquery网站瀑布流插件masonry是一款jquery.masonry插件。
jquery瀑布流插件
jquery瀑布流插件 响应式移动端PC端布局 jaliswall.js
JQuery wookmark 瀑布流代码实例,现在很流行的一种网页布局效果,瀑布流,随意、洒脱,个性十足,一种代表时尚潮流的网页设计风格。