js實現瀑布流布局


js實現瀑布流布局原理代碼

實現功能:

1、定義函數 waterfall(parent,box) 實現瀑布流布局。
2、當拖動滾動軸時候,到底部時候會觸發 添加元素事件,瀑布流布局。

瀑布流思路:第一排自由排版,記錄第一排元素的高度存入數組,之后出現的元素 都會放到 數組高度最小的元素下面,
絕對定位方式(x-上面元素數組內序號*每個元素寬度 y-上面元素的高度),並且每執行一次,會重新定義高度最小的值,
之前高度加上當前元素的高度,存入數組。之后元素都如此執行。

如此每個新增元素都會放置在最小高度元素下面,也就實現瀑布流。

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8"/>
	<title>瀑布流</title>
	<style type="text/css">
		*{margin: 0; padding: 0;}
		#main{
			/* width: 1000px;
			max-width: 1000px;*/
			margin :0 auto; 
			position: relative;
		}
		.box{
			float: left;
			padding: 15px 0 0 15px; 
		}
		.pic{
			padding: 15px;
			border:1px solid #ccc;
			border-radius: 10px;
			box-shadow: 0 0 5px #ccc;
		}
		.box img{
			width: 200px;
		}
	</style>
</head>
<body>
	<div id="main">

		<div class="box">
			<div class="pic">
				<img src="images/1.png">
			</div>
		</div>
		<div class="box">
			<div class="pic">
				<img src="images/2.jpg">
			</div>
		</div>
		<div class="box">
			<div class="pic">
				<img src="images/3.png">
			</div>
		</div>
		<div class="box">
			<div class="pic">
				<img src="images/4.png">
			</div>
		</div>
		<div class="box">
			<div class="pic">
				<img src="images/5.png">
			</div>
		</div>
		<div class="box">
			<div class="pic">
				<img src="images/6.png">
			</div>
		</div>
		<div class="box">
			<div class="pic">
				<img src="images/7.png">
			</div>
		</div>
		<div class="box">
			<div class="pic">
				<img src="images/8.png">
			</div>
		</div>
		<div class="box">
			<div class="pic">
				<img src="images/9.png">
			</div>
		</div>
		<div class="box">
			<div class="pic">
				<img src="images/10.png">
			</div>
		</div>
		<div class="box">
			<div class="pic">
				<img src="images/11.jpg">
			</div>
		</div>
		<div class="box">
			<div class="pic">
				<img src="images/12.png">
			</div>
		</div>

		
	</div>
	<script type="text/javascript">
		window.onload = function(){
			waterfall('main','box');
			dataImg = {
				arr:[
				{'src':'images/1.png'},
				{'src':'images/2.jpg'},
				{'src':'images/3.png'},
				{'src':'images/4.png'},
				{'src':'images/5.png'},
				{'src':'images/6.png'},
				{'src':'images/7.png'},
				{'src':'images/8.png'},
				{'src':'images/9.png'},
				{'src':'images/10.png'},
				{'src':'images/11.jpg'}
				]
			}
			
			window.onscroll = function(){
				//當滾動到最后一張圖片高度一般時刷新新數據
				var boxs = getClass('box');
				var oneh2 = boxs[boxs.length-1].offsetTop;
				var oneh = boxs[boxs.length-1].offsetHeight/2;
				var top = document.body.scrollTop || document.documentElement.scrollTop;
				var twoh = document.body.clientHeight||document.documentElement.clientHeight;

				if(oneh2+oneh<top+twoh){
					for(var i=0;i<dataImg.arr.length;i++){
						var main = document.getElementById('main');
						var cdiv = document.createElement('div');
						cdiv.className = 'box';
						var cpic = document.createElement('div');
						cpic.className = 'pic';
						var cimg = document.createElement('img');
						cimg.src =  dataImg.arr[i].src;
						main.appendChild(cdiv);
						cdiv.appendChild(cpic);
						cpic.appendChild(cimg);
					}
				}
				waterfall('main','box');
			}
		}

		function waterfall(parent,box){
			//獲取main元素
			var oparent = document.getElementById(parent);

			//獲取所有 box 元素
			var obox = getClass('box');

			//獲取每行能放多少個 居中擺放
			var w = document.body.clientWidth||document.documentElement.clientWidth;
			//var w =1000;
			var oneWidth = obox[0].offsetWidth;
			var num = Math.floor(w/oneWidth);
			main.style.width = num*oneWidth+'px';

			//瀑布流原理  left-下標*圖片width top-上面圖片高
			var hrr = [];
			for(var i=0;i<obox.length;i++){
				if(i<num){
					hrr.push(obox[i].offsetHeight);
				}else{
					var min = Math.min.apply(null,hrr);
					var index = getindex(hrr,min);
					obox[i].style.position = 'absolute';
					obox[i].style.left = index*oneWidth+'px';
					obox[i].style.top = min+'px';
					hrr[index] += obox[i].offsetHeight;
				}
			}
			console.log(hrr);
		}

		//獲取 數組內指定值的 序號
		function getindex(hrr,h){
			for(var i=0;i<hrr.length;i++){
				if(hrr[i]==h){
					return i;
				}
			}
		}

		//統計所有指定class名稱的元素
		function getClass(a){
			var doms = document.getElementsByTagName('*');
			var reg = new RegExp('\\b'+a+'\\b');
			//var reg = '/^\b'+a+'\b$/';
			var arr = [];
			for(var i=0;i<doms.length;i++){
				if(reg.test(doms[i].className)){
					arr.push(doms[i]);
				}
			}
			return arr;
		}

	</script>
</body>
</html>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM