JavaScript实现瀑布流布局的3种方式


Posted in Javascript onDecember 27, 2020

前言

今天逛闲鱼的时候观察到每一行的高度不是相同的,经了解才知道原来这是一种瀑布流布局,感觉挺有意思,于是决定研究一下,在网上也找了一些方案,实现瀑布流大概有3种方式。

一、JS 实现瀑布流

思路分析

1、瀑布流布局的特点是等宽不等高。
2、为了让最后一行的差距最小,从第二行开始,需要将图片放在第一行最矮的图片下面,以此类推。
3、父元素设置为相对定位,图片所在元素设置为绝对定位。然后通过设置 top 值和 left 值定位每个元素。

代码实现

<!DOCTYPE html>
<html>
<head>
 <style>
 .box {
  width: 100%;
  position:relative;
 }
 .item {
  position: absolute;
 }
 .item img{
  width: 100%;
  height:100%;
 }
 </style>
</head>
<body>
<div class="box">
 <div class="item">
 <img src="banner.jpg" alt="" />
 </div>
 <div class="item">
 <img src="show.jpg" alt="" />
 </div>
 <div class="item">
 <img src="cloth.jpg" alt="" />
 </div>
 <div class="item">
 <img src="banner.jpg" alt="" />
 </div>
 <div class="item">
 <img src="show.jpg" alt="" />
 </div>
 <div class="item">
 <img src="cloth.jpg" alt="" />
 </div>
 <div class="item">
 <img src="banner.jpg" alt="" />
 </div>
 <div class="item">
 <img src="show.jpg" alt="" />
 </div>
 <div class="item">
 <img src="cloth.jpg" alt="" />
 </div>
 <div class="item">
 <img src="show.jpg" alt="" />
 </div>
 <div class="item">
 <img src="cloth.jpg" alt="" />
 </div>
 <div class="item">
 <img src="banner.jpg" alt="" />
 </div>
</div>
</body>
<script src="jquery.min.js"></script>
<script>
 function waterFall() {
 // 1 确定图片的宽度 - 滚动条宽度
 var pageWidth = getClient().width-8;
 var columns = 3; //3列
 var itemWidth = parseInt(pageWidth/columns); //得到item的宽度
 $(".item").width(itemWidth); //设置到item的宽度
 var arr = [];
 $(".box .item").each(function(i){
  var height = $(this).find("img").height();
  if (i < columns) {
  // 2 第一行按序布局
  $(this).css({
   top:0,
   left:(itemWidth) * i+20*i,
  });
  //将行高push到数组
  arr.push(height);
  } else {
  // 其他行
  // 3 找到数组中最小高度 和 它的索引
  var minHeight = arr[0];
  var index = 0;
  for (var j = 0; j < arr.length; j++) {
   if (minHeight > arr[j]) {
   minHeight = arr[j];
   index = j;
   }
  }
  // 4 设置下一行的第一个盒子位置
  // top值就是最小列的高度
  $(this).css({
   top:arr[index]+30,//设置30的距离
   left:$(".box .item").eq(index).css("left")
  });

  // 5 修改最小列的高度
  // 最小列的高度 = 当前自己的高度 + 拼接过来的高度
  arr[index] = arr[index] + height+30;//设置30的距离
  }
 });
 }
 //clientWidth 处理兼容性
 function getClient() {
 return {
  width: window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth,
  height: window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight
 }
 }
 // 页面尺寸改变时实时触发
 window.onresize = function() {
 //重新定义瀑布流
 waterFall();
 };
 //初始化
 window.onload = function(){
 //实现瀑布流
 waterFall();
 }
</script>
</html>

效果如下

JavaScript实现瀑布流布局的3种方式

二、column 多行布局实现瀑布流

思路分析:

column 实现瀑布流主要依赖两个属性。
一个是 column-count 属性,是分为多少列。
一个是 column-gap 属性,是设置列与列之间的距离。

代码实现:

<!DOCTYPE html>
<html>
<head>
 <style>
 .box {
  margin: 10px;
  column-count: 3;
  column-gap: 10px;
 }
 .item {
  margin-bottom: 10px;
 }
 .item img{
  width: 100%;
  height:100%;
 }
 </style>
</head>
<body>
<div class="box">
 <div class="item">
 <img src="banner.jpg" alt="" />
 </div>
 <div class="item">
 <img src="show.jpg" alt="" />
 </div>
 <div class="item">
 <img src="cloth.jpg" alt="" />
 </div>
 <div class="item">
 <img src="banner.jpg" alt="" />
 </div>
 <div class="item">
 <img src="show.jpg" alt="" />
 </div>
 <div class="item">
 <img src="cloth.jpg" alt="" />
 </div>
 <div class="item">
 <img src="banner.jpg" alt="" />
 </div>
 <div class="item">
 <img src="show.jpg" alt="" />
 </div>
 <div class="item">
 <img src="cloth.jpg" alt="" />
 </div>
 <div class="item">
 <img src="show.jpg" alt="" />
 </div>
 <div class="item">
 <img src="cloth.jpg" alt="" />
 </div>
 <div class="item">
 <img src="banner.jpg" alt="" />
 </div>
</div>
</body>

效果如下:

JavaScript实现瀑布流布局的3种方式

三、flex 弹性布局实现瀑布流

思路分析:

flex 实现瀑布流需要将最外层元素设置为 display: flex,即横向排列。然后通过设置 flex-flow:column wrap 使其换行。设置 height: 100vh 填充屏幕的高度,来容纳子元素。每一列的宽度可用 calc 函数来设置,即 width: calc(100%/3 - 20px)。分成等宽的 3 列减掉左右两遍的 margin 距离。

代码实现:

<!DOCTYPE html>
<html>
<head>
 <style>
 .box {
  display: flex; 
  flex-flow:column wrap;
  height: 100vh;
 }
 .item {
  margin: 10px;
  width: calc(100%/3 - 20px);
 }
 .item img{
  width: 100%;
  height:100%;
 }
 </style>
</head>
<body>
<div class="box">
 <div class="item">
 <img src="banner.jpg" alt="" />
 </div>
 <div class="item">
 <img src="show.jpg" alt="" />
 </div>
 <div class="item">
 <img src="cloth.jpg" alt="" />
 </div>
 <div class="item">
 <img src="banner.jpg" alt="" />
 </div>
 <div class="item">
 <img src="show.jpg" alt="" />
 </div>
 <div class="item">
 <img src="cloth.jpg" alt="" />
 </div>
 <div class="item">
 <img src="banner.jpg" alt="" />
 </div>
 <div class="item">
 <img src="show.jpg" alt="" />
 </div>
 <div class="item">
 <img src="cloth.jpg" alt="" />
 </div>
 <div class="item">
 <img src="show.jpg" alt="" />
 </div>
 <div class="item">
 <img src="cloth.jpg" alt="" />
 </div>
 <div class="item">
 <img src="banner.jpg" alt="" />
 </div>
</div>
</body>

效果如下:

JavaScript实现瀑布流布局的3种方式

四、3种方式对比

如果只是简单的页面展示,可以使用 column 多栏布局和 flex 弹性布局。如果需要动态添加数据,或者动态设置列数,就需要使用到 JS + jQuery。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript 拖拉缩放效果
Dec 10 Javascript
JS中 用户登录系统的解决办法
Apr 15 Javascript
addEventListener()第三个参数useCapture (Boolean)详细解析
Nov 07 Javascript
JS实现很酷的EMAIL地址添加功能实例
Feb 28 Javascript
JS封装cookie操作函数实例(设置、读取、删除)
Nov 17 Javascript
AngularJS入门教程中SQL实例详解
Jul 27 Javascript
原生JS实现幻灯片
Feb 22 Javascript
详解如何使用Node.js编写命令工具——以vue-cli为例
Jun 29 Javascript
JS 组件系列之Bootstrap Table 冻结列功能IE浏览器兼容性问题解决方案
Jun 30 Javascript
jQuery图片查看插件Magnify开发详解
Dec 25 jQuery
Express本地测试HTTPS的示例代码
Jun 06 Javascript
微信小程序弹窗禁止页面滚动的实现代码
Dec 30 Javascript
Vue实现省市区三级联动
Dec 27 #Vue.js
JavaScript实现通讯录功能
Dec 27 #Javascript
vue3.0自定义指令(drectives)知识点总结
Dec 27 #Vue.js
vue 使用 sortable 实现 el-table 拖拽排序功能
Dec 26 #Vue.js
在vue项目中封装echarts的步骤
Dec 25 #Vue.js
vue中封装axios并实现api接口的统一管理
Dec 25 #Vue.js
Vue 简单实现前端权限控制的示例
Dec 25 #Vue.js
You might like
PHP实现Unicode编码相互转换的方法示例
2020/11/17 PHP
用JTrackBar实现的模拟苹果风格的滚动条
2007/08/06 Javascript
JavaScript CSS修改学习第三章 修改样式表
2010/02/19 Javascript
javascript常用方法、属性集合及NodeList 和 HTMLCollection 的浏览器差异
2010/12/25 Javascript
映彩衣的js随笔(js图片切换效果)
2011/07/31 Javascript
javascript管中窥豹 形参与实参浅析
2011/12/17 Javascript
点击隐藏页面左栏或右栏实现js代码
2013/04/01 Javascript
基于Jquery+Ajax+Json实现分页显示附效果图
2014/07/30 Javascript
一个获取第n个元素节点的js函数
2014/09/02 Javascript
js中this用法实例详解
2015/05/05 Javascript
在Python中使用glob模块查找文件路径的方法
2015/06/17 Javascript
ECharts仪表盘实例代码(附源码下载)
2016/02/18 Javascript
react实现点击选中的li高亮的示例代码
2018/05/24 Javascript
Vue+element-ui添加自定义右键菜单的方法示例
2020/12/08 Vue.js
PHP webshell检查工具 python实现代码
2009/09/15 Python
基于wxpython实现的windows GUI程序实例
2015/05/30 Python
Python的Django框架中if标签的相关使用
2015/07/15 Python
python Matplotlib画图之调整字体大小的示例
2017/11/20 Python
Python并发之多进程的方法实例代码
2018/08/15 Python
Python中对数组集进行按行打乱shuffle的方法
2018/11/08 Python
django+echart绘制曲线图的方法示例
2018/11/26 Python
详解PyCharm+QTDesigner+PyUIC使用教程
2019/06/13 Python
检测python爬虫时是否代理ip伪装成功的方法
2019/07/12 Python
Python生态圈图像格式转换问题(推荐)
2019/12/02 Python
迷你唐卡软皮鞋:Minnetonka Moccasin
2018/05/01 全球购物
排序都有哪几种方法?请列举。用JAVA实现一个快速排序
2014/02/16 面试题
研发工程师的岗位职责
2013/11/18 职场文书
关于是否需要写商业计划书
2014/02/07 职场文书
医院营销工作计划
2015/01/16 职场文书
慰问信格式
2015/02/14 职场文书
外贸采购员岗位职责
2015/04/03 职场文书
员工离职证明范本
2015/06/12 职场文书
2015年中学体育教师工作总结
2015/10/23 职场文书
优秀班干部主要事迹材料
2015/11/04 职场文书
纯CSS如何禁止用户复制网页的内容
2021/11/01 HTML / CSS
Python中tqdm的使用和例子
2022/09/23 Python