js实现瀑布流加载图片效果

heyujun-      2022-02-10     618

关键词:

     今天学习了一个瀑布流加载效果,很多网站都有瀑布流效果,瀑布流就是很多产品显示在网页上,宽相同,高度不同,表现为多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部。原理是:1.设定一行中的列数;2.取第一行中每一个div的高度并把每一个高度放进一个数组中;3.算出数组中最小高度的index值;4.把第二行的第一个div放到最小高度的div的下方并把重新算出的高度值放进数组中,重新计算最小高度的index值;5.以此类推实现多栏布局的瀑布流效果;6.如果最后一张div的高度已滚动出现在底部时创建新的div添加到最后一张的后面,不断循环以达到加载效果;接下来代码实现。

<div id="main">
		<div class="box">
			<div class="Pic">
				<img src="images/0.jpg" alt="" />
			</div>
		</div>
		<div class="box">
			<div class="Pic">
				<img src="images/1.jpg" alt="" />
			</div>
		</div>
		<div class="box">
			<div class="Pic">
				<img src="images/2.jpg" alt="" />
			</div>
		</div>
		<div class="box">
			<div class="Pic">
				<img src="images/3.jpg" alt="" />
			</div>
		</div>
		<div class="box">
			<div class="Pic">
				<img src="images/4.jpg" alt="" />
			</div>
		</div>
		<div class="box">
			<div class="Pic">
				<img src="images/5.jpg" alt="" />
			</div>
		</div>
		<div class="box">
			<div class="Pic">
				<img src="images/6.jpg" alt="" />
			</div>
		</div>
		<div class="box">
			<div class="Pic">
				<img src="images/7.jpg" alt="" />
			</div>
		</div>
		<div class="box">
			<div class="Pic">
				<img src="images/8.jpg" alt="" />
			</div>
		</div>
		<div class="box">
			<div class="Pic">
				<img src="images/9.jpg" alt="" />
			</div>
		</div>
		<div class="box">
			<div class="Pic">
				<img src="images/10.jpg" alt="" />
			</div>
		</div>
		<div class="box">
			<div class="Pic">
				<img src="images/11.jpg" alt="" />
			</div>
		</div>
		<div class="box">
			<div class="Pic">
				<img src="images/12.jpg" alt="" />
			</div>
		</div>
		<div class="box">
			<div class="Pic">
				<img src="images/13.jpg" alt="" />
			</div>
		</div>
		<div class="box">
			<div class="Pic">
				<img src="images/14.jpg" alt="" />
			</div>
		</div>
		<div class="box">
			<div class="Pic">
				<img src="images/15.jpg" alt="" />
			</div>
		</div>
		<div class="box">
			<div class="Pic">
				<img src="images/16.jpg" alt="" />
			</div>
		</div>
		<div class="box">
			<div class="Pic">
				<img src="images/17.jpg" alt="" />
			</div>
		</div>
		<div class="box">
			<div class="Pic">
				<img src="images/18.jpg" alt="" />
			</div>
		</div>
		<div class="box">
			<div class="Pic">
				<img src="images/19.jpg" alt="" />
			</div>
		</div>
		<div class="box">
			<div class="Pic">
				<img src="images/20.jpg" alt="" />
			</div>
		</div>
		<div class="box">
			<div class="Pic">
				<img src="images/21.jpg" alt="" />
			</div>
		</div>
		<div class="box">
			<div class="Pic">
				<img src="images/22.jpg" alt="" />
			</div>
		</div>
	</div>
       *{padding: 0;margin: 0;}
	#main{
		width: 1000px;
		margin: 0 auto;
		position: relative;
	}
	.box{
		display: inline-block;
		float: left;
		padding: 10px 0 0 10px;
	}
	.Pic{
		border: 1px #ccc solid;
		padding: 10px;
		border-radius: 8px;
	}
	.Pic img{
		width: 162px;
	}

js代码:

