瀑布流布局的特征:

1,各列的高度参差不齐

2,页面向下滚动时,自动请求和加载新数据

目前,瀑布流布局的主流实现方式有两种:

1,基于浮动,每一列是一个ul,这些ul都向左浮动,这种方法的好处是布局容易,加载较为复杂;

2,基于绝对定位,只有一个ul,所有item都加入该ul中,ul相对定位,item绝对定位,所有图片的宽度已知,所有图片的高度信息使用一个数组记录所有图片的高度(即offsetHeight信息)。

一、基于浮动的瀑布流布局

基于浮动瀑布流布局的html页面

<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<title>瀑布流布局</title>
</head>
<style>
*{margin:;padding:;}
ul>li{list-style: none}
#div1{width:750px;margin:20px auto;overflow: hidden;}
ul{width:237px;margin:5px;float:left;}
</style>
<body>
<div id="div1">
<ul>
<li>
<img src="./images/feed/1.jpg" alt="">
<p></p>
</li>
<li>
<img src="./images/feed/2.jpg" alt="">
<p></p>
</li>
<li>
<img src="./images/feed/2.jpg" alt="">
<p></p>
</li>
</ul>
<ul>
<li>
<img src="./images/feed/2.jpg" alt="">
<p></p>
</li>
<li>
<img src="./images/feed/3.jpg" alt="">
<p></p>
</li>
<li>
<img src="./images/feed/3.jpg" alt="">
<p></p>
</li>
</ul>
<ul>
<li>
<img src="./images/feed/3.jpg" alt="">
<p></p>
</li>
<li>
<img src="./images/feed/1.jpg" alt="">
<p></p>
</li>
<li>
<img src="./images/feed/1.jpg" alt="">
<p></p>
</li>
</ul>
</div>
<script src="./js/jquery-2.1.4.min.js"></script>
<script src="./js/feed.js"></script>
</body> </html>

基于浮动的瀑布流布局html代码

基于浮动瀑布流布局的js代码

//获取元素相对于屏幕的距离
function getTop(obj) {
var top = ;
while (obj) {
top += obj.offsetTop;
obj = obj.offsetParent;
}
return top;
} document.addEventListener('DOMContentLoaded', function() {
var aUls = document.getElementsByTagName('ul');
var flag = true;
//添加数据
function addNext(uls, jsonObj) {
if (jsonObj['code']) {
//说明jsonObj['code']等于0,数据发送完毕,没有更新的数据
flag = true;
}
console.log(flag);
var realData = jsonObj['list'];
for (var i = ; i < realData.length; i++) {
var curData = realData[i];
for (var j = ; j < curData['src'].length; j++) {
var oLi = document.createElement('li');
oLi.innerHTML = '<img src="' + curData['src'][j] + '"><p>' + curData['title'][j] + '</p>';
uls[i].appendChild(oLi); }
}
}
window.addEventListener('scroll', function() {
//可视区域(视口)的高度 var viewHeight = document.documentElement.clientHeight;
//滚动条滚动的高度(隐藏在上方的高度)
var scrollY = document.documentElement.scrollTop || document.body.scrollTop;
for (var i = ; i < aUls.length; i++) {
var aLi = aUls[i].getElementsByTagName('li');
var lastLi = aLi[aLi.length - ];
//判断最后一个是否进入可视区
if (getTop(lastLi) < viewHeight + scrollY && flag) {
//将flag置为false,否则有几个ul,就会连续触发几次
flag = false;
//发送ajax请求
//理论上应当发送ajax请求,这里省略,直接赋予数值
// $.ajax({
// });
var data = {
code: ,
list: [{
src: ['./images/feed/3.jpg', './images/feed/2.jpg', './images/feed/2.jpg'],
title: ['', '', '']
}, {
src: ['./images/feed/1.jpg', './images/feed/2.jpg', './images/feed/3.jpg'],
title: ['', '', '']
}, {
src: ['./images/feed/2.jpg', './images/feed/1.jpg', './images/feed/1.jpg'],
title: ['', '', '']
}]
};
addNext(aUls, data);
}
}
}, false);
}, false);

基于浮动的瀑布流布局js代码

核心思想

监听window的scroll函数,将最后一个列表项的top值和(滚动隐藏高度+视口高度)相比较,判断加载时机

二、基于决定定位的瀑布流布局

基于浮动瀑布流布局的html页面

