js瀑布流,实现图片自适应显示

waterfall.html
/* 


*author:renault


*mail:renault9335@163.com  


*/ 
 
<!DOCTYPE html>

<html>

 <head>

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

  <title>

   实现无限加载图片

  </title>

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

  <link rel="stylesheet" type="text/css" href="css/waterfall1.css">

 </head>

 <body>

  <div id="waterfall">

   <div class="box">

    <div class="box_img">

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

    </div>

   </div>

   <div class="box">

    <div class="box_img">

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

    </div>

   </div>

   <div class="box">

    <div class="box_img">

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

    </div>

   </div>

   <div class="box">

    <div class="box_img">

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

    </div>

   </div>

   <div class="box">

    <div class="box_img">

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

    </div>

   </div>

   <div class="box">

    <div class="box_img">

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

    </div>

   </div>

   <div class="box">

    <div class="box_img">

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

    </div>

   </div>

   <div class="box">

    <div class="box_img">

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

    </div>

   </div>

   <div class="box">

    <div class="box_img">

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

    </div>

   </div>

   <div class="box">

    <div class="box_img">

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

    </div>

   </div>

   <div class="box">

    <div class="box_img">

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

    </div>

   </div>

      <div class="box">

    <div class="box_img">

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

    </div>

   </div>

   <div class="box">

    <div class="box_img">

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

    </div>

   </div>

   <div class="box">

    <div class="box_img">

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

    </div>

   </div>

   <div class="box">

    <div class="box_img">

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

    </div>

   </div>

   <div class="box">

    <div class="box_img">

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

    </div>

   </div>

   <div class="box">

    <div class="box_img">

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

    </div>

   </div>

   <div class="box">

    <div class="box_img">

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

    </div>

   </div>

   <div class="box">

    <div class="box_img">

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

    </div>

   </div>

   <div class="box">

    <div class="box_img">

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

    </div>

   </div>

   <div class="box">

    <div class="box_img">

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

    </div>

   </div>

   <div class="box">

    <div class="box_img">

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

    </div>

   </div>

  </div> 

 </body>

</html>
*{
 margin:0px;
 padding:0px;
}
#waterfall{
 position: relative;
}
.box{
    padding: 15px 0 0 15px;
    float:left;
}
.box_img{
 padding: 5px;
 box-shadow: 0 0 6px #ccc;
 border-radius: 5px;
 border: 1px solid #ccc;
}
.box_img img{
 width:162px;
 height:auto;
}
window.onload = function(){
 
 autoPicture('waterfall','box');
 
 var imgData = {'data':[{'src':'images/4.jpg'},{'src':'images/3.jpg'},{'src':'images/2.jpg'},{'src':'images/1.jpg'},{'src':'images/5.jpg'},{'src':'images/46.jpg'},{'src':'images/7.jpg'},{'src':'images/8.jpg'},{'src':'images/10.jpg'},{'src':'images/9.jpg'},{'src':'images/13.jpg'},{'src':'images/12.jpg'},{'src':'images/11.jpg'}]};
 
 window.onscroll = function(){
  if(checkScrollSide()){
  var parentNode=document.getElementById('waterfall');
  for(var i=0;i<imgData.data.length;i++){
    /*var newImg = document.createElement('img');// 先创建一个IMG子节点
    newImg.src=imgData.data[i].src;     //img元素里面的SRC指向imgData里面的值
    var newDiv_biximg =document.createElement('div');// 创建一个div class="box-img"
    newDiv_biximg.className ='box-img';
    newDiv_biximg.appendChild(newImg);   //将img结点变成box-img的子节点
    var newDiv_box = document.createElement('div');
    newDiv_box.className = 'box';
    newDiv_box.appendChild(newDiv_biximg);
    parentNode.appendChild(newDiv_box);*/
    
    var newDiv_box = document.createElement('div');
    newDiv_box.className='box';
    parentNode.appendChild(newDiv_box);
    
    var newDiv_boximg =document.createElement('div');// 创建一个div class="box-img"
    newDiv_boximg.className='box_img';
    newDiv_box.appendChild(newDiv_boximg);
    
    var newImg = document.createElement('img');// 先创建一个IMG子节点
    newImg.src=imgData.data[i].src; 
    newDiv_boximg.appendChild(newImg);
    
  }
   autoPicture('waterfall','box');
  };
  
 }
 
}
 /*让图片自适应,互补
 *param1:父级元素
 *param2:子级元素
 */
function autoPicture(parent,box){
 var parentNode = document.getElementById(parent);//获取父级元素
 var boxNode = getClassObj(parentNode,box);//获取父级元素下box元素的数据
 var boxWidth=boxNode[0].offsetWidth;//所有的图片宽度相同,获取第一个的BOX宽度
 var winWidth=0;
 //获取当前浏览器窗口的宽
 if (window.innerWidth){
  winWidth = window.innerWidth;
 }else if ((document.body) && (document.body.clientWidth)){
  winWidth = document.body.clientWidth;  
 }
 //document.documentElement.clientWidth
 var num=Math.floor(winWidth/boxWidth);//每行容纳几张图片
 parentNode.style.cssText='width:'+boxWidth*num+'px;margin: 0 auto;';//设置父级居中样式
 var boxHeight=[];
 for(var i=0;i<boxNode.length;i++){
  var boxH=boxNode[i].offsetHeight;
  if(i<num){
   boxHeight.push(boxH);
  }else{
   var minH=Math.min.apply(null,boxHeight);
   var minHIndex=getMinHeigthIndex(boxHeight,minH);
   boxNode[i].style.position='absolute';
   boxNode[i].style.top=minH+'px';//offsetTop 可以获得 HTML 元素距离上方或外层元素的位置,style.top 也是可以的 
             //offsetTop 只读,而 style.top 可读写/offsetTop 返回的是数字,而 style.top 返回的是字符串,除了数字外还带有单位:px。
   boxNode[i].style.left=boxNode[minHIndex].offsetLeft+'px';//offsetLeft   返回对象相对于父级对象的布局或坐标的left值
                 //就是以父级对象左上角为坐标原点,向右和向下为X、Y轴正方向的x坐标
   boxHeight[minHIndex]+=boxNode[i].offsetHeight;
  }
 }
}
 /*获取子级元素
  *param1:父级元素
  *param2:子级元素类名
  */
function getClassObj(parents,className){
 var objParent = parents.getElementsByTagName('*');//获取父级元素的所有子元素
 var boxClass=[];//创建一个数组,存储子级className的元素
 for(var i=0;i<objParent.length;i++){
  //console.log(objParent[i]);结果如下
  /* <div class="box"><div class="box_img"><img src="images/1.jpg"> 
  <div class="box"><div class="box_img"> <img src="images/6.jpg">
  ........
  <div class="box"> <div class="box_img"><img src="images/10.jpg">*/
  
  if(objParent[i].className == className){
   boxClass.push(objParent[i]);
  }
 }
 return boxClass; 
}
function getMinHeigthIndex(boxHeight,minH){
 for(var i in boxHeight){
  if(boxHeight[i]==minH){
   return i;
  }
 }
 
}
function checkScrollSide(){
 var parentNode = document.getElementById('waterfall');
 var boxNode = getClassObj(parentNode,'box');
 var lastPicture = boxNode[boxNode.length-1].offsetTop+Math.floor(boxNode[boxNode.length-1].offsetHeight);
 var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
 var pageHeight = document.documentElement.clientHeight;
 return (lastPicture>pageHeight)?true:false;
}

转载于:https://my.oschina.net/renault/blog/610861

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值