87941037 2019-04-19
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; }
详细解释清仔细参考注释吧,我就不单独再拉出来写了。