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

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;
   }    
}

  实现效果图:

posted @ 2013-04-09 16:46  Confi-Jin  阅读(485)  评论(0编辑  收藏  举报