html+js 瀑布流布局

HTML瀑布流布局

[html]  view plain  copy
  1. <span style="font-size:10px;"><!DOCTYPE html>  
  2. <html>  
  3. <head>  
  4. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />  
  5. <script type="text/javascript" src="js/waterfall.js"/></script>  
  6.   
  7. <title></title>  
  8. <style type="text/css">  
  9.     *{padding: 0;margin:0;}  
  10.     #main{  
  11.         position: relative;  
  12.     }  
  13.     .box{  
  14.         padding: 15px 0 0 15px;  
  15.         float:left;  
  16.     }  
  17.     .pin{  
  18.         padding: 10px;  
  19.         border:1px solid #ccc;  
  20.         box-shadow: 0 0 6px #ccc;  
  21.         border-radius: 5px;  
  22.     }  
  23.     .box img{  
  24.         width:162px;  
  25.         height:auto;  
  26.     }  
  27. </style>  
  28. </head>  
  29. <body>  
  30. <div id="main">  
  31.     <div class="box">  
  32.         <div class="pin">  
  33.             <img src="./images/1.jpg"/>  
  34.         </div>  
  35.     </div>  
  36.     <div class="box">  
  37.         <div class="pin">  
  38.             <img src="./images/2.jpg"/>  
  39.         </div>  
  40.     </div>  
  41.     <div class="box">  
  42.         <div class="pin">  
  43.             <img src="./images/3.jpg"/>  
  44.         </div>  
  45.     </div>  
  46.     <div class="box">  
  47.         <div class="pin">  
  48.             <img src="./images/4.jpg"/>  
  49.         </div>  
  50.     </div>  
  51.     <div class="box">  
  52.         <div class="pin">  
  53.             <img src="./images/5.jpg"/>  
  54.         </div>  
  55.     </div>  
  56.     <div class="box">  
  57.         <div class="pin">  
  58.             <img src="./images/6.jpg"/>  
  59.         </div>  
  60.     </div>  
  61.     <div class="box">  
  62.         <div class="pin">  
  63.             <img src="./images/7.jpg"/>  
  64.         </div>  
  65.     </div>  
  66.   <div class="box">  
  67.         <div class="pin">  
  68.             <img src="./images/8.jpg"/>  
  69.         </div>  
  70.     </div>  
  71.   <div class="box">  
  72.       <div class="pin">  
  73.             <img src="./images/9.jpg"/>  
  74.         </div>  
  75.     </div>  
  76.   <div class="box">  
  77.   <div class="pin">  
  78.             <img src="./images/10.jpg"/>  
  79.         </div>  
  80.     </div>  
  81.   <div class="box">  
  82.   <div class="pin">  
  83.             <img src="./images/11.jpg"/>  
  84.         </div>  
  85.     </div>  
  86.   <div class="box">  
  87.   <div class="pin">  
  88.             <img src="./images/12.jpg"/>  
  89.         </div>  
  90.     </div>  
  91.   <div class="box">  
  92.   <div class="pin">  
  93.             <img src="./images/13.jpg"/>  
  94.         </div>  
  95.     </div>  
  96.   <div class="box">  
  97.   <div class="pin">  
  98.             <img src="./images/14.jpg"/>  
  99.         </div>  
  100.     </div>  
  101.   <div class="box">  
  102.   <div class="pin">  
  103.             <img src="./images/15.jpg"/>  
  104.         </div>  
  105.     </div>  
  106.   <div class="box">  
  107.   <div class="pin">  
  108.             <img src="./images/16.jpg"/>  
  109.         </div>  
  110.     </div>  
  111.   <div class="box">  
  112.   <div class="pin">  
  113.             <img src="./images/17.jpg"/>  
  114.         </div>  
  115.     </div>  
  116.   <div class="box">  
  117.   <div class="pin">  
  118.             <img src="./images/18.jpg"/>  
  119.         </div>  
  120.     </div>  
  121.   <div class="box">  
  122.   <div class="pin">  
  123.             <img src="./images/19.jpg"/>  
  124.         </div>  
  125.     </div>  
  126.   <div class="box">  
  127.   <div class="pin">  
  128.             <img src="./images/20.jpg"/>  
  129.         </div>  
  130.     </div>  
  131.   <div class="box">  
  132.   <div class="pin">  
  133.             <img src="./images/21.jpg"/>  
  134.         </div>  
  135.     </div>  
  136. </div>  
  137. </body>  
  138. </html></span><span style="font-size: 24px;">  
  139. </span>  

