js实现瀑布流的三种方式比较


Posted in Javascript onJune 28, 2020

瀑布流是一种网站页面布局,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部。最早采用此布局的网站是Pinterest,逐渐在国内流行开来。国内大多数清新站基本为这类风格。

js实现瀑布流的三种方式比较

瀑布流特点:

1、琳琅满目:整版以图片为主,大小不一的图片按照一定的规律排列。
2、唯美:图片的风格以唯美的图片为主。
3、操作简单:在浏览网站的时候只需要轻轻滑动一下鼠标滚轮,一切的美妙的图片精彩便可呈现在你面前。

瀑布流布局实现方式:

1、传统多列浮动

js实现瀑布流的三种方式比较

  • · 各列固定宽度,并且左浮动;
  • · 一列中的数据块为一组,列中的每块依次排列;
  • · 更多数据加载时,需要分别插入到不同的列中;

优点:

      布局简单,应该说没啥特别的难点;

      不用明确知道数据块高度,当数据块中有图片时,就不需要指定图片高度。

缺点:

      列数固定,扩展不易,当浏览器窗口大小变化时,只能固定的x列,如果要添加一列,很难调整数据块的排列;

      滚动加载更多数据时,还要指定插入到第几列中,还是不方便。

示例:

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>传统多列浮动</title>
 <style>
 div{
 float:left;
 margin: 5px 5px 5px 5px;
 }
 p{
 background: #90EE90;
 width:160px;
 text-align:center;
 }
 </style>
</head>
<body>
 <div>
 <p style="height:230px;">a1</p>
 <p style="height:100px;">a2</p>
 </div>
 
 <div>
 <p style="height:100px;">a3</p>
 <p style="height:300px;">a4</p>
 </div>

 <div>
 <p style="height:250px;">a5</p>
 <p style="height:200px;">a6</p>
 </div>
</body>
</html>

效果:

js实现瀑布流的三种方式比较

2、CSS3 样式定义

js实现瀑布流的三种方式比较

优点:

      直接 CSS 定义,最方便了;

      扩展方便,直接往容器里添加内容即可。

缺点:

      只有高级浏览器中才能使用;

      还有一个缺点,他的数据块排列是从上到下排列到一定高度后,再把剩余元素依次添加到下一列,这个本质上就不一样了;

      鉴于这两个主要缺点,注定了该方法只能局限于高端浏览器,而且,更适合于文字多栏排列。

示例

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>CSS3瀑布布局</title>
<style>
 .container{
 -webkit-column-width:160px;
 -moz-column-width:160px;
 -o-colum-width:160px;
 -webkit-column-gap:1px;
 -moz-column-gap:1px;
 -o-column-gap:1px;
 }
 div:not(.container){
 -webkit-border-radius:5px;
 -moz-border-radius:5px;
 border-radius:5px;
 background:#90EE90;
 border::#CCC 1px solid;
 display:inline-block;
 width:157px;
 position:relative;
 margin:2px;
 }
 .title{
  line-height:80px; font-size:18px; color:#999;
  text-align:center;
  font-family:"Microsoft YaHei";
 }
</style>
</head>

<body>
<section>
 <div class="container">
 <div style="height:80px" class="title">纯CSS3瀑布布局</div>
 <div style="height:260px"></div>
 <div style="height:65px"></div>
 <div style="height:120px"></div>
 <div style="height:145px"></div>
 <div style="height:90px"></div>
 <div style="height:145px"></div>
 <div style="height:160px"></div>
 <div style="height:65px"></div>
 <div style="height:230px"></div>
 <div style="height:140px"></div>
 <div style="height:85px"></div>
 <div style="height:20px"></div>
 <div style="height:145px"></div>
 <div style="height:50px"></div>
 <div style="height:65px"></div>
 <div style="height:230px"></div>
 <div style="height:140px"></div>
 <div style="height:85px"></div>
 <div style="height:20px"></div>
 <div style="height:145px"></div>
 <div style="height:50px"></div>
 <div style="height:145px"></div>
 <div style="height:160px"></div>
 <div style="height:240px"></div>
 </div>
</section>
</body>
</html>

效果:

js实现瀑布流的三种方式比较

3、绝对定位

最优的一种方案,方便添加数据内容,窗口变化,列数/数据块都会自动调整;

优点:
      方便添加数据内容,窗口变化,列数/数据块都会自动调整;

缺点:

      需要实现知道数据块高度,如果其中包含图片,需要知道图片高度;

      JS 动态计算数据块位置,当窗口缩放频繁,可能会狂耗性能。

思路:

1) 数据块排列(对容器中已有元素进行排列),算法步骤简述下:
设置(块元素宽度一致)
· 初始化时,对容器中已有数据块元素进行第一次计算,需要用户给定: a,容器元素 — 以此获取窗口总宽度; b,列宽度(块元素宽度); c,最小列数;
·计算显示列数:窗口宽度除以一个块框宽度向下取整,并设置waterfall显示的居中
·存储每列的高度
· 获得列数后,需要保存每个列的当前高度,这样在添加每个数据块时,才知道起始高度是多少;
· 依次取容器中的所有数据块,先寻找当前高度最小的某列,之后根据列序号,确定数据块的left,top值,left 为所在列的序号乘以列宽,top 为所在列的当前高度,最后更新所在列的当前高度加上这个数据块元素的高度,至此,插入一个元素结束;
· 当所有元素插入完毕后,调整容器的高度为各列最大的高度值,结束依次调整。

