自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

瀑布流布局:JS+絕對定位

開發(fā) 前端
現(xiàn)在很多網(wǎng)站博客都流行瀑布流布局,你是否也想了解是如何實現(xiàn)的呢?本文將給大家詳細的介紹。

絕對定位方式的瀑布流布局:

一、布局

1、包圍塊框的容器:

  1. <div id="main"> 
  2.     ... ...  
  3. <div> 

2、一個塊框:

  1. <div class="pin"> 
  2.     <div class="box"> 
  3.         <img src="./images/g (1).jpg"/> 
  4.     </div> 
  5. </div> 

3、初始化第一行/5個塊框:

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

效果:

二、思路:

1、設(shè)置父級main的樣式:水平居中。

2、設(shè)置每個塊框pin的樣式:絕對定位。

3、設(shè)置窗口滾動事件的監(jiān)聽函數(shù):讀取數(shù)據(jù)添加塊框。

JS實現(xiàn):

1-①:獲取父級oParent:

1-②:創(chuàng)建函數(shù)getClassObj()-通過父級id和塊框類名-獲取包含塊框的數(shù)組。

  1. var oParent=document.getElementById('main');// 父級對象  
  2. var aPin=getClassObj(oParent,pin);// 獲取存儲塊框pin的數(shù)組aPin  
  3. var num=Math.floor(document.documentElement.clientWidth/aPin[0].offsetWidth);//獲取-每行中能容納的塊框個數(shù)-num【窗口寬度除以一個塊框?qū)挾取? 
  4.  
  5. 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=[];//創(chuàng)建一個數(shù)組 用于存儲類為className的元素  
  4.         for (var i=0;i<obj.length;i++) {//遍歷子集、判斷類名、壓入數(shù)組  
  5.             if (obj[i].className==className)  
  6.                 pinS.push(obj[i]);  
  7.         };  
  8.         return pinS;} 

2-①:創(chuàng)建數(shù)組pinHArr-用于存儲每一列高度;

2-②:for語句遍歷每個塊框aPin[i],將前num個塊框賦值給數(shù)組pinHArr,對超出一行能容納的塊框數(shù)num的塊框絕對定位。

