亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

瀑布流的實現方式(原生js+jquery+css3)

2019-11-20 09:29:34
字體:
來源:轉載
供稿:網友

前言
 項目需求要弄個瀑布流的頁面,用的是waterfall這個插件,感覺還是可以的,項目趕就沒自己的動手寫。最近閑來沒事,就自己寫個。大致思路理清楚,還是挺好實現的... 

原生javascript版 

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>瀑布流-javascript</title> <style> *{margin:0;padding:0;} #content{position: relative;margin:0 auto;} .box{padding:10px;float: left;}/*首行浮動,第二行開始絕對定位*/ .box img{width: 180px;height:auto;display: block;} </style> <script> window.onload=function(){  waterfall('content','box');    //改變窗口大小時,重新排列  window.onresize = function(){  waterfall('content','box');  }    //如果數據不夠,沒出現滾動條,自動加載數據  var time=setInterval(function(){  if(checkscrollside()){   addDate();//插入數據   waterfall('content','box');//加載完數據從新排列  }else{   clearInterval(time);   window.onscroll=function(){   if(checkscrollside()){    addDate();    waterfall('content','box');   };   }  }  },1000)    }  // 數據插入 function addDate(){  var dataInt=['1.jpg','2.jpg','3.jpg','4.jpg','5.jpg','6.jpg','7.jpg','8.jpg'];//模擬數據,也可以是對象  var oParent = document.getElementById('content');  for(var i=0;i<dataInt.length;i++){//循環插入數據   var oBox=document.createElement('div');  oBox.className='box';  oParent.appendChild(oBox);  var oImg=document.createElement('img');  oImg.src='./img/'+dataInt[i];  oBox.appendChild(oImg);  } } //主函數 function waterfall(parentID,childClass){  var oParent=document.getElementById(parentID);  var arrBox=getClassObj(parentID,childClass);// getClassObj()獲取子class的數組  var iBoxW=arrBox[0].offsetWidth;// 獲取瀑布流塊的寬度  var num=Math.floor(document.documentElement.clientWidth/iBoxW);//計算窗口能容納幾列  oParent.style.width=iBoxW*num+'px';//設置父級寬度  var arrBoxH=[];//數組,用于存儲每列中的所有塊框相加的高度  for(var i=0;i<arrBox.length;i++){//遍歷數組瀑布流 塊  var boxH=arrBox[i].offsetHeight;//獲取當前塊的高度  if(i<num){   arrBox[i].style.cssText="";//防止用戶改變窗口大小,到時樣式出錯   arrBoxH[i]=boxH; //第一行中的num個塊box 先添加進數組arrBoxH  }else{   var minH=Math.min.apply(null,arrBoxH);//獲取數組arrBoxH中的最小值minH   var minHIndex=getminHIndex(arrBoxH,minH);//遍歷數組獲取最小值minH的索引   arrBox[i].style.position='absolute';//設置絕對位移   arrBox[i].style.top=minH+'px';   arrBox[i].style.left=minHIndex*iBoxW+'px';//也可以直接獲取arrBox[minHIndex].offsetLeft   arrBoxH[minHIndex]+=arrBox[i].offsetHeight;//添加后,更新最小列高  }  } } //獲取子class的數組 function getClassObj(parentID,childClass){  var oParent=document.getElementById(parentID);  var allChildObj=oParent.getElementsByTagName('*');//獲取父級下的所有子集  var childObj=[];//創建一個數組 用于收集子元素  for (var i=0;i<allChildObj.length;i++) {//遍歷子元素、判斷類別、壓入數組  if (allChildObj[i].className==childClass){   childObj.push(allChildObj[i]);  }  };  return childObj; } //獲取數組最小值的索引 function getminHIndex(arr,minH){  for(var i in arr){  if(arr[i]==minH){   return i;  }  } } // 判斷滾動條是否到底部 function checkscrollside(){  var arrBox=getClassObj("content",'box');  //獲取最后一個瀑布流塊的高度:距離網頁頂部(實現未滾到底就開始加載)  var lastBoxH=arrBox[arrBox.length-1].offsetTop;  var scrollTop=document.documentElement.scrollTop||document.body.scrollTop;//獲取滾動條卷走的高度  var documentH=document.documentElement.clientHeight;//顯示頁面文檔的高  return (lastBoxH<scrollTop+documentH)?true:false;//到達指定高度后 返回true,觸發waterfall()函數 } </script></head><body> <div id="content"> <div class="box"><img src="img/0.jpg" alt=""></div> <div class="box"><img src="img/1.jpg" alt=""></div> <div class="box"><img src="img/2.jpg" alt=""></div> <div class="box"><img src="img/3.jpg" alt=""></div> <div class="box"><img src="img/4.jpg" alt=""></div> <div class="box"><img src="img/5.jpg" alt=""></div> <div class="box"><img src="img/6.jpg" alt=""></div> <div class="box"><img src="img/7.jpg" alt=""></div> <div class="box"><img src="img/8.jpg" alt=""></div> <div class="box"><img src="img/9.jpg" alt=""></div> <div class="box"><img src="img/10.jpg" alt=""></div> </div></body></html>

