HTML+CSS+JS 瀑布流式布局(实现懒加载)

HTML + JS+CSS实现瀑布流式布局(包含懒加载)

前几天兴致来了想做一个瀑布流布局的网页,然后就有了各种“神操作”,也在网上看了一些相关的知识点;所以这里对自己这几个小时来一个总结(附源码)

首先来说一下瀑布流的原理吧:瀑布流是许多数据块组成的,可以是图片,可以是div,但是它们都有一个特点,就是等宽不等高,正是因为它等宽不等高,所以如果按部就班的排布的话,才会出现很大的缝隙,特别不好看,说白了瀑布流布局就是充分利用图片之间的空隙来合理的布局,使布局看起来好看。

首先上CSS布局(因为个人喜欢比较美的事物,所以写的比较多……嘿)

*{
	margin: 0 ;
	padding: 0;
	background-color: #333;
}
.container{
	position: relative;	
	width: 1200px;
	margin: 20px auto;
}
.container .box{
	display: flex;
	width: 178px;
	margin: 20px 0 30px ;
	padding: 5px 0 0 15px;
	float: left;
	overflow: hidden;		
}
.container .box .active{
	padding: 10px;
	border: 1px solid #cccccc;
	box-shadow: 0 0 5px #ccc;
	border-radius: 5px;
}
.container .box img{
	max-width: 100%;
}
.container .box h2{
	margin: 10px 0 0;
	padding: 0;
	font-size: 20px;
	color: white;
}
.container .box p{
	margin: 0;
	padding: 0 0 10px;
	font-size: 16px;
	color: floralwhite;
}

这里把HTML代码也附上(这里我是把CSS和JS分开写了)

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<link href="css/falls.css" rel="stylesheet" />
	<script src="js/falls.js"></script>
	<body>
		<div id="container" class="container">
			<div class="box">
				<div class="active">
					<img src="img/1.png" />
					<h2>this is title</h2>
					<p>You just need to know what to look.</p>
				</div>
			</div>
			<div class="box">
				<div class="active">
					<img src="img/2.png" />
					<h2>this is title</h2>
					<p>You just need to know what to look.</p>
				</div>
			</div>
			<div class="box">
				<div class="active">
					<img src="img/3.jpg" />
					<h2>this is title</h2>
					<p>You just need to know what to look.</p>
				</div>
			</div>
			<div class="box">
				<div class="active">
					<img src="img/4.png" />
					<h2>this is title</h2>
					<p>You just need to know what to look.</p>
				</div>
			</div>
			<div class="box">
				<div class="active">
					<img src="img/5.png" />
					<h2>this is title</h2>
					<p>You just need to know what to look.</p>
				</div>
			</div>
			<div class="box">
				<div class="active">
					<img src="img/6.png" />
					<h2>this is title</h2>
					<p>You just need to know what to look.</p>
				</div>
			</div>
			<div class="box">
				<div class="active">
					<img src="img/7.jpg" />
					<h2>this is title</h2>
					<p>You just need to know what to look.</p>
				</div>
			</div>
			<div class="box">
				<div class="active">
					<img src="img/8.png" />
					<h2>this is title</h2>
					<p>You just need to know what to look.</p>
				</div>
			</div>
		</div>
	</body>
</html>

