分别用js和css实现瀑布流
下午查找了瀑布流的相关原理,找了一些css3实现的还有js实现的,最后总结了一些比较简单的,易懂的整理起来
1.css3实现
只要运用到 column-count分列
column-width固定宽度
column-gap设置列间的间隔
break-inside:avoid防止换行
注意: Internet Explorer 9及更早 IE 版本浏览器不支持 column-count 属性。
下面是一个例子:
html代码:
<!DOCTYPE html>
<html> <head>
<meta charset="utf-8" />
<title>css3实现简单的瀑布流</title>
<link rel="stylesheet" href="css/index.css" />
</head>
<body>
<div class="container">
<div class="waterfall">
<div class="pin">
<img src="http://dummyimage.com/640x4:3" />
<p>1 convallis timestamp</p>
</div> <div class="pin">
2 Donec a fermentum nisi.
</div> <div class="pin">
<img src="http://dummyimage.com/640x3:4" />
<p>
3 Nullam eget lectus augue. Donec eu sem sit amet ligula faucibus suscipit. Suspendisse rutrum turpis quis nunc convallis quis aliquam mauris suscipit.
</p>
</div> <div class="pin">
<img src="http://loremflickr.com/640/480/germany" />
<p>
4 Donec a fermentum nisi. Integer dolor est, commodo ut sagittis vitae, egestas at augue.
</p>
</div> <div class="pin">
<img src="http://dummyimage.com/480x4:3" />
<p>
5 Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed feugiat consectetur pellentesque. Nam ac elit risus, ac blandit dui. Duis rutrum porta tortor ut convallis. Duis rutrum porta tortor ut convallis.
</p>
</div> <div class="pin">
<img src="http://dummyimage.com/480x3:4" />
<p>
6 Nullam eget lectus augue. Donec eu sem sit amet ligula faucibus suscipit. Suspendisse rutrum turpis quis nunc convallis quis aliquam mauris suscipit. Duis rutrum porta tortor ut convallis.
</p>
</div> <div class="pin">
<img src="http://dummyimage.com/640x21:10" />
<p>
7 Nullam eget lectus augue.
</p>
</div> <div class="pin">
<p>
8 Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed feugiat consectetur pellentesque.
</p>
</div> <div class="pin">
<img src="http://dummyimage.com/800x4:3" />
<p>
9 Donec a fermentum nisi. Integer dolor est, commodo ut sagittis vitae, egestas at augue. Suspendisse id nulla ac urna vestibulum mattis. Duis rutrum porta tortor ut convallis.
</p>
</div> <div class="pin">
<img src="http://dummyimage.com/900x4:2" />
<p>
10 Donec a fermentum nisi. Integer dolor est, commodo ut sagittis vitae, egestas at augue. Suspendisse id nulla ac urna vestibulum mattis.
</p>
</div> <div class="pin">
<img src="http://dummyimage.com/640x5:4" />
<p>
11 Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed feugiat consectetur pellentesque. Nam ac elit risus, ac blandit dui. Duis rutrum porta tortor ut convallis.
</p>
</div> <div class="pin">
<img src="http://loremflickr.com/1024/768/cool" />
<p>
12 Donec a fermentum nisi. Integer dolor est, commodo ut sagittis vitae, egestas at augue. Suspendisse id nulla ac urna vestibulum mattis.
</p>
</div> <div class="pin">
<img src="http://dummyimage.com/800x16:3" />
<p>
13 Donec a fermentum nisi. Integer dolor est, commodo ut sagittis vitae, egestas at augue. Suspendisse id nulla ac urna vestibulum mattis.
</p>
</div> <div class="pin">
<img src="http://loremflickr.com/1024/768/vw,golf,variant/all" />
<p>
14 Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed feugiat consectetur pellentesque. Nam ac elit risus, ac blandit dui. Duis rutrum porta tortor ut convallis.
</p>
</div> <div class="pin">
<img src="http://dummyimage.com/300x4:3" />
<p>
15 Nullam eget lectus augue.
</p>
</div> <div class="pin">
<img src="http://dummyimage.com/640x16:9" />
<p>
16 Nullam eget lectus augue.
</p>
</div>
</div>
</div>
</body> </html>
css代码:
body {
background-color: #f6f6f6;
}
.container {
width: 80%;
margin: 0 auto;
}
.waterfall {
-moz-column-count:;
-webkit-column-count:;
column-count:;
-moz-column-width: 24em;
-webkit-column-width: 24em;
column-width: 24em;
-moz-column-gap: 1em;
-webkit-column-gap: 1em;
column-gap: 1em;
}
.pin {
padding: 1em;
margin: 0 0.125em 1em;
-moz-page-break-inside: avoid;
-webkit-column-break-inside: avoid;
break-inside: avoid;
background: white;
-moz-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.12), 0 1px 2px 0 rgba(0, 0, 0, 0.24);
-webkit-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.12), 0 1px 2px 0 rgba(0, 0, 0, 0.24);
box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.12), 0 1px 2px 0 rgba(0, 0, 0, 0.24);
}
.pin img {
width: 100%;
padding-bottom: 1em;
margin-bottom: 0.5em;
border-bottom: 1px solid #cccccc;
}
效果实现:


++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
js实现瀑布流
原理:
1.编写方法:获取容器内所有外层元素,存入数组;
2.编写方法:计算容器内一行可以承载多少个元素,方法:容器宽度/元素宽度,四舍五入向下取整;
3.编写方法:把每一行中所有元素的高度值存入数组;
4.编写方法:在高度值数组中找到最小高度值;
5.编写方法:把第二行第一个元素定位到上一行所有元素中高度最低的元素下面,即设置该元素的top,left,position属性;
6.编写方法:重置当前高度值数组中的最小值;
7.编写方法:从第二行第一个元素开始,遍历每个元素,用上述方法重新定位每个元素的位置,把该事件绑定到页面;
8.编写方法:监听鼠标事件,当前容器内最下面一个元素的offsetTop<浏览器可视高度+已滚动高度时,加载下一页数据;
9.加载完之后,用上述方法重新定位新加载元素的位置;
下面是一个例子:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>瀑布流</title>
<style type="text/css">
div{
background: #ccc;
width: 200px;
position: absolute;
transition:0.5s;
}
</style>
</head>
<body> <script>
//js代码
</script>
</body>
</html>
这里的模拟瀑布流里面的图片全用一个div去模拟了,每个div宽度(200px)都一样,跟上面的图片例子一样(高度可能不一样),然后将每一个div都绝对定位,因为在后面会通过left、top值改变div的位置。transition:0.5s;只是给div改变样式时一个过渡。
<script type="text/javascript">
createDiv ()
function createDiv () {
for (var i = 0; i < 20; i++) {
var div = document.createElement('div');
var rnd = Math.floor(Math.random()*300+50) //div的高度在50到350之间
div.style.height = rnd + "px";
div.innerHTML = i;
document.body.appendChild(div);
};
change()
} function change() {
var aDiv = document.getElementsByTagName('div');
// alert(aDiv.length);
var windowCW = document.documentElement.clientWidth; //窗口视口的宽度
var n = Math.floor(windowCW/210); //一行能容纳多少个div,并向下取整
if (n<=0) {return};
// alert(n);
var t = 0;
var center = (windowCW - n*210)/2; //居中
var arrH = []; //定义一个数组存放div的高度
for (var i = 0; i < aDiv.length; i++) {
var j = i%n; if (arrH.length==n) { //一行排满n个后到下一行
var min = findMin(arrH); //从最“矮”的排起,可以从下图的序号中看得出来,下一行中序号是从矮到高排列的
aDiv[i].style.left =center + min*210 + "px";
aDiv[i].style.top = arrH[min]+10 + "px";
arrH[min] += aDiv[i].offsetHeight + 10;
// alert(min);
}else{
arrH[j] = aDiv[i].offsetHeight;
aDiv[i].style.left =center + 200*j+10*j + "px";
aDiv[i].style.top = 0;
} };
}
window.onresize = function(){ //窗口改变也调用函数
change();
}
window.onscroll= function () {
// 页面总高度
var bodyHeight = document.documentElement.offsetHeight;
// 可视区高度
var windowHeight = document.documentElement.clientHeight;
//滚动条的高度
var srcollTop = document.documentElement.scrollTop || document.body.scrollTop;
var srcollH = document.body.scrollHeight;
// alert(srcollH);
if (srcollTop+windowHeight >= srcollH-20) {
createDiv();
};
} function findMin(arr) {
var m = 0;
for (var i = 0; i < arr.length; i++) {
m = Math.min(arr[m], arr[i]) == arr[m] ? m : i;
}
return m;
}
</script>

