js實現瀑布流載入圖片效果

来源:http://www.cnblogs.com/heyujun-/archive/2017/04/21/6745549.html
-Advertisement-
Play Games

今天學習了一個瀑布流載入效果,很多網站都有瀑布流效果,瀑布流就是很多產品顯示在網頁上,寬相同,高度不同,表現為多欄佈局,隨著頁面滾動條向下滾動,這種佈局還會不斷載入數據塊並附加至當前尾部。原理是:1.設定一行中的列數;2.取第一行中每一個div的高度並把每一個高度放進一個數組中;3.算出數組中最小高 ...


     今天學習了一個瀑布流載入效果,很多網站都有瀑布流效果,瀑布流就是很多產品顯示在網頁上,寬相同,高度不同,表現為多欄佈局,隨著頁面滾動條向下滾動,這種佈局還會不斷載入數據塊並附加至當前尾部。原理是:1.設定一行中的列數;2.取第一行中每一個div的高度並把每一個高度放進一個數組中;3.算出數組中最小高度的index值;4.把第二行的第一個div放到最小高度的div的下方並把重新算出的高度值放進數組中,重新計算最小高度的index值;5.以此類推實現多欄佈局的瀑布流效果;6.如果最後一張div的高度已滾動出現在底部時創建新的div添加到最後一張的後面,不斷迴圈以達到載入效果;接下來代碼實現。

<div id="main">
		<div class="box">
			<div class="Pic">
				<img src="images/0.jpg" alt="" />
			</div>
		</div>
		<div class="box">
			<div class="Pic">
				<img src="images/1.jpg" alt="" />
			</div>
		</div>
		<div class="box">
			<div class="Pic">
				<img src="images/2.jpg" alt="" />
			</div>
		</div>
		<div class="box">
			<div class="Pic">
				<img src="images/3.jpg" alt="" />
			</div>
		</div>
		<div class="box">
			<div class="Pic">
				<img src="images/4.jpg" alt="" />
			</div>
		</div>
		<div class="box">
			<div class="Pic">
				<img src="images/5.jpg" alt="" />
			</div>
		</div>
		<div class="box">
			<div class="Pic">
				<img src="images/6.jpg" alt="" />
			</div>
		</div>
		<div class="box">
			<div class="Pic">
				<img src="images/7.jpg" alt="" />
			</div>
		</div>
		<div class="box">
			<div class="Pic">
				<img src="images/8.jpg" alt="" />
			</div>
		</div>
		<div class="box">
			<div class="Pic">
				<img src="images/9.jpg" alt="" />
			</div>
		</div>
		<div class="box">
			<div class="Pic">
				<img src="images/10.jpg" alt="" />
			</div>
		</div>
		<div class="box">
			<div class="Pic">
				<img src="images/11.jpg" alt="" />
			</div>
		</div>
		<div class="box">
			<div class="Pic">
				<img src="images/12.jpg" alt="" />
			</div>
		</div>
		<div class="box">
			<div class="Pic">
				<img src="images/13.jpg" alt="" />
			</div>
		</div>
		<div class="box">
			<div class="Pic">
				<img src="images/14.jpg" alt="" />
			</div>
		</div>
		<div class="box">
			<div class="Pic">
				<img src="images/15.jpg" alt="" />
			</div>
		</div>
		<div class="box">
			<div class="Pic">
				<img src="images/16.jpg" alt="" />
			</div>
		</div>
		<div class="box">
			<div class="Pic">
				<img src="images/17.jpg" alt="" />
			</div>
		</div>
		<div class="box">
			<div class="Pic">
				<img src="images/18.jpg" alt="" />
			</div>
		</div>
		<div class="box">
			<div class="Pic">
				<img src="images/19.jpg" alt="" />
			</div>
		</div>
		<div class="box">
			<div class="Pic">
				<img src="images/20.jpg" alt="" />
			</div>
		</div>
		<div class="box">
			<div class="Pic">
				<img src="images/21.jpg" alt="" />
			</div>
		</div>
		<div class="box">
			<div class="Pic">
				<img src="images/22.jpg" alt="" />
			</div>
		</div>
	</div>
       *{padding: 0;margin: 0;}
	#main{
		width: 1000px;
		margin: 0 auto;
		position: relative;
	}
	.box{
		display: inline-block;
		float: left;
		padding: 10px 0 0 10px;
	}
	.Pic{
		border: 1px #ccc solid;
		padding: 10px;
		border-radius: 8px;
	}
	.Pic img{
		width: 162px;
	}

js代碼:

