蘑菇街样式风格——瀑布流布局

最终效果如下:
在这里插入图片描述
思路分析:
在这里插入图片描述
我们有很多图片,设置相同的宽度,高度不做设置,后面自动获取。
当对所有图片浮动后,图片会自动换行排列。

瀑布流:对图片进行设置,进行一个最优的排列。如上图所示,当一行排列完成后,后续的图片该如何排列?

这里有,对后续图片进行处理,找出图片高度最小的那张图片,将它排列到第一行(上一列高度最小的那一列)。
这里图片7最小,将它放置到图片1下面。如下所示:
在这里插入图片描述
上图组成新的一行,图片3为高度最小那一列,重复操作,将后续图片最小放置到图片3下。
在这里插入图片描述
一直循环,直至所有图片排列结束。完成瀑布流样式布局。

具体代码如下:
html部分代码,图片可以放很多张。
在这里插入图片描述
css代码:

<style type="text/css">
			*{
				margin: 0;
				padding: 0;
			}
			.box{
				position: relative;
			}
			.box>div{
				float: left;
				padding: 5px;
			}
			
			.pic img{
				border: 1px solid silver;
				padding: 5px;
				width: 167px;
				border-radius: 10px;
			}
		</style>

js代码:

`//让图片加载完成在执行JS代码 方便93行 打印每张照片的高度
			window.onload=function(){
				// 获取元素
				//获取所有图片
				var pic=document.querySelectorAll(".pic");
				//获取大盒子 因为要box容器居中
				var box=document.querySelector(".box");
			//求出单个pic元素的宽度
			var picWidth=pic[0].offsetWidth;
			// console.log(picWidth);做的习惯打印,看看是不是正确
			
			//求出浏览器的宽度
			var screenWidth=document.body.offsetWidth;
			// console.log(screenWidth);
			
			//求出一行可以放多少列
			var cols=Math.floor(screenWidth/picWidth);
			// console.log(cols);6
			
			//给box容器设置宽度
			box.style.width=cols*picWidth+"px";
			// console.log(box.offsetWidth);
			
			//让main容器在页面中水平居中
			box.style.margin="0 auto";
			
			//对第二行图片进行设置 将第一张定位到第一行高度最小的位置
			//使用数组保存第一行元素的高度
			var arrHeight=[];
			for(var i=0;i<pic.length;i++){
				//定义一个变量 用来表示每个图片的高度
				var picHeight=pic[i].offsetHeight;
				// console.log(picHeight);
				//如果小于第一行6张照片
				if(i<cols){
					//把高度储存到定义的数组中
					arrHeight.push(picHeight);
					// console.log(arrHeight);
				}else{
					//找出除第一行外其他图片中高度最小的  并赋值给minHeightbox
					var minHightbox= Math.min.apply(" ",arrHeight);
					// console.log(minHightbox)
					
					//z最矮元素高度的索引 是第几张
					var minIndex=getMinIndex(arrHeight,minHightbox);
					//定位
					pic[i].style.position="absolute";
					
					//设置pic[i]的top值
					pic[i].style.top = minHightbox + "px";
					
					//设置pic[i]的left值
					pic[i].style.left = picWidth * minIndex + "px";
					
					//更新最矮元素的高度
					arrHeight[minIndex]+=picHeight;
				}
			}//循环到这里

			//获取下标方法
			function getMinIndex(arr, val){
				for(var j=0; j<arr.length; j++){
					if(arr[j] === val){
						return j;
					}
				}
				// console.log(j);
				// 第六张最小
			}	 
		}`
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

搞文艺的猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值