javascript瀑布流代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> <style> * { margin: 0; padding: 0; } .box { float: left; border: 1px solid #ccc; padding: 5px; } </style> </head> <body> <div id="container"> <!--(.box>img[src="images/P_00$.jpg"])*9--> <div class="box"><img src="images/P_000.jpg" alt=""/></div> <div class="box"><img src="images/P_001.jpg" alt=""/></div> <div class="box"><img src="images/P_002.jpg" alt=""/></div> <div class="box"><img src="images/P_003.jpg" alt=""/></div> <div class="box"><img src="images/P_004.jpg" alt=""/></div> <div class="box"><img src="images/P_005.jpg" alt=""/></div> <div class="box"><img src="images/P_006.jpg" alt=""/></div> <div class="box"><img src="images/P_007.jpg" alt=""/></div> <div class="box"><img src="images/P_008.jpg" alt=""/></div> <div class="box"><img src="images/P_009.jpg" alt=""/></div> <div class="box"><img src="images/P_010.jpg" alt=""/></div> <div class="box"><img src="images/P_011.jpg" alt=""/></div> <div class="box"><img src="images/P_012.jpg" alt=""/></div> <div class="box"><img src="images/P_013.jpg" alt=""/></div> <div class="box"><img src="images/P_014.jpg" alt=""/></div> <div class="box"><img src="images/P_015.jpg" alt=""/></div> <div class="box"><img src="images/P_016.jpg" alt=""/></div> <div class="box"><img src="images/P_017.jpg" alt=""/></div> <div class="box"><img src="images/P_018.jpg" alt=""/></div> <div class="box"><img src="images/P_019.jpg" alt=""/></div> <div class="box"><img src="images/P_000.jpg" alt=""/></div> <div class="box"><img src="images/P_001.jpg" alt=""/></div> <div class="box"><img src="images/P_002.jpg" alt=""/></div> <div class="box"><img src="images/P_003.jpg" alt=""/></div> <div class="box"><img src="images/P_004.jpg" alt=""/></div> <div class="box"><img src="images/P_005.jpg" alt=""/></div> <div class="box"><img src="images/P_006.jpg" alt=""/></div> <div class="box"><img src="images/P_007.jpg" alt=""/></div> <div class="box"><img src="images/P_008.jpg" alt=""/></div> <div class="box"><img src="images/P_009.jpg" alt=""/></div> <div class="box"><img src="images/P_010.jpg" alt=""/></div> <div class="box"><img src="images/P_011.jpg" alt=""/></div> <div class="box"><img src="images/P_012.jpg" alt=""/></div> <div class="box"><img src="images/P_013.jpg" alt=""/></div> <div class="box"><img src="images/P_014.jpg" alt=""/></div> <div class="box"><img src="images/P_015.jpg" alt=""/></div> <div class="box"><img src="images/P_016.jpg" alt=""/></div> <div class="box"><img src="images/P_017.jpg" alt=""/></div> <div class="box"><img src="images/P_018.jpg" alt=""/></div> <div class="box"><img src="images/P_019.jpg" alt=""/></div> </div> <script> //因为涉及到了图片宽高 所以要写在window.onload里面 //第一行是通过左浮动 自然摆放 //后面是通过JS计算 高度最小的那一行 然后把图片放到那个位置 window.onload = function () { //找人 var container = document.getElementById("container"); var boxes = container.children;//所有的盒子 //1.找出谁是第一行 //计算第一行有多少张 或者也就是 页面上有多少列 //一行有多少张实际上 就是 页面的宽度 / 盒子的宽度 //页面宽度 var pageWidth = window.innerWidth; //盒子的宽度 var boxWidth = boxes[0].offsetWidth; var column = Math.floor(pageWidth / boxWidth);//都是整数 所以要向下取整 //console.log(column); //2.用一个数组保存 每一列的高度 找出最小值 和最小值的索引 var arrHeight = []; //把每一列的初始高度 保存到数组中 function waterfall() { //找出所有的盒子并处理 for (var i = 0; i < boxes.length; i++) { //先只找出第一行的所有的盒子 if (i < column) { //boxes[i]//第一行的盒子 //把第一行的盒子的高度放到数组中 arrHeight[i] = boxes[i].offsetHeight; } else { //第一行盒子之后的盒子 //根据 保存每行高度的数组中的 最小值去摆放 var minHeight = getMin(arrHeight).value;//最小的高度 var minHeightIndex = getMin(arrHeight).index;//高度最小的那一列 //摆放盒子其实就是设置盒子的top和left //要想设置位置 先要加定位 boxes[i].style.position = "absolute"; //设置top值 top值就是高度最小的那一列现在的高度 boxes[i].style.top = minHeight + "px"; //设置left值 left值就是 高度最小的那一列所有图片的offsetLeft //其中第一行的最好找 boxes[i].style.left = boxes[minHeightIndex].offsetLeft + "px"; //放置图片后 当前列的高度发生了变化 我们要对数组的值进行更新 //然后 后续的循环才能根据新的数组 来重新寻找最小值 //给数组中之前 数值最小的那一项 加上当前这个图片的高度 //在之前的高度的基础上 再加上 新加入的图片的高度 arrHeight[minHeightIndex] = minHeight + boxes[i].offsetHeight; } } } waterfall(); //console.log(arrHeight); //console.log(minHeight); //console.log(minHeightIndex); //5.判断触底 window.onscroll = function () { if (bottomed()) { //alert("触底了,要加载图片了"); //加载图片 var json = [ {"src": "images/P_000.jpg"}, {"src": "images/P_001.jpg"}, {"src": "images/P_002.jpg"}, {"src": "images/P_003.jpg"}, {"src": "images/P_004.jpg"}, {"src": "images/P_005.jpg"}, {"src": "images/P_006.jpg"}, {"src": "images/P_007.jpg"}, {"src": "images/P_008.jpg"}, {"src": "images/P_009.jpg"}, ]; //.box>img for (var i = 0; i < json.length; i++) { //json[i]//每一条数据 var div = document.createElement("div"); div.className = "box"; container.appendChild(div); var img = document.createElement("img"); img.src = json[i].src; div.appendChild(img); //新加载出来的盒子 样式有问题 需要重新通过JS设置位置 waterfall(); } } }; function bottomed() { //窗口的高度+页面被卷去的头部 > 最后一个盒子的offsetTop //窗口的高度 var clientHeight = window.innerHeight; //页面被卷去的头部 var scrollTop = window.pageYOffset; //最后一个盒子的offsetTop var lastBox = boxes[boxes.length - 1];//最后的盒子 var lastBoxTop = lastBox.offsetTop; //窗口的高度+页面被卷去的头部 > 最后一个盒子的offsetTop if (clientHeight + scrollTop > lastBoxTop) { return true;//表示触底了 } return false;//没有触底 } }; function getMin(arr) { var min = {}; min.index = 0;//最小值的索引 min.value = arr[min.index];//最小值的值 //遍历数组 一个一个比较 for (var i = 0; i < arr.length; i++) { if (min.value > arr[i]) { min.value = arr[i]; min.index = i; } } return min; } </script> </body> </html>