瀑布流简介
瀑布流——瀑布流式布局
一种网站页面布局,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部。
最早采用此布局的网站是Pinterest,逐渐在国内流行开来。
国内大多数清新站基本为这类风格。
应用领域
布局优点
瀑布流布局的结构和样式
瀑布流基本结构的结构层与表示层
index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>瀑布流—云南十八怪</title>
<link rel="stylesheet" type="text/css" href="css/index.css" />
</head>
<body>
<div id="wrap">
<div>
<img src="img/2.png">
<a href="http://www.imooc.com">第一怪 竹筒当烟袋</a>
</div>
<div><img src="img/3.png">
<a href="http://www.imooc.com">第二怪 草帽当锅盖</a>
</div>
<div><img src="img/4.png">
<a href="http://www.imooc.com">第三怪 这边下雨那边晒</a>
</div>
<div><img src="img/5.png">
<a href="http://www.imooc.com">第四怪 四季服装同穿戴</a>
</div>
<div><img src="img/6.png">
<a href="http://www.imooc.com">第五怪 火车没有汽车快</a>
</div>
<div><img src="img/7.png">
<a href="http://www.imooc.com">第六怪 火车不通国内通国外</a>
</div>
<div><img src="img/8.png">
<a href="http://www.imooc.com">第七怪 老奶爬山比猴快</a>
</div>
<div><img src="img/9.png">
<a href="http://www.imooc.com">第八怪 鞋子后面多一块</a>
</div>
<div><img src="img/10.png">
<a href="http://www.imooc.com">第九怪 脚趾四季漏在外</a>
</div>
<div><img src="img/11.png">
<a href="http://www.imooc.com">第十怪 鸡蛋拴着卖</a>
</div>
<div><img src="img/12.png">
<a href="http://www.imooc.com">第十一怪 粑粑叫饵块</a>
</div>
<div><img src="img/13.png">
<a href="http://www.imooc.com">第十二怪 花生蚕豆数着卖</a>
</div>
</div>
</body>
</html>
index.css
/*All Tag*/
*{
margin: 0;
padding: 0;
border: none;
}
body{
background: #ddd;
}
img{
border: none;
}
a{
text-decoration: none;
color: #444;
}
a:hover{
color: #999;
}
/*Wrap*/
#wrap{
position: relative;
width: auto;
height: auto;
margin: 0 auto;
}
#wrap > div {
float: left;
box-sizing: border-box;
width: 280px;
height: auto;
margin: 10px;
padding: 10px;
border-radius: 5px;
background: #fff;
}
#wrap > div > img {
width: 100%;
}
#wrap > div > a{
display: block;/*行级元素改为块级元素*/
font-size: 18px;
font-weight: bold;
line-height: 40px;
text-align: center;
}
使用js和jq完成定位布局
瀑布流布局
Javascript布局,jQuery布局,布局方式比较
Javascript布局
index.js
function waterfall(wrap, boxes){
//获取屏幕可以显示的列数
var boxWidth = boxes[0].offsetWidth +20;
var windowWidth =document.documentElement.clientWidth;
var colsNumber = Math.floor(windowWidth /boxWidth);
//设置容器的宽度
wrap.style.width = boxWidth * colsNumber +'px';
//定义一个数组并存储每一列的高度
var everyHeight = new Array();
for (var i = 0;i<boxes.length;i++) {
if(i<colsNumber){
everyHeight[i] = boxes[i].offsetHeight + 20;//20为外边距
}else{
var minHeight = Math.min.apply(null,everyHeight);
var minIndex = getIndex(minHeight,everyHeight);
var leftValue = boxes[minIndex].offsetLeft -10; //10px外边距
boxes[i].style.position = 'absolute';
boxes[i].style.top = minHeight +'px';
boxes[i].style.left = leftValue +'px';
everyHeight[minIndex] += boxes[i].offsetHeight+20;
};
}
};
//获取最小列的索引
function getIndex(minHeight, everyHeight){
for(index in everyHeight){
if(everyHeight[index] == minHeight){
return index;
}
}
}
window.onload = function(){
var wrap = document.getElementById('wrap');
var boxes =wrap.getElementsByTagName('div');
waterfall(wrap,boxes);
};
jQuery布局
//jQuery方式
var waterfall = function(wrap,boxes){
//获取屏幕可以显示的列数
var boxWidth = boxes.eq(0).width() +40;
var windowWidth = $(window).width();
var colsNumber = Math.floor(windowWidth /boxWidth);
//设置容器的宽度
wrap.width(boxWidth * colsNumber);
//定义一个数组并存储每一列的高度
var everyHeight = new Array();
for (var i = 0;i<boxes.length;i++) {
if(i < colsNumber){
everyHeight[i] = boxes.eq(i).height() + 40;
}else{
var minHeight = Math.min.apply(null,everyHeight);
var minIndex = getIndex(minHeight,everyHeight);
boxes.eq(i).css({
'position':'absolute',
'top':minHeight,
'left': boxes.eq(minIndex).position().left,
'opacity':'0'
}).stop().animate({
'opacity':'1'
},1000)
everyHeight[minIndex] += boxes.eq(i).height()+40;
};
}
console.log(boxes.eq(minIndex).position().left);
};
//获取最小列的索引
function getIndex(minHeight, everyHeight){
for(index in everyHeight){
if(everyHeight[index] == minHeight){
return index;
}
};
};
$(document).ready(function(event){
var wrap = $('#wrap');
var boxes = $('#wrap').children('div');
waterfall(wrap,boxes);
});
瀑布流追加
追加原理、追加实现、效果优化
//追加盒子函数
var appendBox = function(wrap,boxes){
wrap.append('<div><img src="img/2.png"><a href="http://www.imooc.com">第一怪 竹筒当烟袋</a> </div>')
}
$(document).ready(function(event){
var wrap = $('#wrap');
var boxes = wrap.children('div');
waterfall(wrap,boxes);
$(this).scroll(function(event){
appendBox(wrap,boxes);
});
});
index.js整体代码
//模拟数据
var data = [{
"src": "2.png",
"title": "第一怪 竹筒当烟袋"
},
{
"src": "3.png",
"title": "第二怪 竹筒当烟袋"
},
{
"src": "4.png",
"title": "第三怪 竹筒当烟袋"
},
{
"src": "5.png",
"title": "第四怪 竹筒当烟袋"
},
{
"src": "6.png",
"title": "第五怪 竹筒当烟袋"
},
{
"src": "7.png",
"title": "第六怪 竹筒当烟袋"
},
{
"src": "8.png",
"title": "第七怪 竹筒当烟袋"
},
{
"src": "9.png",
"title": "第八怪 竹筒当烟袋"
},
{
"src": "10.png",
"title": "第九怪 竹筒当烟袋"
},
{
"src": "11.png",
"title": "第十怪 竹筒当烟袋"
},
{
"src": "12.png",
"title": "第十一怪 竹筒当烟袋"
}
];
//jQuery方式
var waterfall = function(wrap, boxes) {
//获取屏幕可以显示的列数
var boxWidth = boxes.eq(0).width() + 40;
var windowWidth = $(window).width();
var colsNumber = Math.floor(windowWidth/boxWidth);
//设置容器的宽度
wrap.width(boxWidth * colsNumber);
//定义一个数组并存储每一列的高度
var everyHeight = new Array();//定义一个数据存储每一列的高度
for(var i = 0; i < boxes.length; i++) {
if(i < colsNumber) {
everyHeight[i] = boxes.eq(i).height() + 40;
} else {
//获取最小列的高度
var minHeight = Math.min.apply(null, everyHeight);
//获取最小列的索引
var minIndex = getIndex(minHeight, everyHeight);
var leftValue = boxes.eq(minIndex).position().left;
//设置盒子样式
setStyle(boxes.eq(i), minHeight, leftValue, i);
//更新最小列的高度
everyHeight[minIndex] += boxes.eq(i).height() + 40;
};
//鼠标经过呈现半透明的交互效果
boxes.eq(i).hover(function(event){
$(this).stop().animate({
'opacity':'0.5'
},500);
},function(event){
$(this).stop().animate({
'opacity':'1'
},1000);
});
}
};
//获取最小列的索引
function getIndex(minHeight, everyHeight) {
for(index in everyHeight) {
if(everyHeight[index] == minHeight) {
return index;
}
};
};
//设置追加盒子的样式
var getStartNumber = 0;
var setStyle = function(box, top, left, index) {
if(getStartNumber >= index) {
return false;
};
box.css({
'position': 'absolute',
'top': top,
'left': left,
'opacity': '0'
}).stop().animate({
'opacity': '1'
}, 1000);
getStartNumber = index;
};
//追加条件:最后一个盒子的top值+其高度<document高度值+滚动条滚动的值
//数据请求检验
var getCheck = function(wrap) {
//获取文档高度
var docunmentHeight = $(window).height();
//获取文档向上滚动的高度
var scrollHeight = $(window).scrollTop();
//获取最后一个盒子所在列的总高度
var boxes =wrap.children('div');
var lastBoxTop = boxes.eq(boxes.length - 1).offset().top;
var lastHeight = boxes.eq(boxes.length - 1).height() + 20;
var lastColHeight = lastBoxTop + lastHeight;
return docunmentHeight + scrollHeight >= lastColHeight ? true : false;
};
//追加盒子函数
var appendBox = function(wrap) {
if(getCheck(wrap)) {
for(i in data) {
var innerString = '<div><img src="img/' + data[i].src + '"><a href="http://www.imooc.com">' + data[i].title + '</a></div>';
wrap.append(innerString);
};
}else{
return false;
};
waterfall(wrap, wrap.children('div'));
}
$(document).ready(function(event) {
//获取容器与盒子
var wrap = $('#wrap');
var boxes = wrap.children('div');
//加载盒子
waterfall(wrap, boxes);
//滚动事件
$(this).scroll(function(event) {
appendBox(wrap, boxes);
});
});
整体代码示例:
链接: https://pan.baidu.com/s/1ghfDKoN 密码: gu24