javascript实现仿百度图片的瀑布流加载效果
来源: 阅读:1192 次 日期:2016-07-08 09:37:10
温馨提示: 小编为您整理了“javascript实现仿百度图片的瀑布流加载效果”,方便广大网友查阅!

由于没有服务器,就用一个json字符串作为下拉时加载图片数据的来源了

html:

<!DOCTYPE html>

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

<script src="js/waterfall.js"></script>

<style type="text/css">

 *{padding: 0;margin:0;}

 #main{

  position: relative;

 }

 .pin{

  padding: 15px 0 0 15px;

  float:left;

 }

 .box{

  padding: 10px;

  border:1px solid #ccc;

  box-shadow: 0 0 6px #ccc;

  border-radius: 5px;

 }

 .box img{

  width:162px;

  height:auto;

 }

</style>

</head>

<body>

<div id="main">

 <div class="pin">

  <div class="box">

   <img src="./images/1.jpg"/>

  </div>

 </div>

 <div class="pin">

  <div class="box">

   <img src="./images/2.jpg"/>

  </div>

 </div>

 <div class="pin">

  <div class="box">

   <img src="./images/3.jpg"/>

  </div>

 </div>

 <div class="pin">

  <div class="box">

   <img src="./images/4.jpg"/>

  </div>

 </div>

 <div class="pin">

  <div class="box">

   <img src="./images/5.jpg"/>

  </div>

 </div>

 <div class="pin">

  <div class="box">

   <img src="./images/6.jpg"/>

  </div>

 </div>

 <div class="pin">

  <div class="box">

   <img src="./images/7.jpg"/>

  </div>

 </div>

 <div class="pin">

  <div class="box">

   <img src="./images/8.jpg"/>

  </div>

 </div>

 <div class="pin">

  <div class="box">

   <img src="./images/9.jpg"/>

  </div>

 </div>

 <div class="pin">

  <div class="box">

   <img src="./images/10.jpg"/>

  </div>

 </div>

 <div class="pin">

  <div class="box">

   <img src="./images/11.jpg"/>

  </div>

 </div>

 <div class="pin">

  <div class="box">

   <img src="./images/12.jpg"/>

  </div>

 </div>

 <div class="pin">

  <div class="box">

   <img src="./images/13.jpg"/>

  </div>

 </div>

 <div class="pin">

  <div class="box">

   <img src="./images/14.jpg"/>

  </div>

 </div>

 <div class="pin">

  <div class="box">

   <img src="./images/15.jpg"/>

  </div>

 </div>

 <div class="pin">

  <div class="box">

   <img src="./images/16.jpg"/>

  </div>

 </div>

 <div class="pin">

  <div class="box">

   <img src="./images/17.jpg"/>

  </div>

 </div>

 <div class="pin">

  <div class="box">

   <img src="./images/18.jpg"/>

  </div>

 </div>

 <div class="pin">

  <div class="box">

   <img src="./images/19.jpg"/>

  </div>

 </div>

 <div class="pin">

  <div class="box">

   <img src="./images/20.jpg"/>

  </div>

 </div>

 <div class="pin">

  <div class="box">

   <img src="./images/21.jpg"/>

  </div>

 </div>

</div>

</body>

</html>

JSWallper.js:

window.onload=function(){

 waterfall('main','pin');

 var dataInt={'data':[{'src':'1.jpg'},{'src':'2.jpg'},{'src':'3.jpg'},{'src':'4.jpg'}]};

 window.onscroll=function(){

  if(checkscrollside()){

   var oParent = document.getElementById('main');// 父级对象

   for(var i=0;i<dataInt.data.length;i++){

    var oPin=document.createElement('div'); //添加 元素节点

    oPin.className='pin';     //添加 类名 name属性

    oParent.appendChild(oPin);    //添加 子节点

    var oBox=document.createElement('div');

    oBox.className='box';

    oPin.appendChild(oBox);

    var oImg=document.createElement('img');

    oImg.src='./images/'+dataInt.data[i].src;

    oBox.appendChild(oImg);

   }

   waterfall('main','pin');

  };

 }

}

