jQuery实现瀑布流布局


Posted in Javascript onDecember 12, 2014

HTML

 <div id="main">

         <div class="box">

             <div class="pic">

                 <img src="images/0.jpg" alt="">

             </div>

         </div>

         <div class="box">

             <div class="pic">

                 <img src="images/1.jpg" alt="">

             </div>

         </div>

         <div class="box">

             <div class="pic">

                 <img src="images/2.jpg" alt="">

             </div>

         </div>

         <div class="box">

             <div class="pic">

                 <img src="images/3.jpg" alt="">

             </div>

         </div>

         <div class="box">

             <div class="pic">

                 <img src="images/4.jpg" alt="">

             </div>

         </div>

         <div class="box">

             <div class="pic">

                 <img src="images/2.jpg" alt="">

             </div>

         </div>

 </div>

CSS

 * {

     margin: 0;

     padding: 0;

 }

 #main {

     position: relative;

 }

 .box {

     padding:15px 0 0 15px;

     float:left;

 }

 .pic {

     padding: 10px;

     border: 1px solid #ccc;

     border-radius: 5px;

     box-shadow: 0px 0px 5px #ccc;

     img {

         width:165px;

         height:auto;

     }

 }

JavaScript

 $(window).on("load",function () {

     waterfall();

     var dataInt = { "data":[{"src":"7.jpg"},{"src":"8.jpg"},{"src":"9.jpg"},{"src":"6.jpg"}]}

     //模拟json数据;

     $(window).on("scroll",function () {

         if(checkScrollSlide){

             $.each(dataInt.data,function (key,value) {

                 var oBox=$("<div>").addClass("box").appendTo($("#main"));

                 //jQuery支持连缀,隐式迭代;

                 var oPic=$("<div>").addClass('pic').appendTo($(oBox));

                 $("<img>").attr("src","images/"+$(value).attr("src")).appendTo(oPic);

             });

             waterfall();

         }

     })

 });

 //流式布局主函数;

 function waterfall () {

     var $boxs=$("#main>div");

     //获取#main元素下的直接子元素div.box;

     //获取每一列的宽度;

     var w=$boxs.eq(0).outerWidth();

     //outerWidth()获取包含padding和border在内的宽度;

     //var w=$boxs.eq(0).width();

     //width()只能获取给元素定义的宽度;

     var cols=Math.floor($(window).width()/w);

     //获取多少列;

     $("#main").width(w*cols).css("margin","0 auto");

     //设置#main元素的宽度和居中样式;

     var hArr=[];

     //每一列高度的集合;

     $boxs.each(function (index,value) {

     //遍历每一个box元素;

     //为了找到之前所有元素的最低点,然后将本元素设置到最低点之下;

         var h=$boxs.eq(index).outerHeight();

         //每一个box元素的高,

         if (index<cols) {

             hArr[index]=h;

             //确定每列第一个元素的高度;

         } else{

             var minH=Math.min.apply(null,hArr);

             //得出列高数组中的最小高度;

             var minHIndex=$.inArray(minH,hArr);

             //$.inArray()方法得出元素(minH)在数组(hArr)中的index值;

             //console.log(value);

             //此时的value是第一行之后的所有的box元素的DOM对象!;

             $(value).css({

             //$(value):将DOM对象转换成jQuery对象,才能继续使用jQuery方法;

                 "position":"absolute",

                 "top":minH+"px",

                 "left":minHIndex*w+"px"

             });

             hArr[minHIndex]+=$boxs.eq(index).outerHeight();

             //最低高元素的高度+刚添加到最低高度下的元素的高度=新的列高;

         };

     });

     // console.log(hArr);

 };

 function checkScrollSlide () {

     var $lastBox=$("#main>div").last();

     var lastBoxDis=$lastBox.offset().top+Math.floor($lastBox.outerHeight()/2);

     var scrollTop=$(window).scrollTop();

     var documentH=$(window).height();

     return (lastBoxDis<scrollTop+documentH)?true:false;

 }

详细解释清仔细参考注释吧,我就不单独再拉出来写了。

