原生JS瀑布流

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>瀑布流</title>
<style type="text/css">
div{
	width: 200px;
	/*background: #ccc;*/
	position: absolute;
}
</style>
</head>
<body id="body">
</body>
<script type="text/javascript">
function sum(){
	return Math.round(Math.random()*899999+100000)
}
createDiv()
//创建一个新建盒子的函数
function  createDiv(){
	//循环创建20个盒子
	for (var i = 0; i < 20; i++) {
		var aDiv = document.createElement("div")
		//取一个100-300的随机数
		var divH = Math.floor(Math.random()*200+100)
		//把随机数赋给盒子的高
			aDiv.style.height = divH+"px";
			aDiv.style.background = "#"+sum()
			//把盒子插入到body里
			body.appendChild(aDiv)
	}
	change()
}
//创建一个定位函数
function change(){
	//获取窗口的宽度
	var windowCW = document.documentElement.clientWidth;
	//获取窗口宽度可以放几个盒子
	var n = Math.floor(windowCW/(200+10))
	//获取盒子的左边距
	var center = (windowCW - n*(200+10))/2
	//获取所有的盒子
	var div = document.getElementsByTagName("div")
	//新建一个数组
	var arrh = [];
	//循环div的长度
	for (var i = 0; i < div.length; i++) {
		//取第一排的下标
		var j = i%n;
		//判断除了第一排其他盒子
		if (arrh.length==n) {
			//取arrh里最小值的下标
			var min = minIndex(arrh)
			// 设置新盒子的top值
			div[i].style.top = arrh[min]+10+"px"
			//设置新盒子的left值
			div[i].style.left = center+210*min+"px"
			//因为低的地方新加了一个盒子,top值要发生变化,所以要把心盒子的高度累加到他里面
			arrh[min]+=div[i].offsetHeight+10
		}else{
			// 保存第一排div的高度
			arrh[j] = div[i].offsetHeight
			// 第一排div的left值
			div[j].style.left = center+j*(200+10)+"px";
			// 第一排的top值
			div[j].style.top = 0+"px";
		}
	}
}
//创建滚轮事件
window.onscroll=function(){
	//获取窗口高度
	var windowH = document.documentElement.clientHeight;
	//获取滚动条到顶部的距离
	var scrollH = document.documentElement.scrollTop || document.body.scrollTop
	//获取窗口的可见高度
	var documentH = document.documentElement.scrollHeight || document.body.scrollHeight
	//判断窗口高度+滚动条到顶部的距离>窗口可见高度-20
	if (windowH+scrollH>documentH-20) {
		//调用创建div函数
		createDiv()
	}
}
//创建自适应事件
window.onresize=function(){
	//调用定位函数
	change()
}
//创建取数组最小值函数
function minIndex(arr){
	//设置一个变量为0
	var m = 0;
	//循环参数数组长度
	for (var i = 0; i < arr.length; i++) {
		//取出数组的最小值
		m = Math.min(arr[m],arr[i])==arr[m]?m:i
	}
	// 终止函数,返回m
	return m
}
</script>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值