瀑布流布局的特征:

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. Go项目的目录结构说明

    一.项目目录结构 GoPath    /bin    /pkg    /src project_1      project_2 ...... project_n GoPath : 相当于donet下 ...

  2. 优雅的函数式编程--Clojure概述

    欢迎转载,转载请注明出处,徽沪一郎. 楔子 由于阅读storm源码的原因,头一次接触到Clojure.没有花特别的时间来研究clojure语法,只是在一些特殊的用法时,才查了一下clojure官网的文 ...

  3. HTML5 viewport 标签与 CSS3 background-size 属性 使图片完全适应区域内容

    要使一张图片不论在移动端还是在桌面端都能适应区域内容,可以使用 HTML5 的 viewport 标签结合 CSS3 的 background-size 属性. 适应区域内容是指图片的宽或高的长度满足 ...

  4. Bootstrap页面布局2 - 包含BS文件

    如图所示: bootstrap布局基于HTML5,为了使IE8以下也能使用某些HTML5的标签,必须要引入文件:http://html5shiv.googlecode.com/svn/trunk/ht ...

  5. Locking

    Computer Science An Overview _J. Glenn Brookshear _11th Edition To solve such problems, a DBMS could ...

  6. 发布(高程数据)服务,Service Editor界面无LERC格式选项

    [问题描述]: ArcGIS Server 发布(高程数据)服务,无 LERC格式选项,而官方帮助中发布流程提示需要选择LERC格式. [解决办法]: 需求:发布高程数据,ArcGIS Server版 ...

  7. for循环经典案例

    1.棋盘放粮食棋盘有32个格子,第一个格子放1个芝麻,第二个放2个,第三个放4个,第四个放8个...每个芝麻的重量为0.00001kg,如果要放满整个棋盘,需要多少重量的芝麻. <!DOCTYP ...

  8. mysql查询昨天本周上周上月

    昨天 $yestoday = date("Y-m-d 00:00:00",strtotime('-1day'));$today = date("Y-m-d 00:00:0 ...

  9. Java Web项目调优原则

    1. 根据oracle生成的awr文件排除是否是数据库或者sql问题 2.配置中间件的dump文件路径,gc log文件路径 3.通过 MemoryAnalyzer 分析 dump文件 4.通过exc ...

  10. hibernate多SessionFactory配置

    <bean id="aDataSource" class="org.apache.commons.dbcp.BasicDataSource" destro ...