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

首頁 > 開發 > JS > 正文

JS原生瀑布流效果實現

2024-05-06 16:50:20
字體:
來源:轉載
供稿:網友

今天早起看了慕課的瀑布流,的確講的十分詳細,也十分的好,我在博客里也就只能給代碼加些注釋,和說一下思路。建議大家去看一下慕課的瀑布流教程,非常詳細,每一個細節都講的非常好,只要懂JS的基礎代碼,看起來應該不是多大問題,里面沒有太難得方法,但自己寫不出來還是因為思路上有問題,下面就詳細說一下幾個重點方法的代碼,建議大家去慕課詳細學習 
HTML 和CSS沒有太難得地方

<div id="main">//一個main包含了整個頁面內容,box用來做一個外容器,img作為圖片容器  <div class="box">   <div class="pic">    <img src="img/0.jpg">   </div>  </div>  <div class="box">   <div class="pic">    <img src="img/0.jpg">   </div>  </div> <div>
 //CSS //這里面的填充用padding值,因為offsetHeight是包括一個padding而不包括margin的方便以后高度的測量*{ margin: 0px; padding: 0px;}#main{ position: relative;//在main上設置相對定位,在JS給box設置絕對定位,來控制圖片位置}.box{ padding: 15px 0 0 15px;  float: left;}.pic{ padding: 10px; border: 1px solid #ccc; border-radius:5px; box-shadow: 0 0 5px #ccc;}.pic img{ width: 168px;//瀑布流統一寬度但不同一高度,高度為自適應就好 height: auto;}

JS代碼

在我們寫JS代碼之前,我們需要搞明白我們需要什么方法,是否需要封裝起來調用,我們第一步要干什么, 
那么我們第一步要干什么呢?我們做瀑布流首先要做的是獲取到所有小部件也就是box,我們無論做什么處理都是對box的處理或者img的處理,所以要獲取到所有的box,所以我們可以把它封裝起來

//根據class獲取元素function getByClass(parent,clsName){//傳入父元素和想要的class var boxArr=new Array//用來存儲獲取到所有class為box的元素,可以用對象的方式也可以用[]創建 oElements=parent.getElementsByTagName('*');//取出所有子元素 for (var i = 0; i < oElements.length; i++) {//我們需要遍歷所有的子元素  if(oElements[i].className==clsName)//如果我們找到了相應的子元素   boxArr.push(oElements[i]);//取出傳過來相等的className   //push是數組自帶的方法 }; return boxArr;返回數組}

這樣我們就得到了我們想要的class,之后該怎么辦呢,先從一個box下手,我們需要取得第一排到底有多少個元素,因為之前我們并沒有確定我們main的寬度,所以是自適應的也就是說我們把頁面縮小,我們每一排的元素也會相應的減少,為了能讓瀑布流的代碼有更好的應用性,讓不同尺寸的圖片都可以應用,所以,我們需要手動計算一排究竟可以放多少張圖片呢,那如何計算呢? 
我們可以算出頁面總寬在box的寬,就OK了

 var oBoxW=oBoxs[0].offsetWidth;//box的寬,提到了里面計算了padding的值
  var clos=Math.floor(document.documentElement.clientWidth/oBoxW)//求列數
  這樣我們就求出了列數,無論圖片的寬度如何變,我們都可以算出來
  floor是用來取整數的,因為我們的px是沒有浮點數類型的避免計算錯誤,所以取整
  oparent.style.cssText='width:'+oBoxW*clos+'px; margin :0 auto';
  設置main的寬度

我們已經取得了列數之后呢我們第一排的圖片肯定是一排寬度相等,長度不一是吧,也就是說,我們第二排的圖片需要接上第一排圖片的后邊,我們不能一排一排操作,但我們可以一個一個操作,怎么操作呢,我們可以取到第一排高度最小的將下一張圖片,也就是如果第一排7個,那下一個就是第八個,把第八個圖片放在最小高度的圖片上,如何實現呢,我們先試想一下,我們首先需要求出第一排中最小,我們有一個Math.min求最小,但是呢我們這個函數無法傳入用數組,只能是具體的數怎么半呢,apply來擴展作用域 
用代碼展示下

var hArr=[];//每一列高度的值 for (var i = 0; i < oBoxs.length; i++) {  if(i<clos){//先記錄好第一排高度   hArr.push(oBoxs[i].offsetHeight);//放進去  }else{//如果到達第二排,就開始計算   var minH=Math.min.apply(Math,hArr);最小值計算   //為什么可以呢,本來不能傳數組,我們通過apply綁定作用域在Math上,也就是說還是執行這個函數但是,apply第二個參數需要是數組,所以間接地把參數變成了數組傳進去,也就是說我們還是用了Math函數但值變成了數組里的值。   //console.log(minH)   var index=getMinhIndex(hArr,minH)//獲取索引   oBoxs[i].style.position="absolute";我們就可以找到,傳入數組和最小值   oBoxs[i].style.top=minH+"px";那下一張圖片的高度救球出來了   oBoxs[i].style.left=oBoxW*index+"px";左邊的距離就是索引乘以元素的寬   hArr[index]+=oBoxs[i].offsetHeight;//我們添加了一個圖片后需要刷新數組里的高度,再去尋找下一個最小的,再向他的下面添加圖片,一次循環  } };function getMinhIndex (arr,val){ for(var i in arr){//在其中找到最小值,返回索引  if(arr[i]==val){   return i;  } }}