<script>
	window.onload=function(){
		waterFall('main','box');
		var dataInt={
			"data":[{"src":"0.jpg"},{"src":"1.jpg"},{"src":"2.jpg"},{"src":"3.jpg"},{"src":"4.jpg"},{"src":"5.jpg"},{"src":"6.jpg"},{"src":"7.jpg"}]
		};
        
        /*滾動條滾動時觸發的事件*/
		window.onscroll=function(){
			if(checkIsSlide()){  //結果返回是true則執行
				var omain=document.getElementById('main');
				/*添加div到頁面上*/
				for(var l=0;l<dataInt.data.length;l++){  
					var box=document.createElement('div');
					box.className="box";
					omain.appendChild(box);
					var pic=document.createElement('div');
					pic.className='Pic';
					box.appendChild(pic);
					var oimg=document.createElement('img');
					oimg.src="images/"+dataInt.data[l].src;
					pic.appendChild(oimg);
				}
				waterFall('main','box');  //新添加的div都要重新執行waterFall方法,以實現瀑布流效果
			}
		}
	}
    /*實現瀑布流效果,多欄佈局*/
	function waterFall(parent,pid){   //傳兩個參數,父元素parent和子元素pid
		var oparent=document.getElementById(parent);   //獲取父元素
		var opid=getClass(oparent,pid);   //獲取父元素下的classname為pid的所有子元素
		var cols=Math.floor(oparent.offsetWidth/opid[0].offsetWidth);  //父元素寬度/一個子元素的寬度,即一行的列數
		var arrH=[];   //存放每一列的高度的數組
		for(var j=0;j<opid.length;j++){
			if(j<cols){   
				arrH.push(opid[j].offsetHeight);//把第一行的高度都放進數組中
			}else{   //第二行開始
				var minH=Math.min.apply(null,arrH);   //計算arrH的最小值
				var Index=getHIndex(arrH,minH);  //使用getHIndex方法獲取最小值的index值
				/*把之後的div放到最小值div的下方*/
				opid[j].style.position='absolute';  
				opid[j].style.top=minH+'px';
				opid[j].style.left=opid[0].offsetWidth*Index+'px';
				arrH[Index]+=opid[j].offsetHeight; //數組中的最小值加上已放在下方的div的高度值並重新迴圈
			}
		}
		
	}

    /*獲取父元素下的classname為cls的所有元素*/
	function getClass(parent,cls){
		var obj=parent.getElementsByTagName('*');
		var Clsarr=[];
		for(var i=0;i<obj.length;i++){
			if(obj[i].className==cls){
				Clsarr.push(obj[i]);
			}
		}
		return Clsarr;
	}
    /*獲取arr數組中的最小值minH的Index值*/
	function getHIndex(arr,minH){
		for(var k=0;k<arr.length;k++){
			if(arr[k]==minH){
				return k;
			}
		}
	}
    /*判斷當前滾動的高度時候大於最後的div出現在底部的高度值,即是否要載入*/
	function checkIsSlide(){
		var omain=document.getElementById('main');
		var obox=getClass(omain,'box');
		var lastTop=obox[obox.length-1].offsetTop+Math.floor(obox[obox.length-1].offsetHeight/2);
		var scrollTop=document.body.scrollTop||document.documentElement.scrollTop;
		var documentH=document.documentElement.clientHeight;
		return (lastTop)<(scrollTop+documentH)?true:false;
	}
</script>

效果圖如下:

推薦網址:http://www.imooc.com/learn/101   詳細講解瀑布流佈局的教學視頻


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 原因是radio一定要設置相同的name,如下: <input type="radio" name="yunsuan" checked="checked" />四則運算 <input type="radio" name="yunsuan" />矩形運算 其中checked="checked"表示:這 ...
  • 第一步,需要下載並安裝node.js以及他的npm組件; 第二步,用node -v;npm -v來測試node.js以及npm是否安裝成功(建議用GIT命令行工具,因為GIT是linux系統),如果顯示出它的版本,說明已經安裝成功,如下圖; 第三步,下載vue-cli,在命令行中輸入npm inst ...
  • 一、水平居中 1. text-align:center(行內元素) 給其父元素設置屬性 text-align:center; 2. margin: 0 auto(塊級元素) 給元素本身設置 margin: 0 auto; 3. 元素的寬度固定 1⃣️ position+margin-left 2⃣️ ...
  • JavaScript學習 【js中的數組】 1、數組的概念:是在記憶體中連續儲存對個有序元素的結構 元素的順序稱為下標,通過下標查找對象元素。 2、數組的聲明: ① 字面量聲明:var arr1 = []; js中,同一數組,可以儲存多種不同的數據類型: 例如: var arr1 = [1,"2",t ...
  • 日期經過json序列化之後,變成了'/Date(-62135596800000)/'字元串,在顯示數據時,我們需要解釋成正常的日期。 Insus.NET和js庫中,寫了一個jQuery擴展方法: $.extend({ JsonDateParse: function (value) { if (val ...
  • 接上一篇 "實現收發消息" 這一篇實現聊天視窗的功能 接收到消息或者發送消息,讓頁面顯示最新的消息內容 就像qq微信聊天那樣,接收到消息,或者你發送消息之後,讓最新的消息顯示在最下麵 實現思路就是, 監聽發送和接收消息事件, 一旦觸發了事件, 就讓聊天內容所在的元素的底端和其所在滾動區的可視區域的底 ...
  • <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Document</title> <style> *{ margin:0; } .tatle{width: 300px;height: 50px;backgroun ...
  • Gulp是基於流的前端自動化構建工具 使用步驟: 1.安裝node和npm 訪問國外伺服器網速不好時,安裝依賴模塊時會缺少文件。可以安裝國內的鏡像,之後使用cnpm命令代替npm命令。 npm install cnpm -g --registry=https://registry.npm.taoba ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...