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 相关文章推荐
JS按位非(~)运算符与~~运算符的理解分析
Jul 31 Javascript
网页整体变灰白色(兼容各浏览器)实例
Apr 21 Javascript
javascript事件冒泡和事件捕获详解
May 26 Javascript
jQuery自定义数值抽奖活动代码
Jun 11 Javascript
微信小程序 Canvas增强组件实例详解及源码分享
Jan 04 Javascript
AngularJS1.X学习笔记2-数据绑定详解
Apr 01 Javascript
ES6中新增的Object.assign()方法详解
Sep 22 Javascript
angular1配合gulp和bower的使用教程
Jan 19 Javascript
vue中element 上传功能的实现思路
Jul 06 Javascript
vue-resource请求实现http登录拦截或者路由拦截的方法
Jul 11 Javascript
vue-cli3项目展示本地Markdown文件的方法
Jun 07 Javascript
微信小程序 wxParse插件显示视频问题
Sep 27 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中删除数组的第一个元素和最后一个元素的函数
2015/03/07 PHP
PHP设计模式之工厂方法设计模式实例分析
2018/04/25 PHP
用js+xml自动生成表格的东西
2006/12/21 Javascript
js操作Xml(向服务器发送Xml,处理服务器返回的Xml)(IE下有效)
2009/01/30 Javascript
JavaScript 组件之旅(三):用 Ant 构建组件
2009/10/28 Javascript
网站内容禁止复制和粘贴、另存为的js代码
2014/02/26 Javascript
node.js中的fs.futimesSync方法使用说明
2014/12/17 Javascript
JQUERY表单暂存功能插件分享
2016/02/23 Javascript
jQuery使用$.each遍历json数组的简单实现方法
2016/04/18 Javascript
JS实现漂亮的时间选择框效果
2016/08/20 Javascript
vue使用xe-utils函数库的具体方法
2018/03/06 Javascript
JS 实现微信扫一扫功能
2018/09/14 Javascript
vue自定义表单生成器form-create使用详解
2019/07/19 Javascript
JS中的算法与数据结构之链表(Linked-list)实例详解
2019/08/20 Javascript
Nodejs环境实现socket通信过程解析
2020/07/03 NodeJs
[57:37]EG vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
[01:11:32]VG vs FNATIC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
在Python中进行自动化单元测试的教程
2015/04/15 Python
Python有序查找算法之二分法实例分析
2017/12/11 Python
Django自定义过滤器定义与用法示例
2018/03/22 Python
使用python进行文本预处理和提取特征的实例
2018/06/05 Python
Python中psutil的介绍与用法
2019/05/02 Python
使用pyplot.matshow()函数添加绘图标题
2020/06/16 Python
Python 基于jwt实现认证机制流程解析
2020/06/22 Python
浅析python函数式编程
2020/09/26 Python
天逸系统(武汉)有限公司Java笔试题
2015/12/29 面试题
什么是SCM(软件配置管理)
2014/08/16 面试题
写一个函数,要求输入一个字符串和一个字符长度,对该字符串进行分隔
2015/07/30 面试题
人力资源管理毕业生自荐信
2013/11/21 职场文书
新闻记者个人求职的自我评价
2013/11/28 职场文书
大学生军训感想
2014/02/16 职场文书
生产设备维护保养制度
2015/08/06 职场文书
python开发实时可视化仪表盘的示例
2021/05/07 Python
JS的深浅复制详细
2021/10/16 Javascript
多人盗宝《绿林侠盗》第三赛季4.5上线 跨平台实装
2022/04/03 其他游戏
GoFrame框架数据校验之校验结果Error接口对象
2022/06/21 Golang