2) 异步加载数据,包含两个步骤:
· 绑定滚动事件,并确定预加载线高度值,即滚动到哪个高度后,需要去加载数据,其实这个就是列的最小高度值,这样当前滚动值和最小高度值比较一下即可判断出来,是否要触发加载数据;
· 加载数据,函数传参,能提供加载数据函数和停止加载(加载多少时停止)函数,以更方便的控制。

以上就是本文的全部内容,希望对大家的学习有所帮助。

Javascript 相关文章推荐
textarea的value是html文件源代码,存成html文件的代码
Apr 20 Javascript
jQuery 锚点跳转滚动条平滑滚动一句话代码
Apr 30 Javascript
jQuery源码分析-01总体架构分析
Nov 14 Javascript
JavaScript1.6数组新特性介绍以及JQuery的几个工具方法
Dec 06 Javascript
手机号码,密码正则验证
Sep 04 Javascript
Jquery日历插件制作简单日历
Oct 28 Javascript
简述Matlab中size()函数的用法
Mar 20 Javascript
jQuery中的基本选择器用法学习教程
Apr 14 Javascript
JavaScript_ECMA5数组新特性详解
Jun 12 Javascript
基于jstree使用AJAX请求获取数据形成树
Aug 29 Javascript
vue.js绑定事件监听器示例【基于v-on事件绑定】
Jul 07 Javascript
Nuxt.js nuxt-link与router-link的区别说明
Nov 06 Javascript
详解AngularJS中自定义过滤器
Dec 28 #Javascript
js运动应用实例解析
Dec 28 #Javascript
基于JavaScript将表单序列化类型的数据转化成对象的处理(允许对象中包含对象)
Dec 28 #Javascript
浅析JS运动
Dec 28 #Javascript
基于JavaScript实现网页倒计时自动跳转代码
Dec 28 #Javascript
js时间戳转为日期格式的方法
Dec 28 #Javascript
jquery实现全屏滚动
Dec 28 #Javascript
You might like
推荐Discuz!5的PHP代码高亮显示与实现可运行代码
2007/03/15 PHP
cmd下运行php脚本
2008/11/25 PHP
Yii2 GridView实现列表页直接修改数据的方法
2016/05/16 PHP
CI框架常用经典操作类总结(路由,伪静态,分页,session,验证码等)
2016/11/21 PHP
PHP反射学习入门示例
2019/06/14 PHP
Laravel数据库读写分离配置的方法
2019/10/13 PHP
Yii框架模拟组件调用注入示例
2019/11/11 PHP
firefox中用javascript实现鼠标位置的定位
2007/06/17 Javascript
数组Array进行原型prototype扩展后带来的for in遍历问题
2010/02/07 Javascript
在chrome中window.onload事件的一些问题
2010/03/01 Javascript
JQery jstree 大数据量问题解决方法
2010/03/09 Javascript
浅析javascript中function 的 length 属性
2014/05/27 Javascript
AngularJS实用开发技巧(推荐)
2016/07/13 Javascript
jQuery实现可拖拽的许愿墙效果【附demo源码下载】
2016/09/14 Javascript
在DWR中实现直接获取一个JAVA类的返回值的两种方法
2016/12/25 Javascript
关于foreach循环中遇到的问题小结
2017/05/08 Javascript
jQuery实现导航栏头部菜单项点击后变换颜色的方法
2017/07/19 jQuery
Vue组件通信之Bus的具体使用
2017/12/28 Javascript
layui获取多选框中的值方法
2018/08/15 Javascript
基于vue实现简易打地鼠游戏
2020/08/21 Javascript
[02:05]2014DOTA2西雅图邀请赛 老队长全明星大猜想谁不服就按进显示器
2014/07/08 DOTA
完美解决python遍历删除字典里值为空的元素报错问题
2016/09/11 Python
Python新手入门最容易犯的错误总结
2017/04/24 Python
Python中扩展包的安装方法详解
2017/06/14 Python
Python实现上下班抢个顺风单脚本
2018/02/07 Python
python 实现dict转json并保存文件
2019/12/05 Python
python numpy数组复制使用实例解析
2020/01/10 Python
Python web如何在IIS发布应用过程解析
2020/05/27 Python
TensorFlow的环境配置与安装教程详解(win10+GeForce GTX1060+CUDA 9.0+cuDNN7.3+tensorflow-gpu 1.12.0+python3.5.5)
2020/06/22 Python
python通用数据库操作工具 pydbclib的使用简介
2020/12/21 Python
素食餐饮项目创业计划书
2014/02/02 职场文书
关于护士节的演讲稿
2014/05/26 职场文书
高效课堂标语
2014/06/26 职场文书
医药公司开票员岗位职责
2015/04/15 职场文书
八月一日观后感
2015/06/10 职场文书
个人房屋租赁合同(标准范本)
2019/09/16 职场文书