没有加入JS就是这副模样
在这里插入图片描述
在明白了瀑布流的原理之后现在我们来实现瀑布流及自动加载;首先我们需要平铺第一行,这里我们铺了六张图片,然后就该铺第二行了,那这个待插入的图片应该放在哪个位置呢,我们可以得到每一列的高度,也就是每一列的数据块的高度加起来,得到六个高度的数值,我们算出哪一列高度最小就把待插入的图片插入到那一列的正下方,利用绝对定位定位过去(因为是绝对定位,所以top是距离页面顶部高度),left就是第几列乘以数据块宽度就可以了,如下图,待插入图片应该插入到这里
瀑布流式布局效果展示铺垫了这么多,重点来了!上JS

		window.onload=function(){
			//开始即调用
			waterfall('container','box')
			
			var dataInt = {
				"data": [
					{"src": '1.png'},{"src": '2.png'}, 
					{"src": '3.jpg'},{"src": '4.png'},
					{"src": '5.png'},{"src": '6.png'},
					{"src": '7.jpg'},{"src": '8.png'},
				]
			}
			
			//监听滚动条事件
			window.onscroll=function(){
				//检查是否具备了滚动条件
				if(checkScrollSlide){
					var ocontent = document.getElementById('container');
					//创建div,并将其加到所有box后面
					for(var i = 0; i < dataInt.data.length; i++) {
						var obox = document.createElement('div');
						obox.className = 'box';
						ocontent.appendChild(obox);
						var opic = document.createElement('div');
						opic.className = 'active';
						obox.appendChild(opic);
						var oimg = document.createElement('img');
						oimg.src = "img/" + dataInt.data[i].src;
						opic.appendChild(oimg);
						var oh=document.createElement('h2')
						oh.innerHTML='this is title'
						opic.appendChild(oh);
						var op=document.createElement('p')
						op.innerHTML='You just need to know what to look.'
						opic.appendChild(op)
					}
					waterfall('container', 'box');
				}
			}
		}
		
		function waterfall(content,box){
			//获取大盒子(container)里的所有小盒子(box)
			var ocontent=document.getElementById(content);
			var oboxs=getByClass(ocontent, box);
			//计算整个页面显示的列数(页面宽/box的宽);
			var oboxW = oboxs[0].offsetWidth;
			//Math.floor 向下取整
			var cols = Math.floor(document.documentElement.clientWidth / oboxW);
			//设置container的宽度(这里用刚刚计算出来的列数乘盒子的宽度(oboxW * cols)得到的)
			ocontent.style.cssText = 'width:' + oboxW * cols + 'px;margin:20 auto';
			var heightArr = [];
			for(var i = 0; i < oboxs.length; i++) {
				if(i < cols) {
					// 将前cols张图片的宽度记录到hArr数组中(第一行的高度)
					heightArr.push(oboxs[i].offsetHeight);
				} else {
					//从第二行开始就开始找最小的高度了,决定带插入图片该插入到哪里
					//js Math.min.apply()方法,取出数组中的最小值
					var minH = Math.min.apply(null, heightArr);
					var index = getMinhIndex(heightArr, minH);
					// 设置最小高度的图片的style为绝对定位,并设置top和left
					oboxs[i].style.position = 'absolute';
					oboxs[i].style.top = minH + 'px';
					oboxs[i].style.left = oboxs[index].offsetLeft+'px';
					heightArr[index] += oboxs[i].offsetHeight;
				}
			}
		}
		
		//返回所有的box盒子
		function getByClass(content, cName){
			var boxArr = new Array(),
				oElements = content.getElementsByTagName('*');
			for(var i = 0; i < oElements.length; i++) {
				if(oElements[i].className == cName) {
					boxArr.push(oElements[i]);
				}
			}
			return boxArr;
		}
		
		//获取数组中最小值的下标值
		function getMinhIndex(arr, val) {
			for(var i in arr) {
				if(arr[i] == val) {
					return i;
				}
			}
		}
		
		//定义函数检测是否具备了滚动加载数据块的条件
		function checkScrollSlide(){
			var ocontent = document.getElementById('container');
			var oboxs = getByClass(ocontent, 'box');
			//获取最后一个box到顶部的距离+ 它自身一半的距离
			var lastboxH = oboxs[oboxs.length - 1].offsetTop + Math.floor(oboxs[oboxs.length - 1].offsetHeight / 2);
			//获取滚动条滚动距离(为了消除标准模式和怪异模式之间的差别而做的兼容)
			var scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
			// 获取window可视化的高度
			var height = document.body.clientHeight || document.documentElement.clientHeight;
			return(lastboxH < scrollTop + height) ? true : false;
		}

代码不复杂,多看几遍多敲几遍就能理解,这里主要讲解一下最后“function checkScrollSlide()”的思想;因为我们这个要实现一直滑一直滑的效果(也就是懒加载),所以我们这里就拿最后一张图片来做对比,通俗理解函数“checkScrollSlide()”的作用就是最后一张图片露出一半了你就应该加载。

然后之前的“waterfall”函数里面的代码实现了页面缩小图片的列数也会相应的改变哦~

这样我们一个基本的瀑布流式布局就完成辣~ !

但是把页面重新恢复之后会挤在一起,这个问题触及到了我的知识盲区,所以如果有懂的小伙伴可以一起交流哦。

(码字不易,能帮到看这篇文章的你就是我前进的动力,嘿咻
( •̀ ω •́ )✧)

  • 17
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 17
    评论
