瀑布流布局的特征:

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数据库安装,配置My.ini文件

    最近在做项目开发时用到了MySql数据库,在看了一些有关MySql的文章后,很快就上手使用了.在使用的过程中还是出现了一些问题,因为使用的是绿色免安装版的MySql所以在配置的时候出现了一些问题,该篇 ...

  2. Javascript 笔记与总结(2-8)对象2

    注意:标签属性与 DOM 对象属性的对应关系,绝大部分 2 者是相同的,例如 imgobj.src 属性对应 <img src=""> 中的 src 属性 例外:< ...

  3. nignx的proxy_cache

    http段配置: #cache configclient_body_buffer_size 512k;proxy_connect_timeout 5;proxy_read_timeout 60;pro ...

  4. 会php不回缓存行吗?多重实现

    1.普遍缓存技术: 数据缓存:这里所说的数据缓存是指数据库查询PHP缓存机制,每次访问页面的时候,都会先检测相应的缓存数据是否存在,如果不存在,就连接数据库,得到数据,并把查询结果序列化后保存到文件中 ...

  5. changing a pointer rather than erasing memory cells

    Computer Science An Overview _J. Glenn Brookshear _11th Edition In a data structure based on a point ...

  6. Deep_learning

    https://en.wikipedia.org/wiki/Deep_learning

  7. mysql和oracle 分页查询(转)

    最近简单的对oracle,mysql,sqlserver2005的数据分页查询作了研究,把各自的查询的语句贴出来供大家学习..... (一). mysql的分页查询 mysql的分页查询是最简单的,借 ...

  8. 初次接触Groovy

    其实我这两年业余时间一直断断续续的在学java,水平还不怎么样,不过起码能参与小项目写写接口了.现在我决定暂时放下大众的java,改学小众的Groovy,只因为我新拿到个offer,对方公司的自动化框 ...

  9. VS小技巧

    1."清理解决方案":在对程序进行分发.上传时时常需要压缩解决方案文件夹,这时如果还嫌文件太大,可以在VS里右键解决方案---清理解决方.完成后,则该解决方案下的所有项目的将所有中 ...

  10. FTS抓包看蓝牙的SDP整个过程

    1.概述   SDP是蓝牙的Service Discovery Protocol,用来发现远程设备能够提供的Service.它只负责发现对方支持的Service,不负责Service的具体实现.   ...