jquery版本 

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>瀑布流-jquery</title> <style> *{margin:0;padding:0;} #content{position: relative;margin:0 auto;} .box{padding:10px;float: left;} .box img{width: 180px;height:auto;display: block;} </style> <script src="js/jquery-1.11.1.min.js"></script> <script> $(function(){  waterfall();    //改變窗口大小時,重新排列  $(window).resize(function(){  waterfall();  })    //如果數據不夠,沒出現滾動條,自動加載數據  var time=setInterval(function(){  if(checkscrollside()){   addDate();//插入數據   waterfall();//加載完數據從新排列  }else{   clearInterval(time);   $(window).scroll(function(){   if(checkscrollside()){    addDate();    waterfall();   };   })  }  },1000)    })  // 數據插入 function addDate(){  var dataInt=['1.jpg','2.jpg','3.jpg','4.jpg','5.jpg','6.jpg','7.jpg','8.jpg'];//模擬數據,也可以是對象  var oParent = $('#content');  for(var i=0;i<dataInt.length;i++){//循環插入數據  oParent.append('<div class="box"><img src="./img/'+dataInt[i]+'" alt=""></div>');   } } //主函數 function waterfall(){  var arrBox=$('#content').children('.box');// box對象  var iBoxW=arrBox.eq(0).innerWidth();// 獲取瀑布流塊的寬度,注意width(),跟innerWidth()的區別  var num=Math.floor($(window).width()/iBoxW);//計算窗口能容納幾列  $('#content').css('width',iBoxW*num);//設置父級寬度  var arrBoxH=[];//數組,用于存儲每列中的所有塊框相加的高度  for(var i=0;i<arrBox.length;i++){//遍歷數組瀑布流 塊  var boxH=arrBox.eq(i).innerHeight();//獲取當前塊的高度  if(i<num){   arrBox.eq(i).attr('style','');//防止用戶改變窗口大小,到時樣式出錯   arrBoxH[i]=boxH; //第一行中的num個塊box 先添加進數組arrBoxH  }else{   var minH=Math.min.apply(null,arrBoxH);//獲取數組arrBoxH中的最小值minH   var minHIndex=$.inArray(minH,arrBoxH);//使用jquery提供的工具   arrBox.eq(i).css({'position':'absolute','top':minH,'left':minHIndex*iBoxW});//設置定位   arrBoxH[minHIndex]+=arrBox.eq(i).innerHeight();//添加后,更新最小列高  }  } } // 判斷滾動條是否到底部 function checkscrollside(){  var arrBox=$('#content').children('.box');  //獲取最后一個瀑布流塊的高度:距離網頁頂部(實現未滾到底就開始加載)  var lastBoxH=arrBox.eq(arrBox.length-1).offset().top;  var scrollTop=$(window).scrollTop()//獲取滾動條卷走的高度  var documentH=$(window).height();;//顯示頁面文檔的高  return (lastBoxH<scrollTop+documentH)?true:false;//到達指定高度后 返回true,觸發waterfall()函數 } </script></head><body> <div id="content"> <div class="box"><img src="img/0.jpg" alt=""></div> <div class="box"><img src="img/1.jpg" alt=""></div> <div class="box"><img src="img/2.jpg" alt=""></div> <div class="box"><img src="img/3.jpg" alt=""></div> <div class="box"><img src="img/4.jpg" alt=""></div> <div class="box"><img src="img/5.jpg" alt=""></div> <div class="box"><img src="img/6.jpg" alt=""></div> <div class="box"><img src="img/7.jpg" alt=""></div> <div class="box"><img src="img/8.jpg" alt=""></div> <div class="box"><img src="img/9.jpg" alt=""></div> <div class="box"><img src="img/10.jpg" alt=""></div> </div></body></html>