2-③:用創(chuàng)建函數(shù)getminHIndex()-返回一個數(shù)組中的最小值

  1. var pinHArr=[];//用于存儲 每列中的所有塊框相加的高度【隨著列數(shù)的不同此數(shù)組的length也隨之改變】  
  2.     for(var i=0;i<aPin.length;i++){//遍歷數(shù)組aPin的每個塊框元素  
  3.         var pinH=aPin[i].offsetHeight;//獲取數(shù)組aPin的第i個塊框的可見寬offsetHeight  
  4.         if(i<num){//  
  5.             pinHArr[i]=pinH; //第一行中的num個塊框aPin 先添加進數(shù)組pinHArr  
  6.         }else{  
  7.             var minH=Math.min.apply(null,pinHArr);//計算數(shù)組pinHArr中的最小值minH  
  8.             var minHIndex=getminHIndex(pinHArr,minH);//通過創(chuàng)建的getminHIndex()-獲取最小值minH在數(shù)組pinHArr中的索引minHIndex  
  9.             aPin[i].style.position='absolute';//設(shè)置絕對位移  
  10.             aPin[i].style.top=minH+'px';  
  11.             aPin[i].style.left=aPin[minHIndex].offsetLeft+'px';//數(shù)組 最小高元素的高 + 添加上的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.     }  

3:設(shè)置窗口滾動事件的監(jiān)聽函數(shù):讀取數(shù)據(jù)添加塊框。

  1. var dataInt={'data':[{'src':'g (1).jpg'},{'src':'g (9).jpg'},{'src':'g (2).jpg'},{'src':'g (4).jpg'}]};//一個臨時的數(shù)據(jù)對象  
  2.     //下面定義窗口滾動事件監(jiān)聽函數(shù)  
  3.     window.onscroll=function(){  
  4.         if(checkscrollside()){  
  5.         var oParent=document.getElementById('main');// 父級對象  
  6.         for(var i=0;i<dataInt.data.length;i++){  
  7.             var oPin=document.createElement('div'); //創(chuàng)建添加 元素節(jié)點pin  
  8.             oPin.className='pin';                   //添加 類名 name屬性  
  9.             oParent.appendChild(oPin);              //創(chuàng)建添加 子節(jié)點box  
  10.             var oBox=document.createElement('div');  
  11.             oBox.className='box';  
  12.             oPin.appendChild(oBox);  
  13.             var oImg=document.createElement('img');//創(chuàng)建添加 子節(jié)點img  
  14.             oImg.src='./images/'+dataInt.data[i].src;  
  15.             oBox.appendChild(oImg);  
  16.         }  
  17.         waterfall('main','pin');//將①②封裝成函數(shù)waterfall(),將添加的節(jié)點添加到添加和定位到文檔中。  
  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);//創(chuàng)建【觸發(fā)添加塊框函數(shù)waterfall()】的高度:最后一個塊框的距離網(wǎng)頁頂部+自身高的一半(實現(xiàn)未滾到底就開始加載)  
  5.         var scrollTop=document.documentElement.scrollTop||document.body.scrollTop;//注意解決兼容性  
  6.         var documentH=document.documentElement.clientHeight;//窗口高度  
  7.         return (lastPinH<scrollTop+documentH)?true:false;//到達指定高度后 返回true,觸發(fā)waterfall()函數(shù)  
  8.     } 

三、最終效果:

四、總結(jié):此為讓自己梳理一下思路,表達不太仔細連貫,僅供參考。

#p#

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

html:index.html

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
  2.  <html xmlns="http://www.w3.org/1999/xhtml"> 
  3.  <head> 
  4.  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
  5.  <meta name="anchor" content="who care?" /> 
  6.  <script type="text/javascript" src="waterfall.js"/></script> 
  7.    
  8.  <title></title> 
  9.  <style type="text/css"> 
  10.      *{padding: 0;margin:0;}  
  11.      #main{  
  12.          position: relative;  
  13.      }  
  14.      .pin{  
  15.          padding: 15px 0 0 15px;  
  16.          float:left;  
  17.      }  
  18.      .box{  
  19.          padding: 10px;  
  20.          border:1px solid #ccc;  
  21.          box-shadow: 0 0 6px #ccc;  
  22.          border-radius: 5px;  
  23.      }  
  24.      .box img{  
  25.          width:162px;  
  26.          height:auto;  
  27.      }  
  28.  </style> 
  29.  </head> 
  30.  <body> 
  31.  <div id="main"> 
  32.      <div class="pin"> 
  33.          <div class="box"> 
  34.              <img src="./images/g (1).jpg"/> 
  35.          </div> 
  36.      </div> 
  37.      <div class="pin"> 
  38.          <div class="box"> 
  39.              <img src="./images/g (2).jpg"/> 
  40.          </div> 
  41.      </div> 
  42.      <div class="pin"> 
  43.          <div class="box"> 
  44.              <img src="./images/g (3).jpg"/> 
  45.          </div> 
  46.      </div> 
  47.      <div class="pin"> 
  48.          <div class="box"> 
  49.              <img src="./images/g (4).jpg"/> 
  50.          </div> 
  51.      </div> 
  52.      <div class="pin"> 
  53.          <div class="box"> 
  54.              <img src="./images/g (5).jpg"/> 
  55.          </div> 
  56.      </div> 
  57.  </div> 
  58.  </body> 
  59.  </html> 

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<dataInt.data.length;i++){  
  9.              var oPin=document.createElement('div'); //添加 元素節(jié)點  
  10.              oPin.className='pin';                   //添加 類名 name屬性  
  11.              oParent.appendChild(oPin);              //添加 子節(jié)點  
  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的數(shù)組aPin  
  31.      var iPinW=aPin[0].offsetWidth;// 一個塊框pin的寬  
  32.      var num=Math.floor(document.documentElement.clientWidth/iPinW);//每行中能容納的pin個數(shù)【窗口寬度除以一個塊框?qū)挾取? 
  33.      oParent.style.cssText='width:'+iPinW*num+'px;ma rgin:0 auto;';//設(shè)置父級居中樣式:定寬+自動水平外邊距  
  34.    
  35.      var pinHArr=[];//用于存儲 每列中的所有塊框相加的高度。  
  36.      for(var i=0;i<aPin.length;i++){//遍歷數(shù)組aPin的每個塊框元素  
  37.          var pinH=aPin[i].offsetHeight;  
  38.          if(i<num){  
  39.              pinHArr[i]=pinH; //第一行中的num個塊框pin 先添加進數(shù)組pinHArr  
  40.          }else{  
  41.              var minH=Math.min.apply(null,pinHArr);//數(shù)組pinHArr中的最小值minH  
  42.              var minHIndex=getminHIndex(pinHArr,minH);  
  43.              aPin[i].style.position='absolute';//設(shè)置絕對位移  
  44.              aPin[i].style.top=minH+'px';  
  45.              aPin[i].style.left=aPin[minHIndex].offsetLeft+'px';  
  46.              //數(shù)組 最小高元素的高 + 添加上的aPin[i]塊框高  
  47.              pinHArr[minHIndex]+=aPin[i].offsetHeight;//更新添加了塊框后的列高  
  48.          }  
  49.      }  
  50.  }  
  51.      /****  
  52.          *通過父級和子元素的class類 獲取該同類子元素的數(shù)組  
  53.          */ 
  54.      function getClassObj(parent,className){  
  55.          var obj=parent.getElementsByTagName('*');//獲取 父級的所有子集  
  56.          var pinS=[];//創(chuàng)建一個數(shù)組 用于收集子元素  
  57.          for (var i=0;i<obj.length;i++) {//遍歷子元素、判斷類別、壓入數(shù)組  
  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);//創(chuàng)建【觸發(fā)添加塊框函數(shù)waterfall()】的高度:最后一個塊框的距離網(wǎng)頁頂部+自身高的一半(實現(xiàn)未滾到底就開始加載)  
  80.          var scrollTop=document.documentElement.scrollTop||document.body.scrollTop;//注意解決兼容性  
  81.          var documentH=document.documentElement.clientHeight;//頁面高度  
  82.          return (lastPinH<scrollTop+documentH)?true:false;//到達指定高度后 返回true,觸發(fā)waterfall()函數(shù)  
  83.      } 

