瀑布流布局:JS+绝对定位

绝对定位方式的瀑布流布局:

玉屏ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为创新互联的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:028-86922220(备注:SSL证书合作)期待与您的合作!

一、布局

1、包围块框的容器:

 
 
 
 
  1.     ... ...

2、一个块框:

 
 
 
 
  1.     
  2.         
  3.     
  • 3、初始化第一行/5个块框:

     
     
     
     
    1. .pin{
    2.         padding: 15px 0 0 15px;
    3.         float: left;}
    4.     .box{
    5.         padding: 10px;
    6.         border:1px solid #ccc;}
    7.     .box img{
    8.         width:192px;
    9.         height:auto;}

    效果:

    二、思路:

    1、设置父级main的样式:水平居中。

    2、设置每个块框pin的样式:绝对定位。

    3、设置窗口滚动事件的监听函数:读取数据添加块框。

    JS实现:

    1-①:获取父级oParent:

    1-②:创建函数getClassObj()-通过父级id和块框类名-获取包含块框的数组。

     
     
     
     
    1. var oParent=document.getElementById('main');// 父级对象
    2. var aPin=getClassObj(oParent,pin);// 获取存储块框pin的数组aPin
    3. var num=Math.floor(document.documentElement.clientWidth/aPin[0].offsetWidth);//获取-每行中能容纳的块框个数-num【窗口宽度除以一个块框宽度】
    4. arent.style.cssText='width:'+iPinW*num+'px;margin:0 auto;';//用cssText属性为父级main添加居中样式:定宽+自动水平外边距
     
     
     
     
    1. function getClassObj(parent,className){
    2.         var obj=parent.getElementsByTagName('*');//获取 父级的所有子集
    3.         var pinS=[];//创建一个数组 用于存储类为className的元素
    4.         for (var i=0;i
    5.             if (obj[i].className==className)
    6.                 pinS.push(obj[i]);
    7.         };
    8.         return pinS;}

    2-①:创建数组pinHArr-用于存储每一列高度;

    2-②:for语句遍历每个块框aPin[i],将前num个块框赋值给数组pinHArr,对超出一行能容纳的块框数num的块框绝对定位。

    2-③:用创建函数getminHIndex()-返回一个数组中的最小值

     
     
     
     
    1. var pinHArr=[];//用于存储 每列中的所有块框相加的高度【随着列数的不同此数组的length也随之改变】
    2.     for(var i=0;i
    3.         var pinH=aPin[i].offsetHeight;//获取数组aPin的第i个块框的可见宽offsetHeight
    4.         if(i
    5.             pinHArr[i]=pinH; //第一行中的num个块框aPin 先添加进数组pinHArr
    6.         }else{
    7.             var minH=Math.min.apply(null,pinHArr);//计算数组pinHArr中的最小值minH
    8.             var minHIndex=getminHIndex(pinHArr,minH);//通过创建的getminHIndex()-获取最小值minH在数组pinHArr中的索引minHIndex
    9.             aPin[i].style.position='absolute';//设置绝对位移
    10.             aPin[i].style.top=minH+'px';
    11.             aPin[i].style.left=aPin[minHIndex].offsetLeft+'px';//数组 最小高元素的高 + 添加上的aPin[i]块框高
    12.             pinHArr[minHIndex]+=aPin[i].offsetHeight;//更新添加块框后的列高
    13.         }
    14.     }
     
     
     
     
    1. function getminHIndex(arr,minH){
    2.     for(var i in arr){
    3.         if(arr[i]==minH)return i;
    4.     }
    5. }

    3:设置窗口滚动事件的监听函数:读取数据添加块框。

     
     
     
     
    1. var dataInt={'data':[{'src':'g (1).jpg'},{'src':'g (9).jpg'},{'src':'g (2).jpg'},{'src':'g (4).jpg'}]};//一个临时的数据对象
    2.     //下面定义窗口滚动事件监听函数
    3.     window.onscroll=function(){
    4.         if(checkscrollside()){
    5.         var oParent=document.getElementById('main');// 父级对象
    6.         for(var i=0;i
    7.             var oPin=document.createElement('div'); //创建添加 元素节点pin
    8.             oPin.className='pin';                   //添加 类名 name属性
    9.             oParent.appendChild(oPin);              //创建添加 子节点box
    10.             var oBox=document.createElement('div');
    11.             oBox.className='box';
    12.             oPin.appendChild(oBox);
    13.             var oImg=document.createElement('img');//创建添加 子节点img
    14.             oImg.src='./images/'+dataInt.data[i].src;
    15.             oBox.appendChild(oImg);
    16.         }
    17.         waterfall('main','pin');//将①②封装成函数waterfall(),将添加的节点添加到添加和定位到文档中。
    18.         };
    19.     }
     
     
     
     
    1. function checkscrollside(){
    2.         var oParent=document.getElementById('main');
    3.         var aPin=getClassObj(oParent,'pin');
    4.         var lastPinH=aPin[aPin.length-1].offsetTop+Math.floor(aPin[aPin.length-1].offsetHeight/2);//创建【触发添加块框函数waterfall()】的高度:最后一个块框的距离网页顶部+自身高的一半(实现未滚到底就开始加载)
    5.         var scrollTop=document.documentElement.scrollTop||document.body.scrollTop;//注意解决兼容性
    6.         var documentH=document.documentElement.clientHeight;//窗口高度
    7.         return (lastPinH
    8.     }

    三、最终效果:

    四、总结:此为让自己梳理一下思路,表达不太仔细连贯,仅供参考。

    #p#

    五、完成后的html文件和js文件:

    html:index.html

     
     
     
     
    1.  
    2.  
    3.  
    4.  
    5.  
    6.  
    7.  
    8.  
    9.      *{padding: 0;margin:0;}
    10.      #main{
    11.          position: relative;
    12.      }
    13.      .pin{
    14.          padding: 15px 0 0 15px;
    15.          float:left;
    16.      }
    17.      .box{
    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.  
    28.  
    29.  
    30.  
    31.      
    32.          
    33.              
    34.          
  •      
  •      
  •          
  •              
  •          
  •      
  •      
  •          
  •              
  •          
  •      
  •      
  •          
  •              
  •          
  •      
  •      
  •          
  •              
  •          
  •      
  •  
  •  
  •  
  • js:waterfall.js

     
     
     
     
    1. window.onload=function(){
    2. waterfall('main','pin');
    3.      var dataInt={'data':[{'src':'g (1).jpg'},{'src':'g (9).jpg'},{'src':'g (2).jpg'},{'src':'g (4).jpg'}]};
    4.      
    5.      window.onscroll=function(){
    6.          if(checkscrollside()){
    7.          var oParent=document.getElementById('main');// 父级对象
    8.          for(var i=0;i
    9.              var oPin=document.createElement('div'); //添加 元素节点
    10.              oPin.className='pin';                   //添加 类名 name属性
    11.              oParent.appendChild(oPin);              //添加 子节点
    12.              var oBox=document.createElement('div');
    13.              oBox.className='box';
    14.              oPin.appendChild(oBox);
    15.              var oImg=document.createElement('img');
    16.              oImg.src='./images/'+dataInt.data[i].src;
    17.              oBox.appendChild(oImg);
    18.          }
    19.          waterfall('main','pin');
    20.          };
    21.      }
    22.      
    23.  }
    24.  /*
    25.          parend 父级id
    26.          pin 元素id
    27.  */
    28.  function waterfall(parent,pin){
    29.      var oParent=document.getElementById(parent);// 父级对象
    30.      var aPin=getClassObj(oParent,pin);// 获取存储块框pin的数组aPin
    31.      var iPinW=aPin[0].offsetWidth;// 一个块框pin的宽
    32.      var num=Math.floor(document.documentElement.clientWidth/iPinW);//每行中能容纳的pin个数【窗口宽度除以一个块框宽度】
    33.      oParent.style.cssText='width:'+iPinW*num+'px;ma rgin:0 auto;';//设置父级居中样式:定宽+自动水平外边距
    34.  
    35.      var pinHArr=[];//用于存储 每列中的所有块框相加的高度。
    36.      for(var i=0;i
    37.          var pinH=aPin[i].offsetHeight;
    38.          if(i
    39.              pinHArr[i]=pinH; //第一行中的num个块框pin 先添加进数组pinHArr
    40.          }else{
    41.              var minH=Math.min.apply(null,pinHArr);//数组pinHArr中的最小值minH
    42.              var minHIndex=getminHIndex(pinHArr,minH);
    43.              aPin[i].style.position='absolute';//设置绝对位移
    44.              aPin[i].style.top=minH+'px';
    45.              aPin[i].style.left=aPin[minHIndex].offsetLeft+'px';
    46.              //数组 最小高元素的高 + 添加上的aPin[i]块框高
    47.              pinHArr[minHIndex]+=aPin[i].offsetHeight;//更新添加了块框后的列高
    48.          }
    49.      }
    50.  }
    51.      /****
    52.          *通过父级和子元素的class类 获取该同类子元素的数组
    53.          */
    54.      function getClassObj(parent,className){
    55.          var obj=parent.getElementsByTagName('*');//获取 父级的所有子集
    56.          var pinS=[];//创建一个数组 用于收集子元素
    57.          for (var i=0;i
    58.              if (obj[i].className==className){
    59.                  pinS.push(obj[i]);
    60.              }
    61.          };
    62.          return pinS;
    63.      }
    64.      /****
    65.          *获取 pin高度 最小值的索引index
    66.          */
    67.      function getminHIndex(arr,minH){
    68.          for(var i in arr){
    69.              if(arr[i]==minH){
    70.                  return i;
    71.              }
    72.          }
    73.      }
    74.  
    75.  
    76.      function checkscrollside(){
    77.          var oParent=document.getElementById('main');
    78.          var aPin=getClassObj(oParent,'pin');
    79.          var lastPinH=aPin[aPin.length-1].offsetTop+Math.floor(aPin[aPin.length-1].offsetHeight/2);//创建【触发添加块框函数waterfall()】的高度:最后一个块框的距离网页顶部+自身高的一半(实现未滚到底就开始加载)
    80.          var scrollTop=document.documentElement.scrollTop||document.body.scrollTop;//注意解决兼容性
    81.          var documentH=document.documentElement.clientHeight;//页面高度
    82.          return (lastPinH
    83.      }

    分享名称:瀑布流布局:JS+绝对定位
    链接URL:http://www.stwzsj.com/qtweb/news40/2940.html

    网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

    广告

    声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

    猜你还喜欢下面的内容

    Google知识

    分类信息网