/*

 parend 父级id

 pin 元素id

*/

function waterfall(parent,pin){

 var oParent=document.getElementById(parent);// 父级对象

 var aPin=getClassObj(oParent,pin);// 获取存储块框pin的数组aPin

 var iPinW=aPin[0].offsetWidth;// 一个块框pin的宽

 var num=Math.floor(document.documentElement.clientWidth/iPinW);//每行中能容纳的pin个数【窗口宽度除以一个块框宽度】

 oParent.style.cssText='width:'+iPinW*num+'px;margin:0 auto;';//设置父级居中样式:定宽+自动水平外边距

 var pinHArr=[];//用于存储 每列中的所有块框相加的高度。a

 for(var i=0;i<aPin.length;i++){//遍历数组aPin的每个块框元素

  var pinH=aPin[i].offsetHeight;

  if(i<num){

   pinHArr[i]=pinH; //第一行中的num个块框pin 先添加进数组pinHArr

  }else{

   var minH=Math.min.apply(null,pinHArr);//数组pinHArr中的最小值minH

   var minHIndex=getminHIndex(pinHArr,minH);

   aPin[i].style.position='absolute';//设置绝对位移

   aPin[i].style.top=minH+'px';

   aPin[i].style.left=aPin[minHIndex].offsetLeft+'px';

   //数组 最小高元素的高 + 添加上的aPin[i]块框高

   pinHArr[minHIndex]+=aPin[i].offsetHeight;//更新添加了块框后的列高

  }

 }

}

 /*

 *通过父级和子元素的class类 获取该同类子元素的数组

 */

function getClassObj(parent,className){

 var obj=parent.getElementsByTagName('*');//获取 父级的所有子集

 var pinS=[];//创建一个数组 用于收集子元素

 for (var i=0;i<obj.length;i++) {//遍历子元素、判断类别、压入数组

  if (obj[i].className==className){

   pinS.push(obj[i]);

  }

 };

 return pinS;

}

/****

 *获取 pin高度 最小值的索引index

 */

function getminHIndex(arr,minH){

 for(var i in arr){

  if(arr[i]==minH){

   return i;

  }

 }

}

function checkscrollside(){

 var oParent=document.getElementById('main');

 var aPin=getClassObj(oParent,'pin');

 var lastPinH=aPin[aPin.length-1].offsetTop+Math.floor(aPin[aPin.length-1].offsetHeight/2);//创建【触发添加块框函数waterfall()】的高度:最后一个块框的距离网页顶部+自身高的一半(实现未滚到底就开始加载)

 var scrollTop=document.documentElement.scrollTop||document.body.scrollTop;//注意解决兼容性

 var documentH=document.documentElement.clientHeight;//页面高度

 return (lastPinH<scrollTop+documentH)?true:false;//到达指定高度后 返回true,触发waterfall()函数

}

更多信息请查看网络编程
由于各方面情况的不断调整与变化, 提供的所有考试信息和咨询回复仅供参考,敬请考生以权威部门公布的正式信息和咨询为准!
关于我们 | 联系我们 | 人才招聘 | 网站声明 | 网站帮助 | 非正式的简要咨询 | 简要咨询须知 | 加入群交流 | 手机站点 | 投诉建议
工业和信息化部备案号:滇ICP备2023014141号-1 云南省教育厅备案号:云教ICP备0901021 滇公网安备53010202001879号 人力资源服务许可证:(云)人服证字(2023)第0102001523号
云南网警备案专用图标
联系电话:0871-65317125(9:00—18:00) 获取招聘考试信息及咨询关注公众号:hfpxwx
咨询QQ:526150442(9:00—18:00)版权所有:
云南网警报警专用图标
Baidu
map