二、瀑布流数据加载后的布局处理(瀑布流的封装)

html代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>瀑布流第二步封装函数</title>

<style>

	*{margin:0px;padding:0px;}

	#main .pin{

		width:225px;

		height:auto;

		padding:15px 0px 0px 15px;

		float:left;

	}



	#main .pin .box{

		width:205px;

		height:auto;

		padding:10px;

		background:#FFF;

		border:1px solid #CCC;

		box-shadow:0px 0px 6px #CCC;

		border-radius:5px;

	}

	#main .pin .box img{

		width:205px;

	}

</style>

<!-- 页面拖拽插件 -->

<script type="text/javascript" src="./js/drag.js"></script>

<!-- 瀑布流封装 -->

<script type="text/javascript" src="./js/water.js"></script>

</head>

<body>



	<div id="main">

		<div class="pin"><!--每一个小块-->

			<div class="box">

				<img src="./img/0.jpg">

			</div>

		</div>



		<div class="pin"><!--每一个小块-->

			<div class="box">

				<img src="./img/1.jpg">

			</div>

		</div>



		<div class="pin"><!--每一个小块-->

			<div class="box">

				<img src="./img/2.jpg">

			</div>

		</div>



		<div class="pin"><!--每一个小块-->

			<div class="box">

				<img src="./img/3.jpg">

			</div>

		</div>



		<div class="pin"><!--每一个小块-->

			<div class="box">

				<img src="./img/4.jpg">

			</div>

		</div>



		<div class="pin"><!--每一个小块-->

			<div class="box">

				<img src="./img/5.jpg">

			</div>

		</div>

		<div class="pin"><!--每一个小块-->

			<div class="box">

				<img src="./img/6.jpg">

			</div>

		</div>

		

		<div class="pin"><!--每一个小块-->

			<div class="box">

				<img src="./img/7.jpg">

			</div>

		</div>

		

		<div class="pin"><!--每一个小块-->

			<div class="box">

				<img src="./img/8.jpg">

			</div>

		</div>

		<div class="pin"><!--每一个小块-->

			<div class="box">

				<img src="./img/4.jpg">

			</div>

		</div>

		<div class="pin"><!--每一个小块-->

			<div class="box">

				<img src="./img/7.jpg">

			</div>

		</div>

		

		<div class="pin"><!--每一个小块-->

			<div class="box">

				<img src="./img/8.jpg">

			</div>

		</div>

		<div class="pin"><!--每一个小块-->

			<div class="box">

				<img src="./img/9.png">

			</div>

		</div>

		

		<div class="pin"><!--每一个小块-->

			<div class="box">

				<img src="./img/0.jpg">

			</div>

		</div>



		<div class="pin"><!--每一个小块-->

			<div class="box">

				<img src="./img/1.jpg">

			</div>

		</div>



		<div class="pin"><!--每一个小块-->

			<div class="box">

				<img src="./img/2.jpg">

			</div>

		</div>



		<div class="pin"><!--每一个小块-->

			<div class="box">

				<img src="./img/5.jpg">

			</div>

		</div>

		<div class="pin"><!--每一个小块-->

			<div class="box">

				<img src="./img/4.jpg">

			</div>

		</div>

		<div class="pin"><!--每一个小块-->

			<div class="box">

				<img src="./img/0.jpg">

			</div>

		</div>



		<div class="pin"><!--每一个小块-->

			<div class="box">

				<img src="./img/1.jpg">

			</div>

		</div>



		<div class="pin"><!--每一个小块-->

			<div class="box">

				<img src="./img/5.jpg">

			</div>

		</div>



		<div class="pin"><!--每一个小块-->

			<div class="box">

				<img src="./img/3.jpg">

			</div>

		</div>

	</div>

	

</body>

</html>

  water.js代码

/**

 * 

 */

