<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <style> .imglist{ 100%;height: auto;position: relative;} .imglist ul{padding:0px;margin:0px auto;position: relative;} .imglist ul li{ 220px;border:1px solid #ccc;padding: 5px;float: left;list-style: none;position: absolute;} .imglist ul li img{ 100%;vertical-align: middle;} .more{position: absolute;display: block; 100px;height:30px;padding: 5px 10px;background-color: #efefef;color:#333;left: 0px;right:0px;margin: 0px auto;border:none;border-radius: 4px;} </style> </head> <body> <div class="imglist"> <ul id="list"> </ul> <button class="more" type="button" style="cursor: pointer;">更多</button> </div> <script> var loadingfun = { //窗口改变重新排版 changesize: function(){ var rowheightagain = this.againsize(); var moverheight =maxheight(rowheightagain); var more = document.getElementsByClassName("more")[0]; more.style.top = moverheight+"px"; //更多按钮的位置(根据最高列的高度来觉得) //获取最高列的高度 function maxheight(arraymode){ var maxval = 0; for(var keys in arraymode){ if(arraymode[keys]>maxval){ maxval = arraymode[keys]; } } return maxval; } }, loadingimg:function(){ var numimg = 10, fristnum = 10;//初始加载数据条数 //初始排版 (function ajaximg(){ var litagarray =null, lilength =null, liwidth=null, litagheigh =[],//各个li模块的高度 rowheight =[],//各个列的高度 row=null, objectresult ="", ullist = null, more = document.getElementsByClassName('more')[0]; if(window.XMLHttpRequest){ xmlhttp =new XMLHttpRequest(); }else{ xmlhttp = new ActiveXObject('Micrsot.XMLHTTP'); } (function readyajax(){ xmlhttp.onreadystatechange = function(){ if(xmlhttp.status==200&&xmlhttp.readyState==4){ var resultdata = eval('('+xmlhttp.responseText+')'), _htmlallli = '', indexnum=0; ullist = document.getElementById('list'); objectresult = resultdata.imgdata; datalength = objectresult.length; /*****获取li*****/ /**缓存图片并插入,一定要先缓存不然计算不到LI的真是高度**/ (function imgload(){ var imagesload = new Image();//实例化图片缓存函数 imagesload.onload = function(){ //如果缓存完图片则获取li并插入 if(indexnum==fristnum){ for(var i=0;i<fristnum;i++){ var _htmlli = "<li><a href=''><img src="+objectresult[i].urlimg+" /></a></li>"; _htmlallli +=_htmlli; } /***插入li****/ addhtml(_htmlallli,ullist); /**定义列数**/ litagarray = ullist.getElementsByTagName('li');//获取li集合 lilength = litagarray.length;//获取li的个数 liwidth = litagarray[0].offsetWidth;//获取li宽度 documentwidth = document.documentElement.offsetWidth;//页面宽度; row = Math.floor(documentwidth/liwidth); ullist.style.width = row*liwidth+'px'; /**列数定义完成**/ //获取各个模块的高度 for(var i=0;i<lilength;i++){ litagheigh.push(litagarray[i].offsetHeight); } /**初始化第一列的各模块的top与left并获取列的高度**/ for(var i=0;i<row;i++){ litagarray[i].style.top = 0+'px'; litagarray[i].style.left = liwidth*i+'px'; rowheight.push(litagarray[i].offsetHeight); } /**插入新的模块,从最短一列开始插入,并更新该列的高度**/ for(var i=row;i<fristnum;i++){ var minindex = minheight(rowheight);//获取最短列的索引 litagarray[i].style.top = rowheight[minindex] +'px';//设置模块的top litagarray[i].style.left = liwidth*minindex+'px';//设置模块的left rowheight[minindex] = litagheigh[i]+rowheight[minindex];//更新最短列的高度 } var thistop = maxheight(rowheight); more.style.top = thistop +'px'; }else{ imgload()//没有缓存完则继续缓存 } } imagesload.src = objectresult[indexnum].urlimg;//缓存图片 indexnum++; })() } } xmlhttp.open('POST','imgdata.php'); xmlhttp.setRequestHeader("Content-type","application/json;charset=utf-8"); xmlhttp.send(null); })() //点击更多后加载 more.onclick = function(){ var indexnumtwo = fristnum; (function imageloading(){ var imagesloadtwo = new Image();//实例化图片缓存函数 imagesloadtwo.onload = function(){ if(indexnumtwo==numimg+fristnum){ var _htmlalli = ''; var rowheightagain = loadingfun.againsize();//这里调用这个主要是在窗口改变的后,再去加载模块需要重新计算列数及列的高度, //判断是否全部已经加载(显示的数据=剩余的数据刚好相等,显示的数据>与剩余的数据,所以遍历的时候要判断i是否超出剩余条数) if(datalength>fristnum){ for(var i=fristnum;i<numimg+fristnum;i++){ //如果全部显示完则停止遍历跳出循环; if(i>=datalength){ break; } var _htmlli = "<li><a href=''><img src="+objectresult[i].urlimg+" /></a></li>"; _htmlalli +=_htmlli; } fristnum = numimg+fristnum; var testul = ullist; addhtml(_htmlalli,ullist); var newlitaglength = litagarray.length; for(var i=lilength;i<newlitaglength;i++){ litagheigh.push(litagarray[i].offsetHeight);//新加载数据个模块的高度; } //插入加载的数据并更新更列的高度与前面的插入一样; for(var i=lilength;i<newlitaglength;i++){ var minkey = minheight(rowheightagain); litagarray[i].style.top = rowheightagain[minkey]+'px'; litagarray[i].style.left = minkey*liwidth +'px'; rowheightagain[minkey] +=litagheigh[i]; } lilength = newlitaglength; var thistop = maxheight(rowheightagain); more.style.top = thistop +'px'; }else{ alerts('没有更多了');//如果点击时已经加载完,则弹出 } }else{ imageloading(); } } if(!objectresult[indexnumtwo]){ imagesloadtwo.src="img/11.jpg";//无视这个,但是一定要有一个值; }else{ imagesloadtwo.src = objectresult[indexnumtwo].urlimg;//缓存图片 } indexnumtwo++; })(); } })(); //获取最短列的索引 function minheight(arraymode){ var minval = arraymode[0]; var minkey = 0; for(var keys in arraymode){ if(minval>arraymode[keys]){ minval = arraymode[keys]; minkey = keys; } } return minkey; } //获取最高列的的值 function maxheight(arraymode){ var maxval = 0; for(var keys in arraymode){ if(arraymode[keys]>maxval){ maxval = arraymode[keys]; } } return maxval; } //插入html function addhtml(elementhtml,elementenode){ var newdiv = document.createElement('div'); newdiv.innerHTML = elementhtml; takehtml = document.createDocumentFragment();//创建一个虚拟的碎片html片段 while(newdiv.firstChild){ takehtml.appendChild(newdiv.firstChild);//取出div中子元素节点,这里有个有意思的地方就是takehtml每插入一个firstchild,div中便少一个;所以takeli中插入的永远是div的第一个 } return elementenode.appendChild(takehtml); } //弹出提示信息 function alerts(texts){ var alerttext = "<p id='alerttext' style='text-align:center;line-height:80px;position:fixed;left:0px;right:0px;margin:40% auto;z-index:1000;200px;height:80px;border-radius:8px;background-color:#000;color:#fff;opacity:0.8;'>"+texts+"</p>" var divalter = document.createElement('div'); divalter.innerHTML = alerttext; var alterremove = document.getElementById('alerttext'); var takediv = document.createDocumentFragment(); takediv.appendChild(divalter.firstChild); if(!alterremove){//判断是否弹出了信息,没有则显示; document.body.appendChild(takediv); alterremove = document.getElementById('alerttext'); setTimeout(function(){ document.body.removeChild(alterremove); },2000) } } }, againsize:function(){ var documentwidthagain = document.documentElement.offsetWidth,//页面宽度 ullistagain = document.getElementById('list'), litagarrayagain = ullistagain.getElementsByTagName('li'),//获取li集合 lilengthagain = litagarrayagain.length,//获取li的个数 liwidthagain = litagarrayagain[0].offsetWidth,//获取li宽度 litagheighagain= [], rowagain = Math.floor(documentwidthagain/liwidthagain),//获取列数 rowheightagain = [], result=[documentwidthagain,rowheightagain]; ullistagain.style.width = rowagain*liwidthagain+'px';//定义ul的宽度(居中时使用) //定位出定义行并获取各列的高度 for(var i=0;i<rowagain;i++){ litagarrayagain[i].style.top = 0+"px"; litagarrayagain[i].style.left = liwidthagain*i+"px"; litagheighagain.push(litagarrayagain[i].offsetHeight); rowheightagain.push(litagheighagain[i]); } //插入剩余的模块(根据最短列来插入)并更新个列的高度 for(var i=rowagain;i<lilengthagain;i++){ litagheighagain.push(litagarrayagain[i].offsetHeight); var minindex = minheight(rowheightagain); litagarrayagain[i].style.top = rowheightagain[minindex]+"px"; litagarrayagain[i].style.left = liwidthagain*minindex+"px"; rowheightagain[minindex] +=litagheighagain[i]; } //获取最短列的索引 function minheight(arraymode){ var minval = arraymode[0]; var minkey = 0; for(var keys in arraymode){ if(minval>arraymode[keys]){ minval = arraymode[keys]; minkey = keys; } } return minkey; } return rowheightagain;//返回各列的高度(其他函数使用) } } window.onload =function(){ loadingfun.loadingimg(); } window.onresize = function(){ loadingfun.changesize(); } </script> </body> </html>
后台php部分,这里只用到了urlimg,没有用到title
<?php header("Content-Type:application/json;charset=utf-8"); echo("{'imgdata':[ {'urlimg':'imgdata/1.png','title':'图片一'}, {'urlimg':'imgdata/2.png','title':'图片二'}, {'urlimg':'imgdata/3.png','title':'图片三'}, {'urlimg':'imgdata/4.png','title':'图片四'}, {'urlimg':'imgdata/5.png','title':'图片五'}, {'urlimg':'imgdata/6.png','title':'图片六'}, {'urlimg':'imgdata/7.png','title':'图片七'}, {'urlimg':'imgdata/8.png','title':'图片八'}, {'urlimg':'imgdata/9.png','title':'图片九'}, {'urlimg':'imgdata/10.png','title':'图片十'}, {'urlimg':'imgdata/11.png','title':'图片十一'}, {'urlimg':'imgdata/12.png','title':'图片十二'}, {'urlimg':'imgdata/13.png','title':'图片十三'}, {'urlimg':'imgdata/14.png','title':'图片十四'}, {'urlimg':'imgdata/15.png','title':'图片十五'}, {'urlimg':'imgdata/16.png','title':'图片十六'}, {'urlimg':'imgdata/17.png','title':'图片十七'}, {'urlimg':'imgdata/18.png','title':'图片十八'}, {'urlimg':'imgdata/19.png','title':'图片十九'}, {'urlimg':'imgdata/18.png','title':'图片十八'}, {'urlimg':'imgdata/1.png','title':'图片一'}, {'urlimg':'imgdata/2.png','title':'图片二'}, {'urlimg':'imgdata/3.png','title':'图片三'}, {'urlimg':'imgdata/4.png','title':'图片四'}, {'urlimg':'imgdata/5.png','title':'图片五'}, {'urlimg':'imgdata/6.png','title':'图片六'}, {'urlimg':'imgdata/7.png','title':'图片七'}, {'urlimg':'imgdata/8.png','title':'图片八'}, {'urlimg':'imgdata/9.png','title':'图片九'}, {'urlimg':'imgdata/10.png','title':'图片十'}, {'urlimg':'imgdata/11.png','title':'图片十一'}, {'urlimg':'imgdata/12.png','title':'图片十二'}, {'urlimg':'imgdata/13.png','title':'图片十三'}, {'urlimg':'imgdata/14.png','title':'图片十四'}, {'urlimg':'imgdata/15.png','title':'图片十五'}, {'urlimg':'imgdata/16.png','title':'图片十六'}, {'urlimg':'imgdata/17.png','title':'图片十七'}, {'urlimg':'imgdata/18.png','title':'图片十八'}, {'urlimg':'imgdata/19.png','title':'图片十九'}, {'urlimg':'imgdata/18.png','title':'图片十八'}, {'urlimg':'imgdata/18.png','title':'图片十八'}, {'urlimg':'imgdata/19.png','title':'图片十九'}, {'urlimg':'imgdata/18.png','title':'图片十八'} ]}"); ?>
实现效果是这样的,http://www.caicai5.com/sheji/ 当然实际情况是要稍加修改的,比如图片间要有间隙,图片加载要有一个提示信息。根据自己的需要修改即可