大致思路
 1.先讓第一行的浮動
 2.計算第一行的每個塊的高度
 3.遍歷第一行之后的每一個塊,逐個放在最小高度的下面
 4.加載數據插入最后,再重新計算 
注意點
 a.原生js 
1.定義了getClassObj()函數用于獲取class類的對象,方便調用??紤]了兼容性 getElementsByClassName  
2.定義了getminHIndex()函數用戶獲取最小值的索引 
3.設置塊與塊之間的距離最好用padding,這樣的話offsetHeight可以直接獲取得到高度。如果設置margin則得多加個外邊距的距離 
4.代碼中設置了定時器加載數據,其實可以省略,只要保證第一次加載的數據能滿屏就可以。如果沒出現滾動條的話onscroll事件是不會執行到的。也就沒辦法加載數據了 
5.代碼中的計算寬度也可以修改,設計的頁面是定寬的瀑布流的話。這里主要是做了響應式的處理 

var arrBox=getClassObj(parentID,childClass);// getClassObj()獲取子class的數組var iBoxW=arrBox[0].offsetWidth;// 獲取瀑布流塊的寬度var num=Math.floor(document.documentElement.clientWidth/iBoxW);//計算窗口能容納幾列oParent.style.width=iBoxW*num+'px';//設置父級寬度 

6.每設置一塊位移,都要在列高的數組上增加數值,防止塊重疊 

arrBox[i].style.position='absolute';//設置絕對位移arrBox[i].style.top=minH+'px';arrBox[i].style.left=minHIndex*iBoxW+'px';//也可以直接獲取arrBox[minHIndex].offsetLeftarrBoxH[minHIndex]+=arrBox[i].offsetHeight;//添加后,更新最小列高 

 b.jquery
 1.思路是跟js一樣的,只是jquery封裝了很多方法,讓我們簡便的就實現了
 2.注意width(),跟innerWidth()的區別。前者只能獲取寬度值(不包括補白padding) 

