瀑布流布局是一种新型的布局方式,可以将大小不一的图片完整的显示在页面上,并且在杂乱的布局中保持着一定的美感,今天学习了一下如何使用瀑布流布局,总结了有以下三种方式。(瀑布流还可以使用grid布局实现,还没有学习过这种方式)
瀑布流的实现方法可以用纯CSS,也可以用JS实现,如何选取决于需求,这几种方法各有优略,如何选取取决于需求。以下案例均采用如下的html代码
实现代码:
.container{
column-count: 4;//想要排成的列数
column-gap: 0;
}
.item img{
width: 100%;
}
实现效果:
使用column-count属性将一个盒子分为多列展示数据 ,使用column-gap:0px将列间间距设置未0,方便我们自定义间距。
实现代码:
.container{
display: flex;
flex-direction: column;
flex-wrap: wrap;
/* 需要指定高度 */
height: 800px;
}
.item{
width: 25%;
}
.item img{
width: 100%;
}
实现效果:
使用弹性盒子,给弹性元素指定列排列,然后给每个元素指定宽度(宽度设置为(1/列数)如果想要排成4列就设置成25%,如果想要排成5列就设置成25%以此类推)。
由于设置为列排列,当元素的累计高度没有超过指定的高度时,首先会在第一个列上堆叠元素
由于我们设置了flex-wrap:wrap导致如果超出了设置的高度,元素将会换行,由于我们设置的排列方向是按列排列,因此超出的元素将会展示在第二列
以此类推,只要我们元素的数量合适,能够在指定的高度下填满4列,就能完成瀑布流了布局了,可以看见此时还是图片按照列的顺序排列的,仍然无法做到新的图片展示在下方的业务。
优化
.container{
display: flex;
flex-direction: column;
flex-wrap: wrap;
/* 需要指定高度 */
height: 1600px
}
/**新加入的代码*/
.item:nth-child(4n+1){
order: 1;
}
.item:nth-child(4n+2){
order:2;
}
.item:nth-child(4n+3){
order: 3;
}
.item:nth-child(4n){
order: 4;
}
/**新加入的代码*/
.item{
width: 25%;
position: relative;
counter-increment: item-counter;
}
.item img{
width: 100%;
}
.item::after{
position:absolute;
background-color: red;
color: white;
left: 0;
top: 0;
content: counter(item-counter);
}
期望得到这样的效果:
实际的效果却是:
几经查证发现,由于图片大小差距过大,导致每一行显示图片的数量不一样,导致order失效。
但当每一列图片数量相等的时候,可以达成想要的效果
总结:
原理:通过JS,根据每个图片的宽度计算出需要放置多少行,将所有图片设置绝对定位,逐一计算出该图片所在的top和left进行定位
实现代码:
.container{
position: relative;
}
.item{
width: 200px;
height: auto;
position: absolute;
}
.item img{
width: 100%;
}
//当页面加载的时候调用
window.onload = function(){
//页面初始化调用
waterFall()
//每次页面改变大小调用
window.onresize = waterFall
}
function waterFall(){
// 1. 设置container盒子的宽度
// 注意:浏览器的可视区域的宽度 / 一个item元素的宽度 = 一行的排列的元素的个数
let container = document.getElementById("con")
let item = document.getElementsByClassName("item")
//获取元素的宽度(含border,padding)
let width = item[0].offsetWidth
//计算出浏览器窗口的宽度
let clientWidth = document.documentElement.clientWidth;
//计算出应该放几列(向下取整)
let columnCount = Math.floor(clientWidth / width)
//设置容器(父盒子)的宽度
container.style.width = columnCount*width+"px"
// 2.设置每一个item元素的排列位置
// 第一行整体的top值都是0 后面的依次找上一行高度最小的容器,在它下面进行排列
let hrr = []
for(let i= 0 ;i
为什么每次都要将图片放置在高度最小的列上呢
因为图片高度不一的情况,如果按下标顺序一个一个排列,最终虽然每一列上图片的数量是一样的,但是显示的高度可能相差甚远,因此选择将每个图片放在高度最小的列上让每一列的总高度不会相差太大。
实现效果:
当浏览器宽度缩小时,图片列数自动匹配。
总结:
先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