原生js实现瀑布流

<ul class="list-ul yu_cf">
<li class="item"></li>
</ul>

js部分

<script type="text/javascript" src=water.js"></script>
		<script type="text/javascript">
			new Waterfall({
				el: "list-ul",
				column: 4,
				gap: 10
			});
		</script>

 

// 采用IIFE模式防止变量污染全局
;
(function() {
	var Waterfall = function(opt) {
		// 获取页面的DOM元素和参数值
		this.el = document.getElementsByClassName(opt.el)[0]
		//排序元素
		this.oItems = this.el.getElementsByTagName('li')
		//一排几个
		this.column = opt.column
		//间距
		this.gap = opt.gap
		//元素宽度 = (总宽度 - 中间间隔 )/ 一行几个元素
		this.itemWidth = (this.el.offsetWidth - this.gap * (this.column - 1)) / this.column
		// 保存每一排的高度
		this.heightArr = []
		// console.log(this.itemWidth);
		this.init()
	}

	Waterfall.prototype.init = function() {
		this.render()
	}

	Waterfall.prototype.render = function() {
		var item = null,
			minIndex = -1
		for (var i = 0; i < this.oItems.length; i++) {
			item = this.oItems[i]
			item.style.width = this.itemWidth + 'px'

			if (i < this.column) {
				// 第一排元素的设置
				//顶部
				item.style.top = '0px'
				//距离左边
				item.style.left = i * (this.itemWidth + this.gap) + 'px'
				//高度数组里添加 高度
				this.heightArr.push(item.offsetHeight)
			} else {
				// 其余各排 每个图片放在高度最下的下面
				minIndex = getMinIndex(this.heightArr)
				// 每一列左值相同
				item.style.left = this.oItems[minIndex].offsetLeft + 'px'
				// 高度值等于 上一排的高度加上gap值
				item.style.top = this.heightArr[minIndex] + this.gap + 'px'
				this.heightArr[minIndex] = this.heightArr[minIndex] + item.offsetHeight + this.gap
			}
			
		}
		
		this.el.style.height = Math.max.apply(null, this.heightArr) + 'px'
		console.log('heightArr',Math.max.apply(null, this.heightArr))
		// 函数过去数组中最小数的index 
		function getMinIndex(arr) {
			return arr.indexOf(Math.min.apply(null, arr))
		}

	}
	// 挂载到全局使用
	window.Waterfall = Waterfall
})();

 

忘了在哪抄来的,增加了一个外框的高度。this.el.style.height = Math.max.apply(null, this.heightArr) + 'px'

THE END
分享
二维码
< <上一篇
下一篇>>