首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > JavaScript >

JQUERY飞瀑流-研讨

2013-04-20 
JQUERY瀑布流--研讨先看看DEMO:http://down.scscms.com/scs/waterfall/index.htmljquery瀑布流布局:现在很

JQUERY瀑布流--研讨
先看看DEMO:http://down.scscms.com/scs/waterfall/index.html

jquery瀑布流布局:现在很流行的一种网页布局效果,瀑布流,随意、洒脱,个性十足,一种代表时尚潮流的网页设计风格。
http://www.sitejs.cn/code/down/jsdmview/waterfall/这里也有一个瀑布流效果,但个人觉得效果不好。它的排版原理是先统计n列,然后生成n个DIV。然后统计这排DIV的高度来分配图片的方法。开始加载感觉不出问题来。如果窗口变化几次排序就会乱了,而且打乱原有节点的排序,还有它是直接修改了原有节点结构,渲染过程中很卡甚至卡死。我觉得应该保持原有节点不要更改,只修改图片的div坐标位置达到排序功能即可。

========================javascript脚本======================

<script>
    $(function(){waterfall(".cell")});
    function waterfall(cls){
        if(!$(cls).length) return;//没有元素
        var con={
            obj:null,//图片div对象
            l:0, //总共数量
            w:214,//列宽
            s:10,//列间距
            list:0, //多少列
            h:1, //外div的高
            arr:[],//最后一排数组
            state:"loading" //状态 loading:加载图片中,ajax:正在发生ajax请求,finish:完成任务,load_resize:加裁过程中窗口变化(记录起来,加载完后处理),resize:执行了窗口变化,reset:窗口变化排序中再次重排
        };
        con.obj=$(cls);//图片div对象
        con.l=con.obj.size();//统计共有多少个图片div
        con.list=Math.floor($("#container").width()/(con.w+con.s));//统计共有多少列
        fall_pic(0);
        $(window).resize(function(){
            var w=Math.floor($("#container").width()/(con.w+con.s));//重新统计共有多少列
            if(w!=con.list){
                //窗口变化造成列数发生了变化
                if("loading|load_resize|ajax".indexOf(con.state)!=-1){
                    //如果正在加载中,需要加载完后再执行重排
                    con.state="load_resize";
                }else{
                    //已经排完或者执行重排过程
                    con.list=w;
                    con.h=1;
                    if("finish"==con.state){
                        con.state="resize";//执行重排
                        fall_pic(0);


                    }else{
                        con.state="reset";//重排中的重排
                        //因为已经在重排过程中,不能再次调用函数。但可让编号再从0开始
                    }
                }
            }
        }).scroll(function(){
                    if("finish"==con.state){
                        var top=con.obj.last().offset().top;//最后一张图片的坐标
                        var scrollTop=document.documentElement.scrollTop||document.body.scrollTop||0;//滚动条距离
                        var windowHeight=document.documentElement.clientHeight||document.body.clientHeight||0;//窗口高度
                        if(windowHeight+scrollTop>=top){
                            con.state="ajax";//当滚动条拉到看到最后一张图片时
                            var html='';//实现案例中此改成ajax请求json或html,每次请求只增加一排
                            for(var i=con.l;i<con.l+con.list;i++){
                                html+='<div class="cell"><img src="http://cued.xunlei.com/demos/publ/img/P_'+('00'+i%162).slice(-3)+'.jpg" /><h3>'+i+' AJAX加载</h3><p>JQUERY瀑布流原理:每次排版取前一排最低的位置接着排,窗口改变后先计算一下列数有没有发生变化,变化后才重排。当下拉滚动条达到最后一个DIV的顶部时请求ajax生成新的图片插到底部执行继排功能。</p></div>';
                            }
                            $("#container").append(html);
                            con.obj=$(cls);//更新对象
                            var _i=con.l;//记录加载前的最后一个编号
                            con.l=con.obj.size();//统计现在共有多少张图片
                            fall_pic(_i);//接着加载前最一张图片排序;


                        }
                    }
                });
        function fall_pic(n){
            if("reset"==con.state){
                n=0;//处理重排中窗口再次变化
                con.state="resize";
            }
            //以下con.state可能存在的值为 loading,ajax,load_resize,resize
            if(n<con.l){
                var obj=con.obj.eq(n);//获取对象
                var x= 0,y=0;//对象坐标值
                if(n<con.list){
                    x=n*(con.w+con.s);//如果是第一排,y=0,x=宽度+列间距
                    con.arr[n]=obj;//把最后一排对象组成数组供后面用
                }else{
                    var _i=0;//查一下最后一排哪张图片的底部离顶部最高,然后在其后面插入新图片
                    for(var i= 0;i<con.list;i++){
                        var _top=con.arr[i].position().top+con.arr[i].outerHeight(true)+con.s;
                        if(0==y)y = _top;
                        if(y>_top){
                            _i=i;
                            y=_top;
                            x=i*(con.w+con.s);
                        }
                    }
                    con.arr[_i]=obj;//替换数组
                }
                if("resize"==con.state){
                    //如果是窗口变化,属于重排,不需要预加载图片


                    if(y==obj.position().top&&x==obj.position().left){                        
                        n++;//原位不变的跳过排序动画
                        fall_pic(n);
                    }else{
                        obj.animate({top:y,left:x},"fast",function(){
                            var _h=obj.position().top+obj.outerHeight(true);
                            if(_h>con.h){
                                con.h=_h;
                                $("#container").stop().animate({height:_h},"fast");//设置外框高
                            }
                            n++;
                            fall_pic(n);
                        });
                    }
                }else{
                    var img=new Image();
                    img.onload=function(){
                        obj.css({top:y,left:x}).fadeIn("slow",function(){
                            var _h=obj.position().top+obj.outerHeight(true);
                            if(_h>con.h){
                                con.h=_h;
                                $("#container").stop().animate({height:_h},"fast");//设置外框高


                            }
                            n++;
                            fall_pic(n);
                        });
                    };
                    img.onerror=function(){
                        //加载失败就替换图片,并省去设置外围div的高
                        obj.css({top:y,left:x}).fadeIn("slow",function(){
                            n++;
                            fall_pic(n);
                        }).find("img").attr("src","error.jpg");
                    };
                    img.src=obj.find("img").attr("src");
                }
            }else{
                setTimeout(function(){
                    if("load_resize"==con.state&&con.list!=Math.floor($("#container").width()/(con.w+con.s))){
                        con.state="finish";//如果是在预加载图片时改变了窗口大小需要重排的情况
                        $(window).resize();
                    }else{
                        con.state="finish";//延时一下,以防自动不断触发scroll
                    }
                },300)
            }
        }
    }
