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 比较时间大小的代码
Apr 24 Javascript
10款新鲜出炉的 jQuery 插件(Ajax 插件,有幻灯片、图片画廊、菜单等)
Jun 08 Javascript
JavaScript学习笔记(二) js对象
Oct 25 Javascript
JS验证邮箱格式是否正确的代码
Dec 05 Javascript
JS和JQ的event对象区别分析
Nov 24 Javascript
jQuery实现带有动画效果的回到顶部和底部代码
Nov 04 Javascript
无缝滚动的简单实现代码(推荐)
Jun 07 Javascript
解决Vue打包之后文件路径出错的问题
Mar 06 Javascript
JS多个表单数据提交下的serialize()应用实例分析
Aug 27 Javascript
es6数组的flat(),flatMap()函数用法实例分析
Apr 18 Javascript
浅谈Vuex的this.$store.commit和在Vue项目中引用公共方法
Jul 24 Javascript
Vue 同步异步存值取值实现案例
Aug 05 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中使用Akismet防止垃圾评论的代码
2011/06/10 PHP
php使用gearman进行任务分发操作实例详解
2020/02/26 PHP
one.php 多项目、函数库、类库 统一为一个版本的方法
2020/08/24 PHP
5 cool javascript apps
2007/03/24 Javascript
Javascript 实用小技巧
2010/04/07 Javascript
jquery中的mouseleave和mouseout的区别 模仿下拉框效果
2012/02/07 Javascript
jQuery避免$符和其他JS库冲突的方法对比
2014/02/20 Javascript
Jquery插件编写简明教程
2014/03/25 Javascript
jquery如何把数组变为字符串传到服务端并处理
2014/04/30 Javascript
jQuery中prependTo()方法用法实例
2015/01/08 Javascript
15个值得开发人员关注的jQuery开发技巧和心得总结【经典收藏】
2016/05/25 Javascript
仅一个form表单 js实现注册信息依次填写提交功能
2016/06/12 Javascript
深入理解AngularJS中的ng-bind-html指令和$sce服务
2016/09/08 Javascript
d3.js实现简单的网络拓扑图实例代码
2016/11/06 Javascript
微信小程序实现登录页云层漂浮的动画效果
2017/05/05 Javascript
基于Jquery Ajax type的4种类型(详解)
2017/08/02 jQuery
解决微信二次分享不显示摘要和图片的问题
2017/08/18 Javascript
浅谈Angular路由守卫
2017/08/26 Javascript
vue判断input输入内容全是空格的方法
2018/03/02 Javascript
Node.js log4js日志管理详解
2018/07/31 Javascript
解决Vue axios post请求,后台获取不到数据的问题方法
2018/08/11 Javascript
用vue 实现手机触屏滑动功能
2020/05/28 Javascript
vue实现动态给id赋值,点击事件获取当前点击的元素的id操作
2020/11/09 Javascript
在Python下利用OpenCV来旋转图像的教程
2015/04/16 Python
Sephora丝芙兰印尼官方网站:购买化妆品和护肤品
2018/07/02 全球购物
Huda Beauty官方商店:化妆和美容产品
2020/09/05 全球购物
类的返射机制中的包及核心类
2016/09/12 面试题
药物学专业学生的自我评价
2013/10/27 职场文书
大学同学聚会邀请函
2014/01/19 职场文书
中医学专业自荐信范文
2014/04/01 职场文书
论文指导教师评语
2014/04/28 职场文书
学雷锋标兵事迹材料
2014/08/18 职场文书
2014年企业党支部工作总结
2014/12/04 职场文书
写给老师的感谢信
2015/01/20 职场文书
北京故宫的导游词
2015/01/31 职场文书
承诺书的内容有哪些,怎么写?
2019/06/21 职场文书