<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<title>基于绝对定位的瀑布流布局</title>
<style>
* {
margin: ;
padding: ;
}
ul>li {
list-style: none;
}
.div1 {
margin: 20px auto;
width: 730px;
position: relative;
}
li{
position:absolute;
}
</style>
</head> <body>
<div class="div1">
<ul>
<li>
<img src="./images/feed/1.jpg" alt="">
<p></p>
</li>
<li>
<img src="./images/feed/3.jpg" alt="">
<p></p>
</li>
<li>
<img src="./images/feed/2.jpg" alt="">
<p></p>
</li>
<li>
<img src="./images/feed/2.jpg" alt="">
<p></p>
</li>
<li>
<img src="./images/feed/1.jpg" alt="">
<p></p>
</li>
<li>
<img src="./images/feed/1.jpg" alt="">
<p></p>
</li>
<li>
<img src="./images/feed/3.jpg" alt="">
<p></p>
</li>
<li>
<img src="./images/feed/1.jpg" alt="">
<p></p>
</li>
<li>
<img src="./images/feed/2.jpg" alt="">
<p></p>
</li>
</ul>
</div>
<script src="./js/jquery-2.1.4.min.js"></script>
<script src="./js/jquery-2.1.4.min.js"></script>
<script src="./js/feed2.js"></script>
</body> </html>

基于绝对行为的瀑布流布局

基于浮动瀑布流布局的js代码

//获取元素相对于屏幕的距离
function getTop(obj) {
var top = ;
while (obj) {
top += obj.offsetTop;
obj = obj.offsetParent;
}
return top;
}
var aHeight = {
L: [],
C: [],
R: []
}; function refreshUl(aLis) {
for (var i = ; i < aLis.length; i++) {
var tmp = i % ;
switch (tmp) {
case :
aLis[i].style.left = "5px";
aHeight['L'].push(aLis[i].offsetHeight);
var step = Math.floor(i / );
var curHeight = ;
for (var k = ; k < step; k++) {
curHeight += aHeight['L'][k] + ;
}
aLis[i].style.top = curHeight + 'px';
break;
case :
aLis[i].style.left = "247px";
aHeight['C'].push(aLis[i].offsetHeight);
var step = Math.floor(i / );
var curHeight = ;
for (var k = ; k < step; k++) {
curHeight += aHeight['C'][k] + ;
}
aLis[i].style.top = curHeight + 'px';
break;
case :
aLis[i].style.left = "489px";
aHeight['R'].push(aLis[i].offsetHeight);
var step = Math.floor(i / );
var curHeight = ;
for (var k = ; k < step; k++) {
curHeight += aHeight['R'][k] + ;
}
aLis[i].style.top = curHeight + 'px';
break;
}
}
}
$(function() {
var oUl = document.getElementsByTagName('ul')[];
var aLis = oUl.getElementsByTagName('li');
//使用数组记录每个元素的高度
console.log('li个数:'+aLis.length);
var flag = true;
refreshUl(aLis); //下滑加载部分的代码
window.addEventListener('scroll', function() {
var aLis = oUl.getElementsByTagName('li');
var lastLi = aLis[aLis.length - ];
var viewHeight = document.documentElement.clientHeight || document.body.clientHeight;
var scrollY = document.documentElement.scrollTop || document.body.scrollTop;
if (getTop(lastLi) < viewHeight + scrollY &&flag) {
var data = {
'code': ,
'liData': {
'src': ['./images/feed/1.jpg', './images/feed/1.jpg', './images/feed/1.jpg'],
'title': ['', '', '']
}
} if (data['code'] == ) {
//说明已经没有更多数据
flag = false;
}
var srcData = data['liData']['src'];
var titleData = data['liData']['title'];
for (var i = ; i < srcData.length; i++) {
var curLi = document.createElement('li');
curLi.innerHTML = '<img src="' + srcData[i] + '"><p>' + titleData[i] + '</p>';
oUl.appendChild(curLi);
}
aLis = oUl.getElementsByTagName('li');
console.log('aLis个数2:'+aLis.length);
refreshUl(aLis);
}
}, false); });

基于绝对定位的瀑布流的js代码