### 回答1: 下面是一个基于 jQuery 的下拉加载、瀑布流和 Mustache 模板的示例代码: HTML 部分: ```html <div id="content"></div> <div id="loading">Loading...</div> ``` CSS 部分: ```css #content { column-count: 3; column-gap: 10px; } .item { break-inside: avoid-column; margin-bottom: 10px; } img { width: 100%; } #loading { display: none; text-align: center; font-size: 20px; color: #999; margin-top: 20px; } ``` JS 部分: ```javascript $(function() { var page = 1; var isLoading = false; var isEnd = false; function loadData() { if (isLoading || isEnd) { return; } isLoading = true; $('#loading').show(); $.ajax({ url: 'data.php', type: 'get', data: { page: page }, dataType: 'json', success: function(data) { if (data.length > 0) { var template = $('#template').html(); Mustache.parse(template); var rendered = Mustache.render(template, data); $('#content').append(rendered); page++; } else { isEnd = true; } }, complete: function() { isLoading = false; $('#loading').hide(); } }); } $(window).scroll(function() { var scrollTop = $(this).scrollTop(); var windowHeight = $(this).height(); var contentHeight = $('#content').height(); if (scrollTop + windowHeight >= contentHeight && contentHeight > 0) { loadData(); } }); loadData(); }); ``` 其中,data.php 是一个返回 JSON 数据的后端接口,返回数据格式如下: ```json [ { "id": 1, "title": "item 1", "image": "image1.jpg" }, { "id": 2, "title": "item 2", "image": "image2.jpg" }, ... ] ``` Mustache 模板部分: ```html <script id="template" type="x-tmpl-mustache"> {{#items}} <div class="item"> <h2>{{title}}</h2> <img src="{{image}}" alt=""> </div> {{/items}} </script> ``` 以上代码实现了一个基本的下拉加载、瀑布流和 Mustache 模板的示例,你可以根据自己的需求进行修改和扩展。 ### 回答2: jQuery是一种流行的JavaScript库,用于简化HTML文档遍历、事件处理、动画效果和AJAX等操作。下拉加载是一种网页加载方式,在用户滚动到页面底部时,通过发送请求加载更多内容。瀑布流是一种多列布局方式,类似于瀑布的流动,每一列按照内容的高度自动调整位置。 jQuery可以很方便地实现下拉加载功能。通过监听窗口的滚动事件,当滚动到页面底部时,发送请求获取更多数据,然后将数据添加到页面中。这样,用户就可以在滚动页面的过程中无缝地加载更多内容,提升用户体验。 瀑布流布局通常使用CSSJavaScript实现。在jQuery中,可以使用瀑布流插件如"Masonry"或"Isotope"来实现瀑布流布局。这些插件可以根据内容的大小和位置自动调整各个元素的位置,从而实现瀑布流效果。 Mustache是一种轻量级的模板引擎,可以将数据和HTML模板进行结合,生成动态的网页内容。在使用jQuery进行下拉加载和瀑布流布局时,Mustache可以用于将获取到的数据与指定的HTML模板进行结合,生成可展示的内容。 通过结合使用jQuery、下拉加载、瀑布流布局和Mustache,我们可以实现一个功能强大且用户友好的网页。用户可以通过滚动页面来加载更多内容,而不需要手动点击加载按钮。加载的内容可以利用瀑布流布局自动调整位置,使页面更加美观。而Mustache可以将获取到的数据动态地呈现在指定的HTML模板中,实现内容的动态更新。 总之,jQuery下拉加载、瀑布流布局和Mustache模板引擎的结合,可以让我们更加便捷地实现前端开发中对于网页加载和布局的需求。 ### 回答3: jQuery下拉加载、瀑布流和Mustache都是常用的前端技术。 jQuery是一款优秀的JavaScript库,可以简化HTML文档的遍历、事件处理、动画效果等操作。在下拉加载中,可以利用jQuery监听用户滚动事件,当滚动到特定位置时触发加载新数据的操作。通过Ajax请求获取数据,再通过jQuery插入到页面中,实现无刷新的数据加载。 瀑布流是一种网页布局方式,类似于瀑布流的形态,每一块内容依次排列,高度不一,但是整体效果呈现出自然的瀑布流效果。在实现瀑布流布局时,可以借助jQuery的animate()函数来设置元素的位置和动画效果,为页面元素创建瀑布流布局。 Mustache是一种轻量级的逻辑-less模板引擎,用于渲染模板数据到HTML文档。通过Mustache的语法标签,我们可以在HTML代码中插入占位符,然后再通过jQuery获取到数据,将数据和模板结合,最终生成动态内容,并插入到页面中。 综上所述,使用jQuery下拉加载、瀑布流和Mustache可以实现在网页中实现下拉加载新数据的功能,并使用瀑布流布局展示数据,最后通过Mustache模板引擎渲染数据到页面中。这样能够提升用户体验和页面的可视性,实现更流畅的数据展示。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值