<script>
	window.onload=function(){
		waterFall('main','box');
		var dataInt={
			"data":[{"src":"0.jpg"},{"src":"1.jpg"},{"src":"2.jpg"},{"src":"3.jpg"},{"src":"4.jpg"},{"src":"5.jpg"},{"src":"6.jpg"},{"src":"7.jpg"}]
		};
        
        /*滚动条滚动时触发的事件*/
		window.onscroll=function(){
			if(checkIsSlide()){  //结果返回是true则执行
				var omain=document.getElementById('main');
				/*添加div到页面上*/
				for(var l=0;l<dataInt.data.length;l++){  
					var box=document.createElement('div');
					box.className="box";
					omain.appendChild(box);
					var pic=document.createElement('div');
					pic.className='Pic';
					box.appendChild(pic);
					var oimg=document.createElement('img');
					oimg.src="images/"+dataInt.data[l].src;
					pic.appendChild(oimg);
				}
				waterFall('main','box');  //新添加的div都要重新执行waterFall方法,以实现瀑布流效果
			}
		}
	}
    /*实现瀑布流效果,多栏布局*/
	function waterFall(parent,pid){   //传两个参数,父元素parent和子元素pid
		var oparent=document.getElementById(parent);   //获取父元素
		var opid=getClass(oparent,pid);   //获取父元素下的classname为pid的所有子元素
		var cols=Math.floor(oparent.offsetWidth/opid[0].offsetWidth);  //父元素宽度/一个子元素的宽度,即一行的列数
		var arrH=[];   //存放每一列的高度的数组
		for(var j=0;j<opid.length;j++){
			if(j<cols){   
				arrH.push(opid[j].offsetHeight);//把第一行的高度都放进数组中
			}else{   //第二行开始
				var minH=Math.min.apply(null,arrH);   //计算arrH的最小值
				var Index=getHIndex(arrH,minH);  //使用getHIndex方法获取最小值的index值
				/*把之后的div放到最小值div的下方*/
				opid[j].style.position='absolute';  
				opid[j].style.top=minH+'px';
				opid[j].style.left=opid[0].offsetWidth*Index+'px';
				arrH[Index]+=opid[j].offsetHeight; //数组中的最小值加上已放在下方的div的高度值并重新循环
			}
		}
		
	}

    /*获取父元素下的classname为cls的所有元素*/
	function getClass(parent,cls){
		var obj=parent.getElementsByTagName('*');
		var Clsarr=[];
		for(var i=0;i<obj.length;i++){
			if(obj[i].className==cls){
				Clsarr.push(obj[i]);
			}
		}
		return Clsarr;
	}
    /*获取arr数组中的最小值minH的Index值*/
	function getHIndex(arr,minH){
		for(var k=0;k<arr.length;k++){
			if(arr[k]==minH){
				return k;
			}
		}
	}
    /*判断当前滚动的高度时候大于最后的div出现在底部的高度值,即是否要加载*/
	function checkIsSlide(){
		var omain=document.getElementById('main');
		var obox=getClass(omain,'box');
		var lastTop=obox[obox.length-1].offsetTop+Math.floor(obox[obox.length-1].offsetHeight/2);
		var scrollTop=document.body.scrollTop||document.documentElement.scrollTop;
		var documentH=document.documentElement.clientHeight;
		return (lastTop)<(scrollTop+documentH)?true:false;
	}
</script>

效果图如下:

推荐网址:http://www.imooc.com/learn/101   详细讲解瀑布流布局的教学视频

js实现动态瀑布流及放大切换图片效果(js案例)

...了一下当时学js写的一些案例,再次体验了一把用原生JS实现动态瀑布流效果的乐趣,现在把它整理出来,需要的小伙伴可以参考一下。该案例主要是用HTML+CSS控制样式,通过JS实现全局瀑布流以及点击图片放大、上下切换效果。H... 查看详情

js实现瀑布流效果

Js实现瀑布流效果通过JavaScript实现瀑布流效果,实现不同大小的图片有序展示效果图:思路:1.将图片宽度固定,用浏览器窗口大小除以每个图片的宽度,求出要分成的列数2.将每个图片定位3.每次找到最小高度的列,将图片加到... 查看详情

简单实现加载图片的瀑布流效果

代码很简单,没有注释<styletype="text/css">*{margin:0px;padding:0px;}#container{position:relative;}.box{padding:5px;float:left;}.box_img{padding:5px;border:1pxsolid#CCC;box-shadow:005px#CCC;border-radius:5 查看详情

利用js实现简单的瀑布流效果

...的瀑布流效果吧,我们要先准备好八九张图片,当然啦,我们实现的是瀑布流效果,所以最好是高度不相同的,这样才可以看出来效果,对吧,嘿嘿.二.代码的准备工作   我们打开开发工具,先建个html工程,在 查看详情

