JS实现瀑布流效果

1、页面布局情况
准备好11张宽度值相同高度不同的图片来实现瀑布流效果。

*{padding:0;margin:0;}
.main{margin:15px auto;}
.main .box{float:left;position:relative;}
.main .box .pic{border:1px solid #000;padding:15px;box-shadow:0px 2px 0px 2px #ccc;border-radius:5%;}
.main .box .pic img{width:200px;}

2、页面内容情况

<div class="main">
	<div class="box">
		<div class="pic">
			<img src="images/0.jpg"/>
		</div>
	</div>
	<div class="box">
		<div class="pic">
			<img src="images/1.jpg"/>
		</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.jpg"/>
		</div>
	</div>
	<div class="box">
		<div class="pic">
			<img src="images/4.jpg"/>
		</div>
	</div>
	<div class="box">
		<div class="pic">
			<img src="images/5.jpg"/>
		</div>
	</div>
	<div class="box">
		<div class="pic">
			<img src="images/6.jpg"/>
		</div>
	</div>
	<div class="box">
		<div class="pic">
			<img src="images/7.jpg"/>
		</div>
	</div>
	<div class="box">
		<div class="pic">
			<img src="images/8.jpg"/>
		</div>
	</div>
	<div class="box">
		<div class="pic">
			<img src="images/9.jpg"/>
		</div>
	</div>
	<div class="box">
		<div class="pic">
			<img src="images/10.jpg"/>
		</div>
	</div>
</div>

3、代码实现功能

//实现两次加载图片,第一次时打开页面加载图片,第二次拖动滚动条加载图片
window.onload=function(){
	waterfall(main,box);
		if(scrollTop()){
		window.onscroll=function(){
		var dataImg={
			datas:[
				{src:0.jpg}
				{src:1.jpg}
				{src:2.jpg}
				{src:3.jpg}
				{src:4.jpg}
				{src:5.jpg}
				{src:6.jpg}
				{src:7.jpg}
				{src:8.jpg}
				{src:9.jpg}
				{src:10.jpg}
			]
		}
			var main=document.getElementByClassName("main");
			var oBox=document.createElement("div");
			var opic=document.createElement("div");
			var oimg=document.createElement("img");
			main.appendChild(oBox);
			oBox.appendChild(opic);
			opic.appendChild(oimg);
			for(var i=0;i<dataImg.datas.src.length;i++){
				oimg.src="images/"+dataImg.datas.src[i];
			}
			
			waterfall(main,box);
		}
	}
}
function scrollTop(){
	var height=document.documentElement.clientHeight||docuemnt.body.clientHeight;
	var top=document.documentElement.scrollTop||document.body.scrollTop;
 	if(obox[length-1].offsetHeight/2+obox[length-1].offsetTop<height+top){//加载到一半以下时就加载第一张图片,依次类推
 		return true;
 	}else{
 		return false;
 	}
}
function waterfall(parent,box){
	var oparent=document.getElementByClassName("parent");//获取父元素main
	var obox=getBox(box);//获取子元素box
	//alert(obox.length);//如果为数值11,说明完全匹配成功
	var client_width=document.documentElement.clientWidth||document.body.clientWidth;//设置可视区域的宽度
	var pic_width=obox[0].offsetWidth;//设置一张图片的宽度
	var num=parseInt(client_width/pic_width);//获取有多少张图片,取整数
	oparent.style.width=num*pic_width+"px";//乘以一张图片的宽度,放中间值(居中放置)
	//取下一张放置在高度最矮的下面,分别获得最矮的高度值和left值,再去取下一张放置在第二矮的下面,依次放置。
	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 xiabiao=getxiabiao(hrr,min);//取最低的下标
			obox[i].style.position="absolute";//加定位
			obox[i].style.left=xiabiao*pic_width+"px";//放置
			obox[i].style.top=min+"px";//放置
			hrr[xiabiao]=hrr[xiabiao]+obox[i].offsetHeight;//连接起来加载在一起
		}
	}
}
function getxiabiao(hrr,min){
	for(var i=0;i<hrr.length;i++){
		if(hrr[i]==min){
			return i;
		}
	}
}
function getBox(box){//所有图片放置在arr数组里面
	var doms=document.getElementsByTagName("*");
	var reg=new RegExp("\\b"+box+"\\b");//保守起见,完全取box的边界
	var arr=[];
	for(var i=0;i<doms.length;i++){
		if(reg.test(doms[i].className)){
	 		arr.push(doms[i]);
		}
	}
	return arr;
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值