瀑布流布局
原生js实现瀑布流
实现思路:
- 父元素设置相对定位,子元素设置绝对定位
- 先根据想要的列数,设置top和left,定位好第一行的元素
- 这时候每一列都有了高度,将每一列的高度保存到一个数组中
- 定位剩余元素的时候,设置top和left,每次将元素定位到高度最小的那列
假设现在列数是4,根据列数确定好每列的宽度width,先对第一行进行定位
高度最小的是第二列,将下一个元素定位到第二列
高度最小的是第三列,将下一个元素定位到第三列
就这样依次对每个子元素进行定位,就可以实现瀑布流
具体实现代码如下,
css
<style>
* {
margin: 0;
padding: 0;
}
body {
overflow-x: hidden;
}
#masonry {
position: relative;
}
.item {
box-sizing: border-box;
position: absolute;
padding: 5px;
/* 设置子元素的宽度为视口宽度的20%,瀑布流分为5列 */
width: 20%;
height: auto;
}
/* 当窗口的宽度小于860px时,设置子元素的宽度为视口宽度的25%,瀑布流分为4列 */
@media screen and (max-width: 860px) {
.item {
box-sizing: border-box;
position: absolute;
padding: 5px;
width: 25%;
height: auto;
}
}
img {
display: block;
width: 100%;
}
</style>
html
<div id="masonry">
<div class="item">
<img src="./img/1.jpeg">
</div>
<div class="item">
<img src="./img/2.jpg">
</div>
<div class="item">
<img src="./img/3.jpeg">
</div>
<div class="item">
<img src="./img/4.jpg">
</div>
<div class="item">
<img src="./img/5.jpeg">
</div>
<div class="item">
<img src="./img/6.jpg">
</div>
<div class="item">
<img src="./img/7.jpeg">
</div>
<div class="item">
<img src="./img/8.jpeg">
</div>
<div class="item">
<img src="./img/9.jpg">
</div>
<div class="item">
<img src="./img/10.jpg">
</div>
<div class="item">
<img src="./img/11.jpg">
</div>
<div class="item">
<img src="./img/12.jpeg">
</div>
<div class="item">
<img src="./img/13.jpg">
</div>
<div class="item">
<img src="./img/14.jpeg">
</div>
<div class="item">
<img src="./img/15.jpg">
</div>
</div>
javascript
var fun = function () {
// 获取窗口宽度
var html = document.documentElement.clientWidth
// 获取子元素宽度,也就是每列的宽度
var w = document.querySelector('.item').clientWidth
// 计算列数
var x = html / w
var items = document.querySelectorAll('.item')
var arr = []
for (var i = 0; i < items.length; i++) {
if (i < x) {
// 定位第一行
arr.push(items[i].clientHeight)
items[i].style.top = 0
items[i].style.left = i * w + 'px'
} else {
var min = 0
for (var j = 1; j < arr.length; j++) {
if (arr[min] > arr[j]) {
min = j
}
}
items[i].style.top = arr[min] + 'px'
items[i].style.left = min * w + 'px'
arr[min] += items[i].clientHeight
}
}
}
// 获取图片高度时,要确保图片加载完毕
window.onload = fun
// 窗口大小变化时,重新执行函数,计算列数,计算元素大小
window.onresize = fun
css3实现瀑布流
css3中新增了属性column-count和column-gap,前者可以指定元素分为几列,后者可以指定每列之间的距离
css
<style>
* {
margin: 0;
padding: 0;
}
#masonry {
column-count: 5;
column-gap: 5px;
}
@media screen and (max-width: 860px) {
#masonry {
column-count: 4;
column-gap: 5px;
}
}
.item {
box-sizing: border-box;
width: 100%;
padding: 5px;
}
.item img {
display: block;
width: 100%;
}
</style>