javascript实例学习之五——瀑布流布局的更多相关文章

  1. JavaScript——基本的瀑布流布局及ajax动态新增数据

    本文用纯js代码手写一个瀑布流网页效果,初步实现一个基本的瀑布流布局,以及滚动到底部后模拟ajax数据加载新图片功能. 缺点: 1. 程序不是响应式,不能实时调整页面宽度: 2. 程序中当新增ajax ...

  2. 页面瀑布流布局的实现 javascript+css

    先看所谓的瀑布流布局 在不使用瀑布流布局的情况下,当页面要显示不同高度的图片时,会如下面显示 下面的元素总是和最靠近它的元素对齐. 为了使元素能够在我们想要的位置上显示,我们使用绝对定位. 说一下大体 ...

  3. CSS3学习总结——实现瀑布流布局与无限加载图片相册

    首先给大家看一下瀑布流布局与无限加载图片相册效果图: 一.pic1.html页面代码如下: <!DOCTYPE html> <html> <head> <me ...

  4. jQuery Wookmark Load 瀑布流布局实例演示

    瀑布流布局非常适合大量图片的展示,一改过去裁剪图片尺寸统一的排版,每张图片都能完全展示,并错落有致,让人眼前一亮. 版本: jQuery v1.4.3+ jQuery Wookmark Load v1 ...

  5. JS 瀑布流布局

    瀑布流布局 HTML <!DOCTYPE html> <html> <head> <meta charset="utf-8"> &l ...

  6. JavaScript:实现瀑布流

    一.前言: 瀑布流现在是一个非常常用的布局方式了,尤其在购物平台上,例如蘑菇街,淘宝等等. 二.流程: 1.在html文件中写出布局的元素内容: 2.在css文件中整体对每一个必要的元素进行样式和浮动 ...

  7. jQuery Wookmark 瀑布流布局

    瀑布流布局非常适合大量图片的展示,一改过去裁剪图片尺寸统一的排版,每张图片都能完全展示,并错落有致,让人眼前一亮. 版本: jQuery v1.4.3+ jQuery Wookmark Load v1 ...

  8. 纯js实现瀑布流布局及ajax动态新增数据

    本文用纯js代码手写一个瀑布流网页效果,初步实现一个基本的瀑布流布局,以及滚动到底部后模拟ajax数据加载新图片功能. 缺点: 1. 程序不是响应式,不能实时调整页面宽度: 2. 程序中当新增ajax ...

  9. Jquery瀑布流布局

    瀑布流布局最近真的很流行,很多人都跟我一样想知道是怎么做出来的吧,经过网上搜索大量的参考结合N边的实验今天终于被我写出来了,为了便于大家理解我使用了jQuery(当然用源生js代码执行的效率会高一些, ...

随机推荐

  1. MySQL助理配置

    基本配置 你需要经常察看以下3个配置项.不然,可能很快就会出问题. innodb_buffer_pool_size:这是你安装完InnoDB后第一个应该设置的选项.缓冲池是数据和索引缓存的地方:这个值 ...

  2. PHP下利用PHPMailer配合QQ邮箱下的域名邮箱发送邮件(转)

    首先确定不是开启socks openssl phpinfo就可以知道 下载phpmailer   地址:https://github.com/PHPMailer/PHPMailer 下载完整, 个人和 ...

  3. Nvidia Anisotropic Lighting

    http://http.download.nvidia.com/developer/SDK/Individual_Samples/DEMOS/Direct3D9/HLSL_Aniso.zip Anis ...

  4. intervention/image intervention/imagecache

    http://image.intervention.io/ 安装两个包 composer require intervention/image composer require interventio ...

  5. max_allowed_packet

    http://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#function_in SELECT val1 FROM tbl1 W ...

  6. cursor:pointer

    .cursor_hand{ cursor:pointer; }

  7. ubuntu12.04 安装 php5.4/php5.5

    1:修改源(我使用163的源)直接修改/etc/apt/sources.list deb http://mirrors.163.com/ubuntu/ precise main universe re ...

  8. In App Purchase

    参考文章1,参考文章2,参考文章3, 参考文章3 一.Product 分类:      Consumables: 应该在应用里被消费掉的.(Coupon, 生命数)      Non-Consumab ...

  9. ThreadPoolExecutor 分析

    一.从用法入手 Creates a thread pool that creates new threads as needed, but will reuse previously construc ...

  10. alibaba的FastJson(高性能JSON开发包)

    这是关于FastJson的一个使用Demo,在Java环境下验证的 class User{ private int id; private String name; public int getId( ...