流行的瀑布流布局效果

效果图:

<script type="text/javascript" src="jq.js"></script>
<style>
#main-wrap{position: relative; margin:0 auto;}
.item-box{ position:absolute;left:0;top:0;padding:10px 0 0 10px;margin-left:-5px;}
.item-box .pic{border-radius:5px;padding: 10px;border:1px solid #ccc;box-shadow: #ccc 0 0 5px;}
.item-box .pic img{width: 160px;height:auto;}
.loading{ visibility:hidden;width:200px;height:45px; margin:30px auto; background-color:#ccc; text-align:center; line-height:45px;border:1px solid #eee;border-radius:5px;}

</style>

JS:

/**
*瀑布流插件
*本插件局域JQ
*在每次数据初始化前必须在服务器端设置好图片区域的宽高,也就是说在图片的外包装DIV上按照比例设置上宽高属性
*才能顺畅的运行在各个浏览器(因为图片在没有加载完毕前是没有宽高的)
*name:杨永
*QQ:377746756
*/
;(function($){
    //构建瀑布流构造函数
    var WaterFlowlayout=function(iTarget,loading,settings) {
        //保存自身
        var _this_=this;
        //初始配置参数
        this.opts={
                  colSize:5
                  };
        //如果配置了参数就扩展
        settings&&$.extend(this.opts,settings);

        //保存瀑布流容器、初始出现在容器里面的盒子、其中一个盒子的宽度
        this.insertBox=iTarget;
        this.insertBoxW=this.insertBox.width();
        this.itemBoxs=this.insertBox.find(".item-box");
        this.colW=this.itemBoxs.eq(0).outerWidth();
        //保存钩子loading加载状态
        this.loading=loading;
        this.isLoad=true;
        this.winHeight=$(window).height();
        this.scrollTop=$(document.documentElement).offset().top||window.pageYOffset;
        this.timer=null;
        //初始化一下
        this.init();
        //绑定窗口事件
        $(window).scroll(function(){
            _this_.scrollTop=$(document).scrollTop();
            _this_.isLoadingStatus();
        }).resize(function(){
            _this_.winHeight=$(window).height();
            _this_.isLoadingStatus();
        });
    };
    WaterFlowlayout.prototype={
        isLoadingStatus:function(){//判断loading是否出现在视口中
            var self=this;
            window.clearTimeout(self.timer);
            self.timer=window.setTimeout(function(){
                if(self.isLoad){
                    if(self.loading.offset().top<(self.winHeight+self.scrollTop)){
                        self.isLoad=false;
                        self.loading.css("visibility","visible");
                        self.opts.callBack&&self.opts.callBack();
                    }else{
                        self.loading.css("visibility","hidden");
                    };
                };
            },300);
        },
        reloadView:function(dataList){//刷新新添加进来的元素
            var self=this;
            //创建一组数据到里面
            self.createItems(dataList);
            //设置下容器的宽高
            self.setInsertBoxHeight(self.colsArr);
            //渲染完成后可以加载
            self.isLoad=true;
            self.loading.css("visibility","hidden");
        },
        createItems:function(dataList){
            var self=this;
                self.createArr=[];
           /*<div class="item-box"><div class="pic"><img src="images/10.jpg"></div></div>*/
            $(dataList).each(function(i, elem) {
                var itemBox=$(‘<div class="item-box" style="display:none;">‘);
                    itemBox.html(‘<div class="pic" style="width:‘+elem.width+‘px;height:‘+elem.height+‘px"><img src="‘+elem.src+‘"></div>‘);
                self.createArr.push(itemBox);
                self.insertBox.append(itemBox);
            });
            //设置位置
            $(self.createArr).each(function(i,elem){
                elem.fadeIn();
                self.setOtherPos(self.colsArr,elem);
            });
        },
        init:function(){//设置容器的宽度、居中
            var self=this;
            //记录一下几列
            this.colSize=Math.floor(this.insertBoxW/this.colW);
            //设置一个数组记录
            this.colsArr=[];

            //将前8个元素高度插入到数组中
            this.itemBoxs.each(function(i,elem){
                if(i<self.colSize){//添加到数组中
                    self.colsArr.push($(elem).outerHeight());
                    $(elem).css({left:i*self.colW,top:0});
                }else{
                    //设置剩余的元素位置
                    self.setOtherPos(self.colsArr,$(elem));
                };
            });
            //设置下容器的宽高
            self.setInsertBoxHeight(self.colsArr);
            self.insertBox.width(self.colW*self.colSize);
        },
        setOtherPos:function(colArr,curElem){
            //获取最小的值
            var minV=Math.min.apply(null,colArr);
            var index=this.getIndex(colArr,minV);
            curElem.css({
                        top:minV,
                        left:index*this.colW
                        });
            //重置一下原来的值
            colArr[index]+=curElem.outerHeight();
        },
        getIndex:function(arr,val){//匹配数组中最小的值
            for(var i=0;i<arr.length;i++){
                if(arr[i]==val){return i;break;};
            };
        },
        setInsertBoxHeight:function(arr){
            //设置一下容器的高度
            this.insertBox.height(Math.max.apply(null,arr));
        }
    };
    //注册到全局对象上
    window.WaterFlowlayout=WaterFlowlayout;
})(jQuery);

DOM:

<div id="main-wrap">
    <div class="item-box">
        <div class="pic">
            <img src="images/1.jpg">
        </div>
    </div>

    <div class="item-box">
        <div class="pic">
            <img src="images/2.jpg">
        </div>
    </div>
    <div class="item-box">
        <div class="pic">
            <img src="images/4.jpg">
        </div>
    </div>
    <div class="item-box">
        <div class="pic">
            <img src="images/5.jpg">
        </div>
    </div>
    <div class="item-box">
        <div class="pic">
            <img src="images/6.jpg">
        </div>
    </div>
    <div class="item-box">
        <div class="pic">
            <img src="images/1.jpg">
        </div>
    </div>
    <div class="item-box">
        <div class="pic">
            <img src="images/7.jpg">
        </div>
    </div>

    <div class="item-box">
        <div class="pic">
            <img src="images/8.jpg">
        </div>
    </div>
    <div class="item-box">
        <div class="pic">
            <img src="images/9.jpg">
        </div>
    </div>
    <div class="item-box">
        <div class="pic">
            <img src="images/10.jpg">
        </div>
    </div>
    <div class="item-box">
        <div class="pic">
            <img src="images/11.jpg">
        </div>
    </div>
    <div class="item-box">
        <div class="pic">
            <img src="images/12.jpg">
        </div>
    </div>
    <div class="item-box">
        <div class="pic">
            <img src="images/10.jpg">
        </div>
    </div>
    <div class="item-box">
        <div class="pic">
            <img src="images/3.jpg">
        </div>
    </div>
    <div class="item-box">
        <div class="pic">
            <img src="images/4.jpg">
        </div>
    </div>
    <div class="item-box">
        <div class="pic">
            <img src="images/5.jpg">
        </div>
    </div>
    <div class="item-box">
        <div class="pic">
            <img src="images/6.jpg">
        </div>
    </div>
    <div class="item-box">
        <div class="pic">
            <img src="images/1.jpg">
        </div>
    </div>
    <div class="item-box">
        <div class="pic">
            <img src="images/7.jpg">
        </div>
    </div>

    <div class="item-box">
        <div class="pic">
            <img src="images/8.jpg">
        </div>
    </div>
    <div class="item-box">
        <div class="pic">
            <img src="images/9.jpg">
        </div>
    </div>
    <div class="item-box">
        <div class="pic">
            <img src="images/10.jpg">
        </div>
    </div>
    <div class="item-box">
        <div class="pic">
            <img src="images/11.jpg">
        </div>
    </div>
    <div class="item-box">
        <div class="pic">
            <img src="images/12.jpg">
        </div>
    </div>
    <div class="item-box">
        <div class="pic">
            <img src="images/10.jpg">
        </div>
    </div>
</div>
<div id="loading" class="loading">正在加载中...</div>

创建:

var demo=new WaterFlowlayout($("#main-wrap"),$("#loading"),{
                                          callBack:function(){
                                                          //新加载的数据
                                                        demo.reloadView([
                                                                    {src:"images/16.jpg"},
                                                                    {src:"images/17.jpg"},
                                                                    {src:"images/18.jpg"},
                                                                    {src:"images/19.jpg"},
                                                                    {src:"images/20.jpg"},
                                                                    {src:"images/16.jpg"}
                                                                ]
                                                        );
                                                  }
                                          });
时间: 2024-10-14 16:14:40

流行的瀑布流布局效果的相关文章

Metro风兼搭HTML5瀑布流布局效果

<!doctype html> <html> <head> <meta charset="UTF-8" /> <title>Metro风兼搭HTML5瀑布流布局效果丨</title> <style> body{background:#000;} .myMetro{position:relative;overflow:hidden;zoom:1;margin:0 auto;} .MBox{float:le

javascript瀑布流布局效果

10几款网站瀑布流布局图片无限加载动效

jQuery选项卡形式图片瀑布流布局选项卡切换效果代码 jquery masonry瀑布流插件制作图片瀑布流布局代码 原生js简单瀑布流图片无限加载带鼠标悬停图片遮罩效果 jquery masonry瀑布流插件制作图片瀑布流布局代码 jquery柔韧性的图片滑动瀑布流布局 jquery时间轴插件文字图片瀑布流布局时间轴特效(不兼容IE678) modernizr html5图片预加载瀑布流布局鼠标悬停动画效果代码 jquery.waterfall.js自动底部填充对齐的瀑布流布局代码 jquer

利用JS实现简单的瀑布流效果

哈哈, 我又来啦, 在这一段时间里, 我简单的学习了一下javascript(JS), 虽然不是很懂啦, 但是我也简单的尝试着做了点小东西, 就比如现在流行的瀑布流效果, 经过我的努力终于成功的完成了, 虽然中间非常的坎坷, 并不是一帆风顺但是最终我还是实现了个简单的效果, 下面就为大家简单的介绍下, 不知道的友友们, 有兴趣的话, 可以来参考下, 欢迎指出缺点和不足! 一.瀑布流之准备工作   首先声明下, 为了方便演示和联系, 我使用的是本地图片, 如果大家有需要的话可以尝试着写下网络的,

网页瀑布流布局jQuery实现代码

网页瀑布流布局jQuery实现代码 这篇文章主要为大家详细介绍了网页瀑布流布局jQuery实现方式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 什么是瀑布流网页布局? 瀑布流,又称瀑布流式布局.是比较流行的一种网站页面布局,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部. 下面来看代码,用纯CSS3来做看效果怎样! HTML 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 2

jquery.masonry + jquery.infinitescroll 实现瀑布流布局

转载自:http://www.cnblogs.com/liubiaocai/archive/2013/04/26/3044503.html 最近瀑布流布局非常流行,国内大大小小的瀑布流布局的网站都很多了,比如美丽说.蘑菇街.花瓣等,关于瀑布流布局的资料打开可以百度自己看了,这里介绍两个jquey插件实现瀑布流布局和动态加载数据(分页加载). 1.jquery.masonry,目前布局流行的瀑布流插件有很多,http://www.csswang.com/resource/2261.html,这里有

瀑布流布局使用详解——JQuery插件Isotope(动态实现子项目筛选)

瀑布流布局,听起来听牛逼的样子,其实就是简单的子元素筛选功能.不过这一功能在网站页面布局当中还是很常用的,特别是在电商网站中 经常会有点一个钮筛选,然后页面的子元素刷的以下变了样.接下来,我们先简单介绍下概念和用法,然后详解这一功能的实现. 瀑布流概念: 又称瀑布流式布局,是比较流行的一种网站页面布局方式.视觉表现为多栏布局,附带筛选功能,当下在国内十分流行. 瀑布流原理: 通过为子元素定义不同的class类名,然后通过类名及其内容进行筛选排序.   这一插件在实现网站元素动态切换,调整整体顺序

jQuery+HTML5图片瀑布流效果

JavaScript与HTML5实现美女瀑布流布局,本方法是把图片的路径写在了JS的数组里,不过重点好像不是在这里,而是在图片如何自动排列的问题,你可以运行本实例后,点击“加载瀑布流布局”按钮,即可看到图片的瀑布流排列效果,现在很流行这个,希望您从本代码中能找到一些灵感. <!DOCTYPE HTML> <html> <head> <title>jQuery+HTML5图片瀑布流效果丨河北电动叉车|石家庄苗木</title> <style

微信小程序 瀑布流布局

今天做小程序的时候,碰到一个比较常见的需求,就是要瀑布流布局,两列,交错分布,大概如下图 最终要实现的结果就是如左图所示. 不过在微信小程序里面,不能通过JavaScript来直接操作dome,所以一些常用的方法在这里都没有办法用了.这让笔者非常着急,因为项目比较赶,不能因为这种低级的布局问题拖慢了进度. 百度了半天,发现了css3的column这个属性,但是最后实现出来的方法就如右图所示,这不符合需求,需求是两列,从左到右进行排列的,大概就像小红书APP那种瀑布流布局 最后笔者终于找到一种非常