阿里面试题:js实现瀑布流布局
何为瀑布流布局
瀑布流布局是一种常见的网页布局方式,尤其适用于展示图片、商品列表或是信息卡片等多样化的网格内容。这种布局方式的灵感来源于自然界中的瀑布,特点是各个区块按照一定的列布局排列,每个区块的高度不固定,当一个列的高度达到一定程度时,接下来的内容会自动换到下一列开始排列,从而形成一种错落有致的视觉效果。
如何实现瀑布流算法
接下来,分享一下我对这道题的解题思路
1、首先我考虑到的是一行可以放下几张(n)图片
解决这个问题我们需要用到两个数据:屏幕宽度、图片宽度
代码实现
var cParent=document.getElementById(parent)
var cChild = cParent.getElementsByClassName(child)
var screenWidth=window.innerWidth
var imgWidth=cChild[0].offsetWidth
var num=Math.floor(screenWidth/imgWidth)
2、再考虑第n+1张图片的位置
根据瀑布流布局的特点,第n+1张图片应放在高度最小的图片列下,那么我想到的是将所有列高度保存至数组中,使用Math.min()得到最小高度列,再使用绝对定位将其放入,最后更新当前列的高度
代码实现
var boxHeightArr=[]
for(var i=0;i<cChild.length;i++){
if(i<num){
boxHeightArr.push(cChild[i].offsetHeight)
}else{
//找数组最小值
var minHeight=Math.min(...boxHeightArr)
var minIndex=boxHeightArr.indexOf(minHeight)
//摆放图片
cChild[i].style.position='absolute'
cChild[i].style.top=minHeight+'px'
cChild[i].style.left=cChild[minIndex].offsetLeft+'px'
//更新高度数组
boxHeightArr[minIndex]+=cChild[i].offsetHeight
}
完整代码
JS部分
window.onload=function(){
//确定第一行能放n张图
//1.获取屏幕宽度
//2.获取图片宽度
//操作第n+1张 摆放他的位置 放在高度最小的那一列
//1.获取所有列的高度
//2.更新这一列的高度
imgLocation('container', 'box')
function imgLocation(parent,child){
var cParent=document.getElementById(parent)
var cChild = cParent.getElementsByClassName(child)
var screenWidth=window.innerWidth
var imgWidth=cChild[0].offsetWidth
var num=Math.floor(screenWidth/imgWidth)
cParent.style.width=`${num*imgWidth}px`
//操作第num+1张图
var boxHeightArr=[]
for(var i=0;i<cChild.length;i++){
if(i<num){
boxHeightArr.push(cChild[i].offsetHeight)
}else{
//找数组最小值
var minHeight=Math.min(...boxHeightArr)
var minIndex=boxHeightArr.indexOf(minHeight)
//摆放图片
cChild[i].style.position='absolute'
cChild[i].style.top=minHeight+'px'
cChild[i].style.left=cChild[minIndex].offsetLeft+'px'
//更新高度数组
boxHeightArr[minIndex]+=cChild[i].offsetHeight
}
}
}
}
HTML部分
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
*{
margin: 0;
padding: 0;
}
#container{
position: relative;
}
.box{
float: left;
padding: 5px;
}
.box-img{
width: 150px;
padding: 5px;
border: 1px solid #aaa;
}
img{
width: 100%;
}
</style>
<script src="./index.js"></script>
</head>
<body>
<div id="container">
<div class="box">
<div class="box-img">
<img src="./img/1.webp" alt="">
</div>
</div>
<div class="box">
<div class="box-img">
<img src="./img/2.webp" alt="">
</div>
</div>
<div class="box">
<div class="box-img">
<img src="./img/3.webp" alt="">
</div>
</div>
<div class="box">
<div class="box-img">
<img src="./img/4.webp" alt="">
</div>
</div>
<div class="box">
<div class="box-img">
<img src="./img/5.webp" alt="">
</div>
</div>
<div class="box">
<div class="box-img">
<img src="./img/6.webp" alt="">
</div>
</div>
<div class="box">
<div class="box-img">
<img src="./img/7.webp" alt="">
</div>
</div>
<div class="box">
<div class="box-img">
<img src="./img/8.webp" alt="">
</div>
</div>
<div class="box">
<div class="box-img">
<img src="./img/9.webp" alt="">
</div>
</div>
<div class="box">
<div class="box-img">
<img src="./img/10.webp" alt="">
</div>
</div>
<div class="box">
<div class="box-img">
<img src="./img/1.webp" alt="">
</div>
</div>
<div class="box">
<div class="box-img">
<img src="./img/2.webp" alt="">
</div>
</div>
<div class="box">
<div class="box-img">
<img src="./img/3.webp" alt="">
</div>
</div>
<div class="box">
<div class="box-img">
<img src="./img/4.webp" alt="">
</div>
</div>
<div class="box">
<div class="box-img">
<img src="./img/5.webp" alt="">
</div>
</div>
<div class="box">
<div class="box-img">
<img src="./img/6.webp" alt="">
</div>
</div>
<div class="box">
<div class="box-img">
<img src="./img/7.webp" alt="">
</div>
</div>
<div class="box">
<div class="box-img">
<img src="./img/8.webp" alt="">
</div>
</div>
<div class="box">
<div class="box-img">
<img src="./img/9.webp" alt="">
</div>
</div>
<div class="box">
<div class="box-img">
<img src="./img/10.webp" alt="">
</div>
</div>
</div>
</body>
</html>
转载自:https://juejin.cn/post/7369238146733899785