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 相关文章推荐
jQuery.getScript加载同域JS的代码
Feb 13 Javascript
jquery组件使用中遇到的问题整理及解决
Feb 21 Javascript
浅谈JavaScript Array对象
Dec 29 Javascript
自己封装的常用javascript函数分享
Jan 07 Javascript
浅析JavaScript事件和方法
Feb 28 Javascript
jquery实现实时改变网页字体大小、字体背景色和颜色的方法
Aug 05 Javascript
jquery捕捉回车键及获取checkbox值与异步请求的方法
Dec 24 Javascript
JavaScript头像上传插件源码分享
Mar 29 Javascript
基于JQuery实现图片上传预览与删除操作
May 24 Javascript
Node.js中Koa2在控制台输出请求日志的方法示例
May 02 Javascript
layui form.render('select', 'test2') 更新渲染的方法
Sep 27 Javascript
layui实现数据表格隐藏列的示例
Oct 25 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结合表单实现一些简单功能的例子
2011/06/04 PHP
php二分查找二种实现示例
2014/03/12 PHP
比较搞笑的js陷阱题
2010/02/07 Javascript
JS 文件传参及处理技巧分析
2010/05/13 Javascript
用jQuery中的ajax分页实现代码
2011/09/20 Javascript
js通过googleAIP翻译PHP系统的语言配置的实现代码
2011/10/17 Javascript
Node.js中require的工作原理浅析
2014/06/24 Javascript
jquery获取当前元素索引值用法实例
2015/06/10 Javascript
bootstrap laydate日期组件使用详解
2017/01/04 Javascript
Vue组件中slot的用法
2018/01/30 Javascript
Vue父组件如何获取子组件中的变量
2019/07/24 Javascript
vue 组件内获取actions的response方式
2019/11/08 Javascript
VSCode搭建React Native环境
2020/05/07 Javascript
解决Vue watch里调用方法的坑
2020/11/07 Javascript
video.js添加自定义组件的方法
2020/12/09 Javascript
[00:17]游戏风云独家报道:DD赛后说出数字秘密 吓死你们啊!
2014/07/13 DOTA
解决Python运行文件出现out of memory框的问题
2018/12/03 Python
Python3爬虫全国地址信息
2019/01/05 Python
Python字符串内置函数功能与用法总结
2019/04/16 Python
详解Python用三种方式统计词频的方法
2019/07/29 Python
详解Python在使用JSON时需要注意的编码问题
2019/12/06 Python
python使用正则表达式(Regular Expression)方法超详细
2019/12/30 Python
python3 配置logging日志类的操作
2020/04/08 Python
美国杂志订阅折扣与优惠网站:Magazines.com
2016/08/31 全球购物
PUMA官方商城:世界领先的运动品牌之一
2016/11/16 全球购物
Penhaligon’s英国官网:成立于1870年的英国香水制造商
2021/02/18 全球购物
小学毕业家长寄语
2014/01/19 职场文书
2014最新预备党员思想汇报范文:中国梦,我的梦
2014/10/25 职场文书
2015年街道办事处工作总结
2015/05/22 职场文书
2016年五一劳动节专题校园广播稿
2015/12/17 职场文书
甜美蛋糕店的创业计划书模板,拿来即用!
2019/08/21 职场文书
RPM包方式安装Oracle21c的方法详解
2021/08/23 Oracle
SSM VUE Axios详解
2021/10/05 Vue.js
Java异常处理try catch的基本用法
2021/12/06 Java/Android
Nginx工作模式及代理配置的使用细节
2022/03/21 Servers
微信小程序实现轮播图指示器
2022/06/25 Javascript