瀑布流布局
2018/5/10 htmlCSSJavascript
瀑布流布局
在知乎看到大佬说,学习前端的第一阶段要会一些js基本的特效,学习一下,做几个Demo来看看
好像有那么两种方法: 1、通过css来搞定瀑布流 2、通过js来控制
# CSS方法解决瀑布流
因为css3有了一个新的属性:column 我们在图片或者需要瀑布流的模块的父元素设置column属性就可以达到这种瀑布流的效果。
#main{
/*定位*/
/*position: relative;*/
/*多栏布局 设置栏宽度*/
-webkit-column-width:202px;
-moz-column-width:202px;
column-width:202px;
}
# JS方法来解决瀑布流布局
首先先把html写出来:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>瀑布流布局</title>
</head>
<body>
<div id="main">
<div class="wrap">
<div class="img">
<img src="http://img4.imgtn.bdimg.com/it/u=3673652172,785167112&fm=27&gp=0.jpg">
</div>
</div>
<div class="wrap">
<div class="img">
<img src="http://img1.imgtn.bdimg.com/it/u=2752884811,3342547378&fm=27&gp=0.jpg">
</div>
</div>
<div class="wrap">
<div class="img">
<img src="http://img5.imgtn.bdimg.com/it/u=2573504723,2456120500&fm=27&gp=0.jpg">
</div>
</div>
<div class="wrap">
<div class="img">
<img src="http://img0.imgtn.bdimg.com/it/u=3214770734,3861052448&fm=27&gp=0.jpg">
</div>
</div>
<div class="wrap">
<div class="img">
<img src="http://img4.imgtn.bdimg.com/it/u=3407532446,2830180038&fm=27&gp=0.jpg">
</div>
</div>
<div class="wrap">
<div class="img">
<img src="http://img0.imgtn.bdimg.com/it/u=30302420,912099376&fm=27&gp=0.jpg">
</div>
</div>
<div class="wrap">
<div class="img">
<img src="http://img5.imgtn.bdimg.com/it/u=2347360460,2805552283&fm=27&gp=0.jpg">
</div>
</div>
</div>
</body>
</html>
在html里写了很多的图片(这里没有写出来,也可以从后台拉取数据) 然后对图片做一些样式的调整:
<style>
* {
padding: 0px;
margin: 0px;
}
#main {
position: relative;
}
.wrap {
padding: 15px 0px 0px 15px;
float: left;
}
.img {
padding: 10px;
border-radius: 5px;
border: 1px solid #ccc;
box-shadow: 0 0 5px #ccc;
}
.img img {
width: 240px;
height: auto;
}
</style>
对图片做一些操作,宽度确定,高度auto; 然后开始用js对这些图片做一些处理
<script>
window.onload = function () {
waterFull('main', 'wrap');
}
function waterFull(parent, children) {
var oParent = document.getElementById(parent);
var oWraps = getByClass(oParent, children);
//计算整个页面显示的列数
var oWrapWeight = oWraps[0].offsetWidth;
var cols = Math.floor(document.documentElement.clientWidth / oWrapWeight);
//设置main的宽度,并且居中
oParent.style.cssText = 'width:' + oWrapWeight * cols + 'px; margin: 0 auto';
//找出高度最小的图片,将下一个图片放在下面
//定义一个数组,存放每一列的高度,初始化存的是第一行的所有列的高度
var arrHeight = [];
for (var i = 0; i < oWraps.length; i++) {
if (i < cols) {
arrHeight.push(oWraps[i].offsetHeight);
}else {
var minHeight = Math.min.apply(null, arrHeight);
var minIndex = getMinhIndex(arrHeight, minHeight);
oWraps[i].style.position = 'absolute';
oWraps[i].style.top = minHeight + 'px';
oWraps[i].style.left = minIndex * oWrapWeight + 'px';
arrHeight[minIndex] += oWraps[i].offsetHeight;
}
}
}
function getByClass(parent, className) {
var boxArr = new Array();//用来获取所有class为box的元素
oElement = parent.getElementsByTagName('*');
for (var i = 0; i < oElement.length; i++) {
if (oElement[i].className == className) {
boxArr.push(oElement[i]);
}
};
return boxArr;
}
//获取当前最小值得下标
function getMinhIndex(array, min) {
for (var i in array) {
if (array[i] == min)
return i;
}
}
</script>
搞定~