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 对象的解释
Nov 24 Javascript
jQuery get和post 方法传值注意事项
Nov 03 Javascript
JQuery的Validation插件中Remote验证的中文问题
Jul 26 Javascript
JavaScript日期时间格式化函数分享
May 05 Javascript
详解Vue 实例中的生命周期钩子
Mar 21 Javascript
ES6新特性之模块Module用法详解
Apr 01 Javascript
JS运动改变单物体透明度的方法分析
Jan 23 Javascript
webuploader实现上传图片到服务器功能
Aug 16 Javascript
vue打包使用Nginx代理解决跨域问题
Aug 27 Javascript
Node.js EventEmmitter事件监听器用法实例分析
Jan 07 Javascript
Vue中keep-alive 实现后退不刷新并保持滚动位置
Mar 17 Javascript
Jquery+AJAX实现无刷新上传并重命名文件操作示例【PHP后台接收】
May 29 jQuery
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.ini不生效问题解决方法(上传大于8M的文件)
2013/06/14 PHP
php中json_encode处理gbk与gb2312中文乱码问题的解决方法
2014/07/10 PHP
php上传图片客户端和服务器端实现方法
2015/03/30 PHP
PHP数学运算函数大汇总(经典值得收藏)
2016/04/01 PHP
实例分析10个PHP常见安全问题
2019/07/09 PHP
javascript学习笔记(十六) 系统对话框(alert、confirm、prompt)
2012/06/20 Javascript
Javascript拓展String方法小结
2013/07/08 Javascript
JS文本框追加多个下拉框的值的简单实例
2013/07/12 Javascript
Extjs 4.x 得到form CheckBox 复选框的值
2014/05/04 Javascript
vue router路由嵌套不显示问题的解决方法
2017/06/17 Javascript
JavaScript实现单击网页任意位置打开新窗口与关闭窗口的方法
2017/09/21 Javascript
详解Webstorm 新建.vue文件支持高亮vue语法和es6语法
2017/10/26 Javascript
JS深入学习之数组对象排序操作示例
2020/05/01 Javascript
[01:12:35]Spirit vs Navi Supermajor小组赛 A组败者组第一轮 BO3 第二场 6.2
2018/06/03 DOTA
Python操作串口的方法
2015/06/17 Python
Python抓取框架 Scrapy的架构
2016/08/12 Python
Python基于scapy实现修改IP发送请求的方法示例
2017/07/08 Python
Python编程之Re模块下的函数介绍
2017/10/28 Python
Python设计模式之代理模式简单示例
2018/01/09 Python
Tensorflow实现神经网络拟合线性回归
2019/07/19 Python
Tensorflow:转置函数 transpose的使用详解
2020/02/11 Python
pycharm激活码免费分享适用最新pycharm2020.2.3永久激活
2020/11/25 Python
英国蛋糕装饰用品一站式商店:Craft Company
2019/03/18 全球购物
CheapTickets香港机票预订网站:CheapTickets.hk
2019/06/26 全球购物
Mountain Hardwear官网:攀岩服装和户外装备
2019/09/26 全球购物
美国在线和移动免费会员制批发零售商:Boxed(移动端的Costco)
2020/01/02 全球购物
婚礼证婚人证婚词
2014/01/13 职场文书
应聘销售主管的求职信
2014/04/26 职场文书
感恩之星事迹材料
2014/05/03 职场文书
电子商务专业求职信
2014/07/10 职场文书
2014教师教育实践活动对照检查材料思想汇报
2014/09/21 职场文书
2014年最新个人对照检查材料范文
2014/09/25 职场文书
暑期社会实践证明书
2014/11/17 职场文书
2014年科普工作总结
2014/12/06 职场文书
写好求职信的技巧解密
2019/05/14 职场文书
CSS 实现Chrome标签栏的技巧
2021/08/04 HTML / CSS