以上就大體做出了一個瀑布流的樣式,就差拖動滾動條加載了,這里面肯定需要后臺的支持,在慕課上,老師做了一個偽處理,這里建議看慕課視頻,有圖解十分清楚,我用語言或圖片不太好表達

var dataInt={"data":[{"src":'0.jpg'},{"src":'1.jpg'},{"src":'2.jpg'},{"src":'3.jpg'}]}//我們自己寫一個json數據 window.onscroll=function(){  if(checkScrollSlide){   var oparent=document.getElementById("main")   //將數據快渲染到當前頁面尾部   for (var i = 0; i < dataInt.data.length; i++) {//添加    var oBox=document.createElement("div");    oBox.className="box";    oparent.appendChild(oBox);    var opic=document.createElement('div');    opic.className='pic';    oBox.appendChild(opic);    var oimg=document.createElement('img');    oimg.src='img/'+dataInt.data[i].src;//將數據加進去    opic.appendChild(oimg)   }   waterfall('main','box');//一會看完整代碼,這就是剛才那些的封裝  } } 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.body.scrollTop||document.documentElement.scrollTop; var height=document.body.clientHeight||document.documentElement.clientHeight; return(lastBoxH<scrollTop+height)?true:false;//如果頁面距離頂部(包括滾輪)的距離比滾輪加頁面距離小,那么就返回true}

完整JS代碼