window.onload = function(){

	//0调用函数

	

	//定义json数据

	var data = [{'src':'1.jpg'},{'src':'2.jpg'},{'src':'3.jpg'},{'src':'4.jpg'},{'src':'5.jpg'}];

	window.onscroll = function(){

		if(checkscrollsite()){



		//创建父节点

			var oParent = document.getElementById('main');

			for(i in data){

				//alert(data[i].src);

				//创建父级的元素节点

				var oPin = document.createElement('div');

				oPin.className = 'pin';

				oParent.appendChild(oPin);

				var oBox = document.createElement('div');

				oBox.className = 'box';

				oPin.appendChild(oBox);

				var oImg = document.createElement('img');

				oImg.src = './img/'+data[i].src;

				oBox.appendChild(oImg);

			}

			waterfall('main','pin');

		}

		

	}

}

	/**

	parent 父级   id

	pin     具体瀑布流块,class类名

	*/

	function waterfall(parent,pin) {

	//2.定义父级

	var oParent = document.getElementById(parent);

	//9.调用函数并定义

	var aPin = getClassObj(oParent,pin);

	//alert(aPin.length);

	var iPinW = aPin[0].offsetWidth;

	//alert(iPinW);

	//10.计算页面可以放下多少个图片

	var num = Math.floor(document.documentElement.clientWidth/iPinW);

	//alert(num);

	//11.设置父级居中的样式

	oParent.style.cssText = 'width:'+num*iPinW+'px;margin:0 auto;';

	

	//12准备一个数组

	var compareAarr = [];

	//17定义一个字符串

	//var str = '';

	//13

	for(var i=0;i<aPin.length;i++){

		//22设置第一行的数量

		if(i<num){

			

		

		//获取每个图品的offsetHeight值

		compareAarr[i] = aPin[i].offsetHeight;

		//17获取高度的索引

		//str += i+'=>'+aPin[i].offsetHeight+'\n';

		//23

		}else{

			//取数组中的最小高度  compareAarr

			var minH = Math.min.apply({},compareAarr);

			//获取最小的key值

			var minKey = getMinKey(compareAarr,minH);

			//定位超出宽度多的那个

			aPin[i].style.position = 'absolute';

			//取超出的那个图片的top值

			aPin[i].style.top = minH + 'px';

			//设置超出那个图片的left值

			aPin[i].style.left = aPin[minKey].offsetLeft + 'px';

			//超出最后一个在加一 重新计算最低minH

			compareAarr[minKey] += aPin[i].offsetHeight;

		}

	}

	

	//14 取数组中的最小高度  compareAarr

	//var minH = Math.min.apply({},compareAarr);

	//19获取最小的key值

	//var minKey = getMinKey(compareAarr,minH);

	//alert(minKey);

	//alert(minH);

	//15定位超出宽度多的那个

	//aPin[num].style.position = 'absolute';

	//16取超出的那个图片的top值

	//aPin[num].style.top = minH + 'px';

	//20设置超出那个图片的left值

	//aPin[num].style.left = aPin[minKey].offsetLeft + 'px';

	//21超出最后一个在加一 重新计算最低minH

	//compareAarr[minKey] += aPin[num].offsetHeight;

	//alert(compareAarr);

	//var minH = Math.min.apply({},compareAarr);

	//var minKey = getMinKey(compareAarr,minH);

	//aPin[num+1].style.position = 'absolute';

	//aPin[num+1].style.top = minH + 'px';

	//aPin[num+1].style.left = aPin[minKey].offsetLeft + 'px';

	

	//实现图片的拖拽

	for(var i=num;i<aPin.length;i++){

		//绝对定位

		aPin[i].style.position = 'absolute';

		drag(aPin[i]);

	}

}

	

	/**

	 * 检测根据浏览器的高度加载图片

	 */

	function checkscrollsite(){

		var oParent = document.getElementById('main');

		

		var aPin = getClassObj(oParent,'pin');

		//最后图片的高度

		var lastPinH =aPin[aPin.length-1].offsetTop+Math.floor(aPin[aPin.length-1].offsetHeight/2);

		//最后滚动条的高度

		var srcollTop = document.documentElement.scrollTop || document.body.scrollTop;

		//

		var documentH = document.documentElement.clientHeight;

		//if(lastPinH<srcollTop+documentH){

		//	return true;

		//}else{

		//	return false;

		//}

		return lastPinH<srcollTop+documentH?true:false;

	}

	/**

		获取数组组最小的键值

		arr数组

		minH最小键值

	*/

	//18定义一个函数   获取数组(compareAarr)中对应的最小的那个高的值(minH)

	function getMinKey(arr,minH){

		for(key in arr){

			if(arr[key] == minH){

				return key;

			}

		}

	}

	

	/**

		通过class选择元素

		parent父级

		className类名

	*/

	//3.定义一个函数

	function getClassObj(parent,className){

		//4.定义匹配父级下面所有的元素

		var obj = parent.getElementsByTagName('*');

		//5.定义一个数组

		var result = [];

		//6.循环obj

		for(var i=0;i<obj.length;i++){

			if(obj[i].className == className){

				//7.pushu进result中

				result.push(obj[i]);

			}

		}

		//8

		return result;

	}

	

  drag.js代码

//拖拽方法

var zIndex = 1;

function drag(obj, vW){

    var obj = obj;

	var vW = vW?vW:document.documentElement.clientWidth; 

    var disX = 0;        

    var disY = 0;

    obj.onmousedown = function(ev){          

        var oEvent = ev || event;                        

        disX = oEvent.clientX - obj.offsetLeft;                      

        disY = oEvent.clientY - obj.offsetTop;                        

        obj.style.zIndex = zIndex;                       

        zIndex++;

        if (obj.setCapture) {                        

            obj.onmousemove = fnMove;                                    

            obj.onmouseup = fnUp;                                    

            obj.setCapture();                                    

        }       

        else {       

            document.onmousemove = fnMove;

            document.onmouseup = fnUp;           

        }

       function fnUp(){

           this.onmousemove = null;

           this.onmouseup = null;

            if (this.releaseCapture)             

                this.releaseCapture();

       }

       function fnMove(ev){

           var oEvent = ev || event;

           var l = oEvent.clientX - disX;

           var t = oEvent.clientY - disY;

           var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;

           var w = vW- obj.offsetWidth;

           var h = document.documentElement.clientHeight - obj.offsetHeight + scrollTop;

           if (l < 10)             

                l = 0;

           if (l > w - 10)             

                l = w;            

            if (t < 10)             

                t = 0;

            if (t > h - 10)            

                t = h;

           obj.style.left = l + 'px';

           obj.style.top = t + 'px';

        }

       return false;

   }    

}

  实现效果图:

你可能感兴趣的:(瀑布流)