css3版本

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>瀑布流-css3</title> <style> *{margin:0;padding:0;} #content{margin:0 auto;position: relative;width:1200px;column-count:6;-moz-column-count:6;-webkit-column-count:6;} .box{padding:10px;width: 180px;} .box img{width: 180px;height:auto;display: block;} </style> <script> window.onload=function(){  //如果數據不夠,沒出現滾動條,自動加載數據  var time=setInterval(function(){  if(checkscrollside()){   addDate();//插入數據  }else{   clearInterval(time);   window.onscroll=function(){   if(checkscrollside()){    addDate();   };   }  }  },1000)    }  // 數據插入 function addDate(){  var dataInt=['1.jpg','2.jpg','3.jpg','4.jpg','5.jpg','6.jpg','7.jpg','8.jpg'];//模擬數據,也可以是對象  var oParent = document.getElementById('content');  for(var i=0;i<dataInt.length;i++){//循環插入數據   var oBox=document.createElement('div');  oBox.className='box';  oParent.appendChild(oBox);  var oImg=document.createElement('img');  oImg.src='./img/'+dataInt[i];  oBox.appendChild(oImg);  } } //獲取子class的數組 function getClassObj(parentID,childClass){  var oParent=document.getElementById(parentID);  var allChildObj=oParent.getElementsByTagName('*');//獲取父級下的所有子集  var childObj=[];//創建一個數組 用于收集子元素  for (var i=0;i<allChildObj.length;i++) {//遍歷子元素、判斷類別、壓入數組  if (allChildObj[i].className==childClass){   childObj.push(allChildObj[i]);  }  };  return childObj; } // 判斷滾動條是否到底部 function checkscrollside(){  var arrBox=getClassObj("content",'box');  //獲取最后一個瀑布流塊的高度:距離網頁頂部(實現未滾到底就開始加載)  var lastBoxH=arrBox[arrBox.length-1].offsetTop;  var scrollTop=document.documentElement.scrollTop||document.body.scrollTop;//獲取滾動條卷走的高度  var documentH=document.documentElement.clientHeight;//顯示頁面文檔的高  return (lastBoxH<scrollTop+documentH)?true:false;//到達指定高度后 返回true,觸發waterfall()函數 } </script></head><body> <div id="content"> <div class="box"><img src="img/0.jpg" alt=""></div> <div class="box"><img src="img/1.jpg" alt=""></div> <div class="box"><img src="img/2.jpg" alt=""></div> <div class="box"><img src="img/3.jpg" alt=""></div> <div class="box"><img src="img/4.jpg" alt=""></div> <div class="box"><img src="img/5.jpg" alt=""></div> <div class="box"><img src="img/6.jpg" alt=""></div> <div class="box"><img src="img/7.jpg" alt=""></div> <div class="box"><img src="img/8.jpg" alt=""></div> <div class="box"><img src="img/9.jpg" alt=""></div> <div class="box"><img src="img/10.jpg" alt=""></div> </div></body></html>

注意點

