步骤一:构建成行元素 + 寻找新增元素追加位置
瀑布流所有元素的宽度是固定的,我们用浏览器的宽度除以每个瀑布流块的宽度,就是每一行可容纳的瀑布流块的个数.因为,每个瀑布流块的高度不一,我们姑且把组成一行的这组元素称为成行元素,在成行元素放置完毕后,我们如果要再增加一个元素,那么它的位置应该这样找?
“获取成行元素集合中高度最低的那个元素,待放置的元素的top值应该是这个最低元素的高,left值应该是这个最低元素的left值”
这样,新增的这一个元素我们就找到了它存放的位置.这样成行元素中的最低高度值就变为了原来的高度+新增元素的高度.
步骤二:重复步骤一,依赖成行元素追加新元素
步骤一中我们已经实现了一次成行元素追加一个新的元素,这样新元素增加之后我们就构建了新的成行元素,之后的操作就是在新的成行元素中追加新元素,原理同步骤一.
<!doctype html>
<meta charset="UTF-8">
<title>瀑布流效果实现
<script type="text/javascript" src="scripts/jquery-1.8.2.min.js">
<script type="text/javascript" src="scripts/jquery.easydrag.handler.beta2.js">
<script type="text/javascript">
window.onload=function(){
//获取父级对象
var oParent = document.getElementById("main")
//获取父级[第一个参数]下的所有的子元素[按照第二个参数匹配]
var aPin =getClassObject(oParent,"pin")
//获取每一个块的宽度
var iPinW = aPin[0].offsetWidth
// //计算每行放多少个pin(瀑布流块)页面的宽度/每一个瀑布流块的宽度
var num = Math.floor(document.documentElement.clientWidth/iPinW)
//重置父级的样式,这样保证图片整体居中
oParent.style.cssText="width:" + num*iPinW +"pxmargin:0 auto"
var compareArray = []
//遍历获取到的所有瀑布流块
for (var i =0i
if(i
//成行元素
compareArray[i] = aPin[i].offsetHeight
}else{
//获取成行元素中高度最低的值
var minHeight = Math.min.apply('',compareArray)
//alert(compareArray + ",min=" + minHeight)
//获取成行元素中高度最低元素的索引
var minHkey =getMinHeightKey(compareArray,minHeight)
//为新增的瀑布流块设置定位
aPin[i].style.position ="absolute"
aPin[i].style.top = minHeight +"px"
//设定新增加的瀑布流块的top和left
aPin[i].style.left =aPin[minHkey].offsetLeft +"px"
//将该索引位置的高度改变为新增后的高度[原来瀑布流块的高度+新增的瀑布流块的高度]
compareArray[minHkey] += aPin[i].offsetHeight
}
}
}
/**
* 获取parent下所有样式名为className的对象集合
*/
function getClassObject(parent,className){
var obj = parent.getElementsByTagName("*")
var result = []
for(var i=0i
//变量如果匹配className,将匹配的对象放入数组
if(obj[i].className==className){
result.push(obj[i])
}
}
return result
}
/**
* 获取arr数组中值为minH的值在数组中的索引
*/
function getMinHeightKey(arr,minH){
for(key in arr){
if(arr[key] == minH){
return key
}
}
}
<style type="text/css">
/*设置每一个瀑布流块*/
#main .pin{
width:220px
height:auto
padding:15px 0px 0px 15px/*上 右 下 左*/
float:left
}
/*设置每一个瀑布流块中的图像样式*/
#main .pin .box{
width:200px
height:auto
padding:10px
background:#FFF
border:1px solid #ccc
box-shadow:0px 0px 6px #ccc/*中间投影*/
border-radius:5px/*圆角*/
}
#main .pin .box img{
width:200px
}
<div id="main">
<div class="pin">
<div class="box">
<img src="images/1.webp">
<div class="pin">
<div class="box">
<img src="images/2.webp">
<div class="pin">
<div class="box">
<img src="images/3.webp">
<div class="pin">
<div class="box">
<img src="images/4.webp">
<div class="pin">
<div class="box">
<img src="images/5.webp">
<div class="pin">
<div class="box">
<img src="images/6.webp">
<div class="pin">
<div class="box">
<img src="images/7.webp">
</html>
瀑布流可以说难度中等吧,主要涉及到几个问题:
布局问题(瀑布就是没了之后自动加载,加载进来的内容的样式问题)
异步数据获取的问题(当你监听scroll的时候,什么时候获取数据,取到的数据解析,处理完成还还要append页面去)
第一次编程要是做这个确实有点难,但是越有难度越有挑战,自己也会越有成就感,建议楼主主要看一下事件机制,ajax就好,把握好css 做起来难度还可以
在网页中实现瀑布流效果方法:
1.传统多列浮动
各列固定宽度,并且左浮动
一列中的数据块为一组,列中的每个数据块依次排列即可
更多数据加载时,需要分别插入到不同的列上。
2. CSS3 定义
由 chrome/ff 浏览器直接渲染出来,可以指定容器的列个数,列间距,列中间边框,列宽度来实现
#container {
-webkit-column-count: 5;
/*-webkit-column-gap: 10px;
-webkit-column-rule: 5px solid #333;
-webkit-column-width: 210px;*/
-moz-column-count: 5;
/*-moz-column-gap: 20px;
-moz-column-rule: 5px solid #333;
-moz-column-width: 210px;*/
column-count: 5;
/*column-gap: 10px;
column-rule: 5px solid #333;
column-width: 210px;*/
}
column-count 为列数column-gap 为每列间隔距离column-rule 为间隔边线大小column-width 为每列宽度当只设置 column-width 时,浏览器窗口小于一列宽度时,列中内容自动隐藏当只设置 column-count 时,平均计算每列宽度,列内内容超出则隐藏都设了 column-count 和column-width,浏览器会根据 count 计算宽度和 width 比较,取大的那个值作为每列宽度,然后当窗口缩小时,width 的值为每列最小宽度。
3.绝对定位
可谓是最优的一种方案,方便添加数据内容,窗口变化,列数/数据块都会自动调整。