</script>


HTML部分请看demo,如果有问题或者优化方法请赐教! jquery 图片 瀑布流
------解决方案--------------------


JQUERY飞瀑流-研讨,精打成金了
[解决办法]
JQUERY飞瀑流-研讨
学习。
[解决办法]
支持一下啊。
[解决办法]
好东西,收藏了!!
[解决办法]
还不错啊,关键还是说说思路吧
[解决办法]
支持博主。JQUERY飞瀑流-研讨
[解决办法]
JQUERY飞瀑流-研讨
[解决办法]

好东西 放到我博客了啊
[解决办法]
支持一下啊。 
[解决办法]
支持一下,不错
[解决办法]
加载不要“单线程”走。理论上来说 屏内的图片应该同时加载起来。。
支持自己玩demo的童鞋。
[解决办法]
不错,顶一个!
http://www.oschina.net/p/cdesk
[解决办法]
JQUERY飞瀑流-研讨新人受教了
[解决办法]
lz,可不可以做到只有可是范围内出现图片其它图片都在滚动过后自动删除?

········

不知道你能理解不,我还是自己试一下把
[解决办法]
13楼的网站也是瀑布流,他引用的是:http://masonry.desandro.com/
这个外老厉害:http://desandro.com/
很强的动画效果:http://isotope.metafizzy.co/也是上面那个老外的一个项目。
里面还有很多项目,大家围观吧。
[解决办法]
JQUERY飞瀑流-研讨
[解决办法]
支持一下啊。 给分呀
[解决办法]
顶一个JQUERY飞瀑流-研讨
[解决办法]
支持一下高手
[解决办法]
很漂亮!! 我用的是http://masonry.desandro.com/,用起来简单点。 自己不用写什么东西
[解决办法]
试得好好学习
[解决办法]
围观学习JQUERY飞瀑流-研讨
[解决办法]
JQUERY飞瀑流-研讨
[解决办法]
还不错啊,关键还是说说思路
[解决办法]
不错,我也想知道一下 
------解决方案--------------------


很飘逸,不过初始的时候滚动条好像会自动一直往下拉,拉都拉不上去,不知是不是图片太多的原因(初始时有12张),我的分辨率是1024*768的
[解决办法]
我也想知道一下,学习一下呢
[解决办法]
下拉缓存太少了
[解决办法]
支持一下,不错 
[解决办法]
收下了JQUERY飞瀑流-研讨
[解决办法]
我觉得应该要有一个,下一页,进行分页,每页限制多少条记录。
[解决办法]
把它扩展一下如何?

waterfall({
    cls:"cell",
    buffer:2
})

function waterfall(options){
    var cls = options.cls;
    var buffer = options.buffer ? 1:options.buffer;

}
[解决办法]

引用:
谢谢!加载图片没有故意设置单线加载,只是做动画一张张图片来做,看代码可以知道。因为从上往下排,图片在没有加载成功之前是不知道其高度(我们只限宽不限高)如果硬排上去将影响下一排图片的排版。
这里的图片加载与普通网页一样的。第一次加载已存在HTML的图片,窗口滚动到底部时一次加载N张图片。
至于13楼提供的参考例子里它有特殊性:就是它一页固定了几张图片,然后它在全部图片加……

http://huaban.com/

随便找了个demo 你看看别人的玩法就明白了 原理这事就不用阐释了呵呵。
[解决办法]
引用:
引用:http://huaban.com/打开一看,我擦!先排版后加载图片,怎么知道高度?这么牛B。查看源代码,原来图片都事先定死高宽,那没办法!起跑线不一样。


看到了最后,想若若的问几个问题,我没接触过瀑布留技术,希望能教教我,你们反复在讨论的几个问题都有些技术点我没听懂:
1.单线程加载是什么,是指加载完一个图片再设定下一个图片的src吗;
2.“先排版后加载图片”这个是你是怎么判断出来的,我看那几个demo没看出区别啊;
3.jQuery Masonry跨行排版是什么意思,什么是跨行;

[解决办法]
.jQuery Masonry
[解决办法]
第一感觉挺帅滴!
第二感觉自己的技术还是要提高,全面啊!
[解决办法]
引用:
这些都不是什么专业词语,随便叫的。
1.单线程加载你理解是对的,简单理解就是同一时间只加载一张图片
2.“先……


谢谢你的回答,以后还要好好学习下

热点排行