Javascript 相关文章推荐
Javascript的&amp;&amp;和||的另类用法
Jul 23 Javascript
jQuery插件multiScroll实现全屏鼠标滚动切换页面特效
Apr 12 Javascript
Hallo.js基于jQuery UI所见即所得的Web编辑器
Jan 26 Javascript
jquery Deferred 快速解决异步回调的问题
Apr 05 Javascript
干货!教大家如何选择Vue和React
Mar 13 Javascript
原生js FileReader对象实现图片上传本地预览效果
Mar 27 Javascript
vue中的$emit 与$on父子组件与兄弟组件的之间通信方式
May 13 Javascript
jquery实现动态添加附件功能
Oct 23 jQuery
JavaScript数据结构与算法之二叉树实现查找最小值、最大值、给定值算法示例
Mar 01 Javascript
微信小程序的开发范式BeautyWe.js入门详解
Jul 10 Javascript
js中关于Blob对象的介绍与使用
Nov 29 Javascript
JavaScript设计模式---单例模式详解【四种基本形式】
May 16 Javascript
jquery+ajax验证不通过也提交表单问题处理
Dec 12 #Javascript
js 左右悬浮对联广告代码示例
Dec 12 #Javascript
原生JavaScript+LESS实现瀑布流
Dec 12 #Javascript
jquery禁止回车触发表单提交
Dec 12 #Javascript
完美兼容各大浏览器的jQuery插件实现图片切换特效
Dec 12 #Javascript
windows8.1+iis8.5下安装node.js开发环境
Dec 12 #Javascript
jQuery 和 CSS 的文本特效插件集锦
Dec 12 #Javascript
You might like
解析PHP中数组元素升序、降序以及重新排序的函数
2013/06/20 PHP
php类中的$this,static,final,const,self这几个关键字使用方法
2015/12/14 PHP
关于PHP中字符串与多进制转换函数的实例代码
2016/11/03 PHP
thinkphp实现把数据库中的列的值存到下拉框中的方法
2017/01/20 PHP
三个思路解决laravel上传文件报错:413 Request Entity Too Large问题
2017/11/13 PHP
Javascript var变量隐式声明方法
2009/10/19 Javascript
JavaScript中SQL语句的应用实现
2010/05/04 Javascript
jQuery 阴影插件代码分享
2012/01/09 Javascript
仅IE支持clearAttributes/mergeAttributes方法使用介绍
2012/05/04 Javascript
JQuery实现的购物车功能(可以减少或者添加商品并自动计算价格)
2015/01/13 Javascript
JavaScript实现多栏目切换效果
2016/12/12 Javascript
Node.js 实现简单的接口服务器的实例代码
2017/05/23 Javascript
vue-cli + sass 的正确打开方式图文详解
2017/10/27 Javascript
禁止弹窗中蒙层底部页面跟随滚动的几种方法
2017/12/07 Javascript
vue引入ueditor及node后台配置详解
2018/01/03 Javascript
python实现的登陆Discuz!论坛通用代码分享
2014/07/11 Python
使用Python编写vim插件的简单示例
2015/04/17 Python
python中利用xml.dom模块解析xml的方法教程
2017/05/24 Python
Centos 升级到python3后pip 无法使用的解决方法
2018/06/12 Python
使用python将图片格式转换为ico格式的示例
2018/10/22 Python
Python使用pyshp库读取shapefile信息的方法
2018/12/29 Python
使用Python将Mysql的查询数据导出到文件的方法
2019/02/25 Python
python中的colorlog库使用详解
2019/07/05 Python
Python使用python-docx读写word文档
2019/08/26 Python
python框架django项目部署相关知识详解
2019/11/04 Python
Python+OpenCV实现将图像转换为二进制格式
2020/01/09 Python
python ImageDraw类实现几何图形的绘制与文字的绘制
2020/02/26 Python
django admin 根据choice字段选择的不同来显示不同的页面方式
2020/05/13 Python
CSS3——齿轮转动关键代码
2013/05/02 HTML / CSS
小学教师管理制度
2014/01/18 职场文书
银行服务感言
2014/03/01 职场文书
董事长助理工作职责
2014/06/08 职场文书
教师节横幅标语
2014/10/08 职场文书
环保证明
2015/06/23 职场文书
党组织结对共建协议书
2016/03/23 职场文书
Redis集群新增、删除节点以及动态增加内存的方法
2021/09/04 Redis