瀑布流的效果 原理是初始列数top值为0,然后将第一行的高度添加到一个新的数组里,从第二行开始根据储存高度这个数组来,确定最低高度列,然后向最低高度列添加展示数据; 效果图:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <title>Document</title> <style> * { margin: 0; padding: 0; position: relative; } img { width: 220px; display: block; } .item { box-shadow: 2px 2px 2px #999; position: absolute; } #box { width: 816px; position: relative; } #box div { position:absolute; width: 198px; border: 1px solid #ddd; margin-left: 4px; } </style> </head> <body> <div id="box"> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> </div> </body> <script type="text/javascript"> /** * [ 用来生成瀑布流,不足之处 没有做dom优化在某种极端的情况下,会增加浏览器负担; 待优化 由于是使用定位所以父级是没有高度的] * @return {[type]} [description] * */ window.onload= function(){ var box = document.getElementById('box'); var items = box.getElementsByTagName('div'); var url = ''; // 请求地址; var itemCol = 4; // 默认列的间距 var itemColGap = 2; // 默认div 上下间的距离; var colNum = 5; // 默认列数; var itemWidth = items[0].offsetWidth; // 获取单个列的宽度; // 此处数据只是测试填充; var randomData = []; // 填充数据数组 测试; // 产生随机数 function randomHeight(min,max){ var min = min; var max = max; var randomVal = Math.ceil(Math.random()*max+min); return randomVal; } // 随机数添加到数组并去重; function forData(){ if( randomData.length<20 ){ var randVal = randomHeight(20,100); if(randomData.indexOf(randVal) < 0 ){ randomData.push(randVal); } forData(); }else { return; } } forData(); // 获取随机好的去重数组 // 此处数据只是测试填充;--END // 初始化 pubuFn(); function pubuFn(){ var HeightData = []; // 各个列的初始高度; for( var i = 0; i < items.length; i++ ){ items[i].style.height = randomData[i]+'px'; if( i < colNum){ var getHeightVal = items[i].offsetHeight; // 获取起始高度; items[i].style.left = i*(itemWidth+itemCol)+'px'; items[i].style.top = 0; HeightData.push(getHeightVal); } else { // 获取最低高度值; var minVal = HeightData[0]; var z = 0; for( let y=0;y<HeightData.length;y++ ){ if( minVal>HeightData[y] ){ minVal=HeightData[y]; z = y; } } items[i].style.top = (HeightData[z]+itemColGap)+'px'; items[i].style.left = (items[z].offsetLeft-itemCol)+'px'; HeightData[z] = items[i].offsetHeight+HeightData[z]+itemColGap; // 每添加一个div 则重新计算初始列高度最低高度; } } } // 后续加载数据; window.onscroll = function(event){ var crollTop = document.documentElement.scrollTop || window.pageYOffset; var crollHeihgt = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight; var topSum = crollTop + crollHeihgt; var offsetTopVal = items[items.length-1].offsetTop; if( topSum > offsetTopVal){ // 如果滚动条的Top值与视口高度之和 大于 最后一张图片的offsetTop值 那么说明已经到最后一张图片了; // 此处可动态获取数据 // todo。。。 // 循环添加数据 for( var c = 0; c<30;c++ ){ var cHei = randomHeight(0,20); if( !randomData[cHei] ) continue; var div = document.createElement('div'); div.style.height= randomData[cHei]+'px'; // 此处可添加需要在div 内添加的内容 // div.innerHTML = '<img src="' + datas[i] + '" alt="">'; div.innerHTML = '<p>'+c+'</p><span>'+c+'</span>'; box.appendChild(div); } } pubuFn() // 每次超过阈值调用; } } </script> </html>