vue实现网络图片瀑布流+下拉刷新+上拉加载更多(代码片段)

一、思路分析和效果图  用vue来实现一个瀑布流效果,加载网络图片,同时有下拉刷新和上拉加载更多功能效果。然后针对这几个效果的实现,捋下思路:根据加载数据的顺序,依次追加标签展示效果;选择哪种方式实现瀑布... 查看详情

前端用jquery实现瀑布流效果

jQuery实现瀑布流效果何为瀑布流:  瀑布流,又称瀑布流式布局。是比较流行的一种网站页面布局,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部。最早采用此布... 查看详情

jquery实现瀑布流

jQuery实现瀑布流js分析:首先监听window事件获取图片加载的位置,调用图片加载位置的函数,然后以鼠标滑动的距离来加载图片1.HTML布局:1<divid="container">2<divclass="box">3<divclass="content">4<imgsrc="../img/1.jpg">5</div>... 查看详情

javascript的瀑布流效果的详解及实现(代码片段)

...流的举例百度图片:http://image.baidu.com四、瀑布流的JS实现:1、设计思路:要想完成一个页面的瀑布流效果需要完成以下三个效果:1)实现一行中图片的个数固定:一行图片的个数=窗口宽度/图片的固定... 查看详情

74.手机端图片瀑布流的加载代码和效果

http://www.bin012.com/index.php?route=product/product&path=63&product_id=52  查看详情

瀑布流图片效果实现

<!DOCTYPEhtml><html><head><metacharset="UTF-8"><title></title><styletype="text/css">*{margin:0;padding:0;}#wrap{position:relative;list-style:none;margin:0auto 查看详情

使用css实现瀑布流效果

CSS实现瀑布流特点:不需要计算,浏览器自动计算,只需设置列宽,性能高;列宽随着浏览器窗口大小进行改变,用户体验不好;图片排序按照垂直顺序排列,打乱图片显示顺序;源代码:html.html:使用列表ul、li引入图片<!DOCTY... 查看详情

玩转masonryjs库来实现瀑布流web效果

...活性。就按照PinterestAndroid/IOS和花瓣MobileWebApp的目标开始实现。第一天的成果是完成了基本的 查看详情

解决recyclerview瀑布流效果结合glide使用时图片变形的问题

...:使用Glide加载RecyclerView的Item中的图片,RecyclerView使用了瀑布流展示图片,但是滚动时图片会不断的加载,并且大小位置都会改变,造成显示错乱。解决方法:使用瀑布流,我们可以根据要展示的列数来将屏幕宽度等分,从而获... 查看详情

jquery实现无限滚动瀑布流实现原理

现在类似于pinterest这类的表现效果很火,其实我比较中意的是他的布局效果,而不是那种瀑布流。虽然我不是特别喜欢这种瀑布流的表现样式,但是还是写了几篇关于无限滚动瀑布流效果的文章,Infinitescroll+Masonry=无限滚动瀑布... 查看详情

wpf下制作的简单瀑布流效果(代码片段)

...就搬到了WPF,下面是界面 我对WEB前端不熟,JS和CSS怎么实现的,我没去研究过,这里就说下WPF的实现思路,相当简单.1.最重要的就是每个子项的顺序填充,我是把界面看做N列,然后在每列里依次加载子项.最后结果就是,界面放一个Unifor... 查看详情

瀑布流实现思路

参考技术A实现瀑布流,只需要重写UICollectionViewLayout类的3个方法:瀑布流的规则:图片定宽而不定高;必须拿到图片的真实宽、高,以保证图片按正常比例显示,保证美观性。每一行图片显示完之后,下一行图片显示的顺序是:... 查看详情

wordpress制作照片瀑布流的效果,如何实现?

...果,引入正确文件,php返回正确的图片集和路径,就可以实现的wordpress有瀑布流主题:PhotoBroad主题,可以直接改主题,少量或者不去改代码的 参考技术C直接找wordpress的瀑布流模版不成吗,很多网站发布这种模版,感觉效果一般... 查看详情

flex布局实现瀑布流排版(代码片段)

网上有很多有关js(jq)实现瀑布流和有关瀑布流的插件很多,例如:插件(Masonry,Wookmark等等)。按照正常的逻辑思维,瀑布流的排版(item列表)一般都是由左到右,上而下排序的结果,单纯的css实现这一点有些困难,下面分... 查看详情