window.onload=function(){ waterfall('main','box'); //json var dataInt={"data":[{"src":'0.jpg'},{"src":'1.jpg'},{"src":'2.jpg'},{"src":'3.jpg'}]} window.onscroll=function(){  if(checkScrollSlide){   var oparent=document.getElementById("main")   //將數據快渲染到當前頁面尾部   for (var i = 0; i < dataInt.data.length; i++) {    var oBox=document.createElement("div");    oBox.className="box";    oparent.appendChild(oBox);    var opic=document.createElement('div');    opic.className='pic';    oBox.appendChild(opic);    var oimg=document.createElement('img');    oimg.src='img/'+dataInt.data[i].src;    opic.appendChild(oimg)   }   waterfall('main','box');  } }}function waterfall(parent,box){ //將main下所有class為box的元素取出來 var oparent=document.getElementById(parent); var oBoxs=getByClass(oparent,box) //console.log(oBox.length) //計算整個頁面的列數(頁面寬/box寬) var oBoxW=oBoxs[0].offsetWidth; //console.log(oBoxW); var clos=Math.floor(document.documentElement.clientWidth/oBoxW)//求列數 //console.log(clos) //設置main的寬 oparent.style.cssText='width:'+oBoxW*clos+'px; margin :0 auto'; var hArr=[];//每一列高度的值 for (var i = 0; i < oBoxs.length; i++) {  if(i<clos){   hArr.push(oBoxs[i].offsetHeight);  }else{   var minH=Math.min.apply(Math,hArr);   //console.log(minH)   var index=getMinhIndex(hArr,minH)//索引   oBoxs[i].style.position="absolute";   oBoxs[i].style.top=minH+"px";   oBoxs[i].style.left=oBoxW*index+"px";   hArr[index]+=oBoxs[i].offsetHeight;//更改數組  } }; //console.log(hArr)}//根據class獲取元素function getByClass(parent,clsName){ var boxArr=new Array//用來存儲獲取到所有class為box的元素 oElements=parent.getElementsByTagName('*');//取出所有子元素 for (var i = 0; i < oElements.length; i++) {  if(oElements[i].className==clsName)   boxArr.push(oElements[i]);//取出傳過來相等的className }; return boxArr;}function getMinhIndex (arr,val){ for(var i in arr){  if(arr[i]==val){   return i;  } }}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.body.scrollTop||document.documentElement.scrollTop; var height=document.body.clientHeight||document.documentElement.clientHeight; return(lastBoxH<scrollTop+height)?true:false;}

我的瀑布流圖

JS,瀑布流

以上所述是小編給大家介紹的JS原生瀑布流效果實現詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VeVb武林網網站的支持!


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品视频在线观看| 97视频国产在线| 亚洲一区999| 亚洲福利视频久久| 欧美国产一区二区三区| 最新国产精品拍自在线播放| 日韩黄色在线免费观看| 久久久亚洲成人| 亚洲精美色品网站| 国产婷婷97碰碰久久人人蜜臀| 久久亚洲精品一区二区| 亚洲精品网站在线播放gif| 精品国产区一区二区三区在线观看| 精品日韩美女的视频高清| 在线亚洲午夜片av大片| 欧美老女人性视频| 欧美激情久久久| 啊v视频在线一区二区三区| 欧洲亚洲免费视频| 国产亚洲一区二区在线| 欧美精品久久久久久久久久| 国内精品久久久久久中文字幕| 亚洲精品二三区| 3344国产精品免费看| 国产成人精品免费久久久久| 欧美日韩另类视频| 欧美性受xxxx黑人猛交| 国产日本欧美在线观看| 国产精品成人一区二区| 91亚洲国产成人精品性色| 成人日韩在线电影| 日韩av电影手机在线观看| 一区二区三区四区在线观看视频| 亚洲精品国产欧美| 欧美日韩在线看| 国产精品99久久久久久久久久久久| 久久精品福利视频| 精品国产美女在线| 国产丝袜视频一区| 欧美日韩成人在线播放| 日韩成人免费视频| 亚洲一区二区三区香蕉| 久久亚洲国产精品成人av秋霞| 亚洲欧美中文日韩在线v日本| 欧美极品少妇xxxxx| 成人精品视频久久久久| 国内精品久久久久| 久久久av免费| 亚洲高清福利视频| 在线播放日韩av| 亚洲人成在线播放| 97精品一区二区三区| 亚洲第一综合天堂另类专| 九九精品在线观看| 久久久在线观看| 综合欧美国产视频二区| 亚洲夜晚福利在线观看| 精品国产福利在线| 亚洲美女性视频| 欧美肥臀大乳一区二区免费视频| 国产女同一区二区| 成人在线视频网| 97精品久久久中文字幕免费| 欧美午夜精品久久久久久人妖| 亚洲国产精品va在线观看黑人| 欧美日韩午夜剧场| 欧美猛少妇色xxxxx| 亚洲色图18p| 日韩电影在线观看免费| 亚洲aⅴ日韩av电影在线观看| 国产精品一区二区三| 亚洲一区二区国产| 国产精品网红福利| 成人午夜在线观看| 日韩在线播放视频| 成人国产精品免费视频| 欧美极品在线视频| 精品久久久久久久大神国产| 久久久久99精品久久久久| 欧美日韩中文在线| 亚洲bt欧美bt日本bt| 日韩精品久久久久久久玫瑰园| 久久精品国产精品亚洲| 在线免费观看羞羞视频一区二区| 麻豆成人在线看| 中文字幕亚洲图片| 日韩欧美主播在线| www欧美xxxx| 亚洲影院色在线观看免费| www亚洲欧美| 亚洲人成啪啪网站| 欧美日韩色婷婷| www.久久久久久.com| 亚洲福利精品在线| 在线精品播放av| 91久久久久久久久久久| 国产亚洲精品va在线观看| www.欧美三级电影.com| 宅男66日本亚洲欧美视频| 欧美精品日韩www.p站| 欧美成人黄色小视频| 欧美高清视频在线| 91天堂在线观看| 亚洲一区制服诱惑| 国产精品三级网站| 日韩美女免费线视频| 成人女保姆的销魂服务| 中文字幕日韩高清| 精品露脸国产偷人在视频| 深夜福利亚洲导航| 久久久久久久久久国产精品| 91天堂在线观看| 韩曰欧美视频免费观看| 最近2019年手机中文字幕| 日韩欧美福利视频| 日韩一区二区三区在线播放| 久久精品国产综合| 欧美亚洲在线播放| 91亚洲精华国产精华| 亚洲精品免费一区二区三区| 国自产精品手机在线观看视频| 亚洲性生活视频在线观看| 亚洲一区二区三区四区视频| 国产精品一区二区av影院萌芽| 亚洲大胆人体视频| 尤物九九久久国产精品的特点| 日韩在线免费视频| 亚洲美女视频网站| 日本亚洲欧洲色α| 日韩欧美在线一区| 国产精品久久久久久久久粉嫩av| 91精品啪aⅴ在线观看国产| 国产成人午夜视频网址| 欧美性猛交xxxx黑人| 欧美国产日本在线| 欧美日韩国产麻豆| 日韩欧美a级成人黄色| 国产99久久精品一区二区 夜夜躁日日躁| 亚洲成avwww人| 欧美日韩国产精品一区二区三区四区| 国产精品久久不能| 国产福利视频一区二区| 日韩成人性视频| 中文字幕精品视频| 3344国产精品免费看| 欧美激情精品久久久久久久变态| 91成人性视频| 亚洲日韩欧美视频一区| 久久久久久久久久久亚洲| 亚洲一区二区三区在线免费观看| 美日韩在线视频| 午夜精品99久久免费| …久久精品99久久香蕉国产| 97视频网站入口| 欧美日韩国产成人高清视频| 国产精品一区二区三区毛片淫片| 日韩色av导航| 久久人91精品久久久久久不卡| 欧美日在线观看| 亚洲香蕉av在线一区二区三区| 国产精品一区二区久久久| 国产精品香蕉av| 亚洲自拍av在线| 日韩欧美在线视频日韩欧美在线视频|