原生js实现瀑布流

参考 https://segmentfault.com/a/1190000012621936 这篇文章写的瀑布流,分了三个文件:js、css、html

html文件代码如下:

<!DOCTYPE HTML>
<html>
<head>
	<meta name="author" content="MissAS">
	<meta charset="utf-8">
	<title>瀑布流</title>
	<link rel="stylesheet" type="text/css" href="waterfull.css">
</head>
<body>
	<div class="waterfulltitle">瀑布流</div>
	<div id="wf">
		<div class="witem"><img src="wf/foods (1).jpg" alt=""></div>
		<div class="witem"><img src="wf/foods (2).jpg" alt=""></div>
		<div class="witem"><img src="wf/foods (3).jpg" alt=""></div>
		<div class="witem"><img src="wf/foods (4).jpg" alt=""></div>
		<div class="witem"><img src="wf/foods (5).jpg" alt=""></div>
		<div class="witem"><img src="wf/foods (6).jpg" alt=""></div>
		<div class="witem"><img src="wf/foods (7).jpg" alt=""></div>
		<div class="witem"><img src="wf/foods (8).jpg" alt=""></div>
		<div class="witem"><img src="wf/foods (9).jpg" alt=""></div>
		<div class="witem"><img src="wf/foods (10).jpg" alt=""></div>
		<div class="witem"><img src="wf/foods (11).jpg" alt=""></div>
		<div class="witem"><img src="wf/foods (12).jpg" alt=""></div>
		<div class="witem"><img src="wf/foods (13).jpg" alt=""></div>
		<div class="witem"><img src="wf/foods (14).jpg" alt=""></div>
		<div class="witem"><img src="wf/foods (15).jpg" alt=""></div>
		<div class="witem"><img src="wf/foods (16).jpg" alt=""></div>
		<div class="witem"><img src="wf/foods (17).jpg" alt=""></div>
		<div class="witem"><img src="wf/foods (18).jpg" alt=""></div>
		<div class="witem"><img src="wf/foods (19).jpg" alt=""></div>
		<div class="witem"><img src="wf/foods (20).jpg" alt=""></div>
		<div class="witem"><img src="wf/foods (21).jpg" alt=""></div>
		<div class="witem"><img src="wf/foods (22).jpg" alt=""></div>
		<div class="witem"><img src="wf/foods (23).jpg" alt=""></div>
		<div class="witem"><img src="wf/foods (24).jpg" alt=""></div>
		<div class="witem"><img src="wf/foods (25).jpg" alt=""></div>
		<div class="witem"><img src="wf/foods (26).jpg" alt=""></div>
		<div class="witem"><img src="wf/foods (27).jpg" alt=""></div>
		<div class="witem"><img src="wf/foods (28).jpg" alt=""></div>
		<div class="witem"><img src="wf/foods (29).jpg" alt=""></div>
		<div class="witem"><img src="wf/foods (30).jpg" alt=""></div>
	</div>
</body>
<script src="waterfull.js"></script>
</html>

css代码段如下:

*{
	margin: 0;
	padding: 0;
	position: relative;
}
.waterfulltitle
{
	font-size: 36px;
	text-align: center;
	color: palevioletred;
	font-family:knewave;
	font-weight: 600;
}
img
{
	width:220px;
	display: block;
}
body
{
	background-color: antiquewhite;
}
.witem
{
	box-shadow: 2px 2px 2px #999;
	position: absolute;
}

js代码段如下:

"use strict";
var wf=document.getElementById('wf');
var items=wf.children;
var gap=10;
window.onload=function()
{
	function waterfull()
	{
		var pagewidth=getClient().width;
		var itemwidth=items[0].offsetWidth;
		var columns=parseInt(pagewidth/(itemwidth+gap));
		var picarr=[];
		for(var i=0;i<items.length;i++)
			{
				if(i<columns)
					{
						items[i].style.top=0;
						items[i].style.left=(itemwidth+gap)*i+'px';
						picarr.push(items[i].offsetHeight);
					}
				else
					{
						var minheigh=picarr[0];
						var minindex=0;
						for(var j=0;j<picarr.length;j++)
							{
								if(minheigh>picarr[j])
									{
										minheigh=picarr[j];
										minindex=j;
									}
							}
						items[i].style.top=picarr[minindex]+gap+'px';
						items[i].style.left=items[minindex].offsetLeft+'px';
						picarr[minindex]=picarr[minindex]+items[i].offsetHeight+gap;
					}
			}
	}
	waterfull();
	window.onresize=function()
	{
		waterfull();
	};
	window.onscroll=function()
	{
		if(getClient().height+getScrollTop()>=items[items.length-1].offsetTop)
			{
				var datas=[
					"wf/foods (1).jpg",
					"wf/foods (2).jpg",
					"wf/foods (3).jpg",
					"wf/foods (4).jpg",
					"wf/foods (5).jpg",
					"wf/foods (6).jpg",
					"wf/foods (7).jpg",
					"wf/foods (8).jpg",
					"wf/foods (9).jpg",
					"wf/foods (10).jpg",
					"wf/foods (11).jpg",
					"wf/foods (12).jpg",
					"wf/foods (13).jpg",
					"wf/foods (14).jpg",
					"wf/foods (15).jpg",
					"wf/foods (16).jpg",
					"wf/foods (17).jpg",
					"wf/foods (18).jpg",
					"wf/foods (19).jpg",
					"wf/foods (20).jpg",
					"wf/foods (21).jpg",
					"wf/foods (22).jpg",
					"wf/foods (23).jpg",
					"wf/foods (24).jpg",
					"wf/foods (25).jpg",
					"wf/foods (26).jpg",
					"wf/foods (27).jpg",
					"wf/foods (28).jpg",
					"wf/foods (29).jpg",
					"wf/foods (30).jpg"
				];
				for(var x=0;x<datas.length;x++)
					{
						var div=document.createElement("div");
						div.className="witem";
						div.innerHTML='<img src="'+datas[x]+'" alt="">';
						wf.appendChild(div);
					}
				waterfull();
			}
	};
};

function getClient()
{
	return{
		width:window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth,
		
		height:window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight
	};
}
function getScrollTop() 
{
        return window.pageYOffset||document.documentElement.scrollTop;
}

html和css文件比较简单,主要是在js中出现问题。

问题1:对象获取对象的子元素(children)时,不要用class定义元素,要用id定义唯一的元素。

问题2:前端的js执行按照顺序进行,引用的js代码中的οnlοad=function(){...};需要用到body加载后的对象内容,如果把js代码放在head中,则body还未加载,导致js执行错误,所以应该把js代码段放到body之后。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值