瀑布流布局

瀑布流布局

优势

首先,是图片的宽度固定,图片的长度不一样。其次,是当页面滚动时 ,会再次加载数据,动态的渲染在页面上。
在这里插入图片描述

<div id="itembox">
		<div class="item">
			<img src="images/P_000.jpg">
		</div>
		<div class="item">
			<img src="images/P_001.jpg">
		</div>
		<div class="item">
			<img src="images/P_002.jpg">
		</div>
		<div class="item">
			<img src="images/P_003.jpg">
		</div>
		<div class="item">
			<img src="images/P_004.jpg">
		</div>
		<div class="item">
			<img src="images/P_005.jpg">
		</div>
		<div class="item">
			<img src="images/P_006.jpg">
		</div>
		<div class="item">
			<img src="images/P_007.jpg">
		</div>
		<div class="item">
			<img src="images/P_008.jpg">
		</div>
		<div class="item">
			<img src="images/P_009.jpg">
		</div>
		<div class="item">
			<img src="images/P_010.jpg">
		</div>
		<div class="item">
			<img src="images/P_011.jpg">
		</div>
		<div class="item">
			<img src="images/P_012.jpg">
		</div>
		<div class="item">
			<img src="images/P_013.jpg">
		</div>
		<div class="item">
			<img src="images/P_014.jpg">
		</div>
		<div class="item">
			<img src="images/P_015.jpg">
		</div>
	</div>
*{
			padding: 0;
			margin:0; 
		}
		#itembox{
			width: 1050px;
			margin:0 auto;
			position: relative;
		}
		.item{
			border: 1px solid #ccc;
			padding: 4px;
			position: absolute;
		}

分析

1.获取itembox的宽度
2.获取item的宽度
3.求出列数 itembox宽度/item宽度
4.求出间距 (总宽度-元素个数*元素宽度)/(列数-1)
5.实现瀑布流布局
6.滚动页面时,加载数据

<script type="text/javascript">
		window.onload=function(){
			//获取元素
			var itembox=document.getElementById('itembox');
			var items=document.getElementsByClassName('item');
			//1.获取itembox的宽度
			var itemboxWidth=itembox.offsetWidth;
			//2.获取item的宽度
			var itemWidth=items[0].offsetWidth;

			//调试
			console.log(itemboxWidth+'  '+itemWidth);
			
			// 3.求出列数  itembox宽度/item宽度
			var column=parseInt(itemboxWidth/itemWidth);
			console.log(column);
			// 4.求出间距 (总宽度-元素个数*元素宽度)/(列数-1)
			var distance=(itemboxWidth-column*itemWidth)/(column-1);
			// 5.实现瀑布流布局
			//5.1定义一个数组,用来存放每列的高度
			var arr=[];
			waterFull();
			function waterFull(){
				//遍历item数组,给每一个元素指定位置,使其实现瀑布流布局
				for(var i=0;i<items.length;i++){
					if(i<column){
						//强调 属性值必须是字符串
						items[i].style.left=(itemWidth+distance)*i+'px';
						arr[i]=items[i].offsetHeight;
					}else{
						//找到最小高度的列以及它的索引  对象封装多个属性
						var minH=getMin(arr).minH;
						var minI=getMin(arr).minI;
						//最小高度列的left=(元素宽度+间距)*索引
						items[i].style.left=(itemWidth+distance)*minI+'px';
						//top=minH+间距
						items[i].style.top=minH+distance+'px';
						//更新列的高度 = 原来的高度+新元素的高度
						arr[minI]=minH+distance+items[i].offsetHeight;
					}
				}
			}

			//获取最小列的索引和高度
			function getMin(arr){
				var obj={};//{}表示对象
				obj.minH=arr[0];//对象.属性名=属性值   最小高度
				obj.minI=0;
				for(var i=1;i<arr.length;i++){//循环从第二个开始
					if(obj.minH>arr[i]){
						obj.minH=arr[i];
						obj.minI=i;
					}
				}
				return obj;
			}
			// 6.滚动页面时,加载数据 事件是页面滚动
			window.onscroll=function(){
				//判断:当前页面元素是否足够 滚动距离+页面的高度>minH
				if(window.pageYOffset+window.innerHeight>getMin(arr).minH){
					//新元素 其实是一张图片 src是不同的
					//数据源
					var json=[
						{"src":"images/P_000.jpg"},
						{"src":"images/P_001.jpg"},
						{"src":"images/P_002.jpg"},
						{"src":"images/P_003.jpg"},
						{"src":"images/P_004.jpg"},
						{"src":"images/P_005.jpg"},
						{"src":"images/P_006.jpg"},
						{"src":"images/P_007.jpg"},
						{"src":"images/P_008.jpg"},
						{"src":"images/P_009.jpg"},
						{"src":"images/P_010.jpg"}
					];
					for(var i=0;i<json.length;i++){
						var div=document.createElement('div');
						div.className='item';
						var img=document.createElement('img');
						img.src=json[i].src;
						div.appendChild(img);
						itembox.appendChild(div);
					}
					waterFull();
				}
			}
		}
	</script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值