分别用js和css实现瀑布流的更多相关文章
- 简单CSS定位瀑布流实现方法
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 用vue.js写的一个瀑布流的组件
用vue.js写的一个瀑布流的组件:https://segmentfault.com/a/1190000010741319 https://www.jianshu.com/p/db3cadc03402
- css布局-瀑布流的实现
一.基本思路 1.先看最终的效果图: 2.实现原理:通过position:absolute(绝对定位)来定位每一个元素的位置,并且将当前列的高度记录下来方便下一个dom位置的计算 二.代码实现 1.版 ...
- js实现图片的瀑布流
先看效果: 初始状态:
- 利用JS实现简单的瀑布流效果
哈哈, 我又来啦, 在这一段时间里, 我简单的学习了一下javascript(JS), 虽然不是很懂啦, 但是我也简单的尝试着做了点小东西, 就比如现在流行的瀑布流效果, 经过我的努力终于成功的完成了 ...
- 详解纯css实现瀑布流(multi-column多列及flex布局)
瀑布流的布局自我感觉还是很吸引人的,最近又看到实现瀑布流这个做法,在这里记录下,特别的,感觉flex布局实现瀑布流还是有点懵的样子,不过现在就可以明白它的原理了 1.multi-column多列布局实 ...
- 玩转Masonry JS库来实现瀑布流Web效果
工作项目中需要制作个Mobile上的Web App的展示,方便快捷访问和评价反馈.在展示页面能看到应用展示图,点击进入Web应用.我不是前端开发者,对HTML, CSS, JS这三剑客仅仅是略知一二. ...
- 纯css实现瀑布流(multi-column多列及flex布局)
瀑布流的布局自我感觉还是很吸引人的,最近又看到实现瀑布流这个做法,在这里记录下,特别的,感觉flex布局实现瀑布流还是有点懵的样子,不过现在就可以明白它的原理了 1.multi-column多列布局实 ...
- 【js】【图片瀑布流】js瀑布流显示图片20180315
js实现把图片用瀑布流显示,只需要“jquery-1.11.2.min.js”. js: //瀑布流显示图片 var WaterfallImg = { option: { maxWidth: 850, ...
随机推荐
- Apache Accumulo
Apache Accumulo 是一个可靠的.可伸缩的.高性能的排序分布式的 Key-Value 存储解决方案, 基于单元访问控制以及可定制的服务器端处理.Accumulo使用 Google BigT ...
- iOS中Cookie的管理
平常的app开发中只调用Rest Api可能用不到Cookie,但是当要在App中内嵌WebView就有可能要用到.最近用到了这一块的东西,总结一下. Cookie原理 关于cookie的原理简单描述 ...
- CRC全套~~~ 转载
经测试CRC16-CCITT是可以了,其它暂时没有测试哦. 00 0E 00 01 00 01 20 17 12 26 20 19 16 01 00 00 01 01 00 00 00 00 00 0 ...
- erlang里面中文相关处理
在控制台输出的话 Name = "测试数据", io:format("~ts~n",[Name]). 如果是和客户端通信,假如都是utf8编码 服务器获取的时候 ...
- 0基础自学php教程
轻松搞定网页设计之html 一.HTML介绍 1. HTML概念 HTML(Hyper Text Markup Language),即超文本标记语言.是目前网络上应用最为广泛的语言,是构成网页文档的主 ...
- Linux c- libevent
libevent是一个事件触发的网络库,适用于windows.linux.bsd等多种平台,内部使用select.epoll.kqueue等系统调用管理事件机制.著名分布式缓存软件memcached也 ...
- python 面向对象(类的特殊成员)
python 面向对象: (思维导图 ↑↑↑↑) 类的特殊成员 python的类成员存在着一些具有特殊含义的成员 1.__init__: 类名() 自动执行 __init__ class Foo(ob ...
- MySQL Join算法与调优白皮书(三)
Batched Key Access Join Index Nested-Loop Join虽好,但是通过辅助索引进行链接后需要回表,这里需要大量的随机I/O操作.若能优化随机I/O,那么就能极大的提 ...
- sklearn中的predict与predict_proba的区别(得到各条记录每个标签的概率(支持度))
假定在一个k分类问题中,测试集中共有n个样本.则: predict返回的是一个大小为n的一维数组,一维数组中的第i个值为模型预测第i个预测样本的标签: predict_proba返回的是一个n行k列的 ...
- 002:MySQL升级以及访问连接
目录 一. 数据库升级 1. 环境说明: 2. 环境举例: 3. 版本升级 4.关于降级问题的说明 二. MySQL的连接登录 1. 几种登录方式 2. 免密码登录 三. MySQL 参数介绍和设置 ...