原文鏈接:http://www.cnblogs.com/slowsoul/archive/2013/02/10/2909746.html

責(zé)任編輯:林師授 來源: 博客園
相關(guān)推薦

2024-08-19 14:01:00

2021-08-09 07:26:33

瀑布流布局代碼

2010-09-14 16:57:29

DIV絕對定位CSS

2012-05-02 13:53:00

JavaScript

2010-09-01 14:02:27

絕對定位浮動CSS

2010-09-07 15:38:42

CSS絕對定位浮動

2010-08-16 11:28:02

DIV

2010-08-26 16:48:48

DIV絕對定位相對定位

2010-09-06 11:17:19

CSS相對定位CSS絕對定位

2009-12-29 10:06:09

WPF Canvas

2010-09-10 11:32:23

CSS絕對定位CSS相對定位

2010-09-10 12:40:06

CSS相對定位CSS絕對定位

2024-09-03 17:04:15

前端算法布局

2021-01-29 10:57:57

新基建政策解讀智慧物流

2010-08-25 14:45:57

CSS絕對定位

2010-09-10 13:07:51

CSS DIV絕對定位CSS DIV固定定位

2010-08-17 11:10:16

DIV+CSS

2010-09-14 16:39:26

CSS DIV相對定位CSS DIV絕對定位

2022-06-28 22:17:52

瀏覽器底層css

2010-08-16 08:54:48

DIVCSS
點贊
收藏

51CTO技術(shù)棧公眾號