js实现瀑布流布局

[html]  view plain  copy
  1. window.onload=function(){  
  2.   waterfall('main','box');  
  3.   
  4. }  
  5. function waterfall(parent,box) {  
  6.   // 获取mian下的所有box元素  
  7.   var oParent=document.getElementById(parent);  
  8.   var oBoxs=getByClass(oParent,box)  
  9.   console.log(oBoxs.length)  
  10.   //计算页面的列数  
  11.   var oBoxW=oBoxs[0].offsetWidth;  
  12.   var clos=Math.floor(document.documentElement.clientWidth/oBoxW);  
  13.   //设置class=main的宽  
  14.   oParent.style.cssText='width:'+oBoxW*clos+'px;margin:0 auto';  
  15.   //找到最小的高度  
  16.   var hArr=[];  
  17.   for(var i=0;i<oBoxs.length;i++){  
  18.     if(i<clos){  
  19.       //第一行开始的高度盒子添加到hArr中,并且不断添加新的高度,固定列数  
  20.       hArr.push(oBoxs[i].offsetHeight)  
  21.     }else{  
  22.       //当前oBoxs中的最小高度  
  23.       var minH=Math.min.apply(null,hArr)  
  24.       //最小高度oBoxs的索引,index的长度为一行中的图片个数  
  25.       var index=getMinhIndex(hArr,minH)  
  26.       //改变oBoxs的位置  
  27.       oBoxs[i].style.top=minH+'px';  
  28.       oBoxs[i].style.position='absolute';  
  29.       oBoxs[i].style.left=oBoxs[index].offsetLeft+'px';  
  30.       //添加到从第一行开始的数组中  
  31.       hArr[index]+=oBoxs[i].offsetHeight;  
  32.     }  
  33.   }  
  34.   console.log(oBoxs)  
  35. }  
  36. function getByClass(oParent,clsName) {  
  37.   var oElements=oParent.children;  
  38.   var boxArr=[];  
  39.   for(var i=0;i<oElements.length;i++){  
  40.     if(oElements[i].className==clsName){  
  41.       boxArr.push(oElements[i])  
  42.     }  
  43.   }  
  44.   return boxArr;  
  45. }  
  46. function getMinhIndex(arr,minH) {  
  47.   for(var i in arr){  
  48.     if(arr[i]==minH){  
  49.       return i  
  50.     }  
  51.   }  
  52. }  

利用onscroll实现瀑布流

不断加载,实现一直处于加载的底部

滚动加载事件的条件:当到达最后一张图片的时候,也就是蓝线的距离小于黑线的距离,执行加载!

蓝线的距离:页面顶部到最后一个图片高度一半的距离

黑线的距离:top+documentElement.clientHeight(浏览器可视窗口的距离)


下面的情况不允许加载:蓝线.height>黑线.height

//滚动加载的条件
function checkScrollSlide() {
  var oParent=document.getElementById('main')
  var oBoxs=getByClass(oParent,'box')
  var lastBoxH=oBoxs[oBoxs.length-1].offsetTop+Math.floor(oBoxs[oBoxs.length-1].offsetHeight/2)
  var scrollTop=document.documentElement.scrollTop||document.body.scrollTop;//兼容性
  var documentH=document.documentElement.clientHeight;//页面高度
  return (lastBoxH<scrollTop+documentH)?true:false;//到达指定高度后 返回true,触发waterfall()函数
  console.log(documentH)
}
创建window.οnscrοll=function(){},并将模拟的后台加载数据dataInt放置在页面底部

var dataInt={'data':[{'src':'1.jpg'},{'src':'2.jpg'},{'src':'3.jpg'},{'src':'4.jpg'}]};
window.οnscrοll=function(){
    if(checkScrollSlide) {
    //将数据块渲染到当前页面的尾部
    for (var i = 0; i < dataInt.data.length; i++) {
      //首先找到父对象
      var oParent = document.getElementById('main');
      var oBox = document.createElement('div');
      oBox.className = 'box';
      oParent.appendChild(oBox);
      var oPin = document.createElement('div');
      oPin.className = 'pin';
      oBox.appendChild(oPin);
      var oImg = document.createElement('img');
      oImg.src = './images/' + dataInt.data[i].src;
      oPin.appendChild(oImg);
    }
      waterfall('main','box');
  }
}
注: 在对加载数据循环之后,需要对加入后的元素,同样需要进行瀑布流布局。
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值