1.滾動加載還是得另外加js 
2.加載的數據,是豎向排列的。體驗不是很友好 
3.有兼容性問題,Internet Explorer 10 +

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久亚洲私人国产精品va| 色噜噜狠狠色综合网图区| 亚洲在线视频观看| 丝袜美腿亚洲一区二区| 国产精品欧美一区二区| 91精品久久久久久久久中文字幕| 日韩的一区二区| 91成人精品网站| 日韩欧美a级成人黄色| 久久久久久亚洲精品| 国产欧美中文字幕| 成人精品久久av网站| 精品久久久久人成| 亚洲美女视频网站| 欧美日韩国产中文精品字幕自在自线| 亚洲欧洲中文天堂| 韩国一区二区电影| 成人免费直播live| 综合久久五月天| 日韩久久免费视频| 第一福利永久视频精品| 在线观看视频99| 亚洲精品电影网站| 成人做爽爽免费视频| 97国产真实伦对白精彩视频8| 亚洲大尺度美女在线| 国产欧美一区二区白浆黑人| 欧美日韩高清在线观看| 国产91成人在在线播放| 国语自产精品视频在线看一大j8| 成人伊人精品色xxxx视频| 国产精品精品久久久久久| 欧美性xxxx18| 亚洲欧美变态国产另类| 成人福利网站在线观看11| 国产精品精品视频一区二区三区| 国产乱人伦真实精品视频| 91国产在线精品| 国产精品久久久久久久久久久新郎| 亚洲一区二区三区久久| 亚洲色在线视频| 久久免费精品视频| 欧美成人精品激情在线观看| 91中文字幕在线观看| 亚洲午夜久久久影院| 国产精品视频地址| 欧美一级片一区| 粗暴蹂躏中文一区二区三区| 亚洲人成在线播放| 亚洲欧美中文字幕在线一区| 欧美一级视频一区二区| 国产亚洲精品久久久优势| 亚洲欧美日韩中文在线| 激情懂色av一区av二区av| 久久久国产视频| 九九热99久久久国产盗摄| 欧美亚洲在线视频| 欧美成人精品三级在线观看| 91chinesevideo永久地址| 国产一区欧美二区三区| 尤物精品国产第一福利三区| 欧美国产日韩二区| 美日韩精品免费观看视频| 一区二区在线视频播放| 韩国19禁主播vip福利视频| 欧美大片在线看| 免费不卡欧美自拍视频| 成人午夜小视频| 国产亚洲欧美日韩美女| 欧美肥臀大乳一区二区免费视频| 在线视频欧美日韩精品| 欧美老妇交乱视频| 色综合久久久久久中文网| 777午夜精品福利在线观看| 欧美日韩国产色| 91亚洲精品在线| 一区二区三区国产在线观看| 国产欧美日韩精品专区| 日韩成人在线网站| 国产一区二区三区在线| 91超碰中文字幕久久精品| 黑人巨大精品欧美一区二区一视频| 国产精品一区二区女厕厕| 狠狠躁夜夜躁人人爽超碰91| 欧美激情视频一区| 亚洲国产日韩欧美在线图片| 亚洲日韩欧美视频| 久久影院免费观看| 国产精品尤物福利片在线观看| 久久频这里精品99香蕉| 国产精品久久久久久久久久久久久久| 成人av在线天堂| 久久久亚洲影院| 国产精品v片在线观看不卡| 久久精品国产成人| 91精品国产乱码久久久久久久久| 51午夜精品视频| 91免费在线视频| 中文字幕在线国产精品| 亚洲人成网站色ww在线| 不卡伊人av在线播放| 成人av.网址在线网站| 亚洲片在线资源| 亚洲精选一区二区| 奇米四色中文综合久久| 91日韩在线播放| 色综合老司机第九色激情| 一本一道久久a久久精品逆3p| 在线视频欧美日韩| 久久网福利资源网站| 亚洲成人三级在线| 国产精品美腿一区在线看| 欧美在线性视频| 日韩欧美综合在线视频| 91社影院在线观看| 国产精品久久久久久超碰| 68精品国产免费久久久久久婷婷| 色悠悠久久88| 亚洲男人7777| 日韩在线观看高清| 国产精品久久久久久久电影| 久久伊人91精品综合网站| 91久久久在线| 97香蕉超级碰碰久久免费的优势| 亚洲精品国产精品自产a区红杏吧| 高清欧美性猛交xxxx| 57pao成人永久免费视频| 欧美激情一区二区三级高清视频| 97精品视频在线播放| 欧美日韩国产va另类| 欧美激情在线一区| 92看片淫黄大片欧美看国产片| 欧美国产日韩xxxxx| 国产一区二区丝袜| 日本三级韩国三级久久| 久久这里有精品视频| 一区二区三区视频在线| 亚洲国产精品va在看黑人| 国产拍精品一二三| 国产精品午夜视频| 日韩中文在线中文网在线观看| 上原亚衣av一区二区三区| 成人黄色生活片| 国产精品久久综合av爱欲tv| 日韩在线观看免费高清完整版| 亚洲国产成人久久综合| 国产精品高潮呻吟久久av野狼| 永久555www成人免费| 国产丝袜精品视频| 欧美国产亚洲精品久久久8v| 国产精品久久久久久一区二区| 91精品国产91久久久久福利| 亚洲第一精品电影| 久久91精品国产91久久久| 日韩欧美成人免费视频| 欧美日韩国产成人在线| 亚洲电影在线看| 亚洲最新在线视频| 欧美体内谢she精2性欧美| 97色在线视频观看| 91干在线观看| 毛片精品免费在线观看| 国产精品视频午夜| 欧美伊久线香蕉线新在线|