文档章节

AJAX实现瀑布流布局

zfx2016
 zfx2016
发布于 2016/10/19 11:42
字数 1160
阅读 12
收藏 0

瀑布流是当前一种比较流行的网站界面布局方式,参差不齐的多栏布局以及到达底部自动加载的方式,使网站在视觉和用户体验上都能得到较大的提升。最早使用此布局的是国外的图片网站Pinterest,之后国内的一些图片网站也开始使用瀑布流布局,包括和Pinterest类似的花瓣网、图片社区lofter、美丽说、蘑菇街等等。

瀑布流在布局上对于大多数人来说应该是很简单的,比较只有几列而已。瀑布流最主要的还是数据的异步加载。

首先说一下这次实例所用的瀑布流式方法。瀑布流布局实现的方法很多,具体可以自行百度,此处不再赘述。本文中瀑布流实现方法为四列布局(li*4),每个图片为一个盒子(div>img+p),从后台读取数据后赋值给盒子中的元素,判定此时高度最小的列(li),然后将盒子添加到对应的列(li),之后进行下一次判定,以此类推,直至本页所有数据加载完成。


代码部分:

html+css

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>瀑布流布局</title>
		<style type="text/css">
			*{
				margin: 0;
				padding: 0;
			}
			ul{
				width: 1200px;
				margin: 0 auto;
			}
			ul li{
				float: left;
				width: 250px;
				list-style: none;
				margin: 20px;
			}
			ul li div{
				width: 250px;
				margin-bottom: 20px;
				padding: 10px;
				box-sizing: border-box;
				border-radius: 5px;
				box-shadow: 2px 2px 10px #919B9C;
			}
			ul li img{
				width: 100%;
				margin-bottom: 10px;
			}
			ul li p{
				font-family: "microsoft yahei";
				font-size: 14px;
			}
		</style>
		<script src="ajax.js" type="text/javascript" charset="utf-8"></script>
		<script src="pubuliu.js" type="text/javascript" charset="utf-8"></script>
	</head>
	<body>
		<ul id="ul1">
			<li></li>
			<li></li>
			<li></li>
			<li></li>
		</ul>
	</body>
</html>


javascript部分:ajax部分和实现部分

/**
 * 
 * @param {Object} method get和post方式
 * @param {Object} url 文件路径
 * @param {Object} data 页码
 * @param {Object} success 成功的函数
 */
function ajax(method, url, data, success) {
	var xhr = null;
	try {
		xhr = new XMLHttpRequest();
	} catch (e) {
		xhr = new ActiveXObject('Microsoft.XMLHTTP');
	}
	
	if (method == 'get' && data) {
		url += '?' + data;
	}
	
	xhr.open(method,url,true);
	if (method == 'get') {
		xhr.send();
	} else {
		xhr.setRequestHeader('content-type', 'application/x-www-form-urlencoded');
		xhr.send(data);
	}
	
	xhr.onreadystatechange = function() {
		
		if ( xhr.readyState == 4 ) {
			if ( xhr.status == 200 ) {
				success && success(xhr.responseText);
				console.log(xhr.responseText);
			} else {
				alert('出错了,Err:' + xhr.status);
			}
		}
		
	}
}
ajax部分是在之前所写的 Ajax工作原理以及函数的简单封装上修改而来,理解那个之后看这个基本没难度。这个相对那个来说多了一个data参数,data是用来读取数据的页码。

window.onload = function() {
	//获取界面节点
	var ul = document.getElementById('ul1');
	var li = document.getElementsByTagName('li');
	var liLen = li.length;
	var page = 1;
	var bool = false;
	//调用接口获取数据
	loadPage();//首次加载
	/**
	 * 加载页面的函数
	 */
	function loadPage(){
		ajax('get', 'getPics.php', 'cpage='+page, function(data) {
			//将数据库中获取的数据转换成数组形式,这里要根据数据库中的数据形式来写,这里我获取到的是json形式
			var data = JSON.parse(data);
			//将数据写入到div中
			for(var i = 0; i < data.length; i++) {
				var index = getShort(li);//查找最短的li
				//创建新的节点:div>img+p
				var div = document.createElement('div');
				var img = document.createElement('img');
				img.src = data[i].preview;//img获取图片地址
				img.alt = "等着吧..."
				//根据宽高比计算img的高,为了防止未加载时高度太低影响最短Li的判断
				img.style.height = data[i].height * (230 / data[i].width) + "px";
				div.appendChild(img);
				var p = document.createElement('p');
				p.innerHTML = data[i].title;//p获取图片标题
				div.appendChild(p);
				//加入到最短的li中
				li[index].appendChild(div);
			}
			bool = true;//加载完成设置开关,用于后面判断是否加载下一页
		});
	}
	
	window.onscroll = function (){
		var index = getShort(li);
		var minLi = li[index];
		var scrollTop = document.documentElement.scrollTop||document.body.scrollTop;
		
		if(minLi.offsetHeight+minLi.offsetTop<scrollTop+document.documentElement.clientHeight){
			//开关为开,即上一页加载完成,才能开始加载
			if(bool){
				bool = false;
				page++;
				loadPage();
			}
		}
	}

}
/**
 * 获取数组中高度最小的索引
 * @param {Object} li 数组
 */
function getShort(li) {
	var index = 0;
	var liHeight = li[index].offsetHeight;
	for(var i = 0; i < li.length; i++) {
		if(li[i].offsetHeight < liHeight) {
			index = i;
			liHeight = li[i].offsetHeight;
		}
	}
	return index;
}

这部分的功能主要是动态的将生成的div写入到页面中,其中包含对盒子样式的修改和数据的写入,数据通过ajax函数从服务器端获取。

需要注意的是:该实例的运行依赖于服务器,所以需要在本地搭建一个简单的服务器,快速搭建可以使用WampService。

下面是我们数据来源的php代码:

<?php
header('Content-type:text/html; charset="utf-8"');

/*
API:
	getPics.php

		参数
		cpage : 获取数据的页数
*/
$cpage = isset($_GET['cpage']) ? $_GET['cpage'] : 1;

$url = 'http://www.wookmark.com/api/json/popular?page=' . $cpage;

$content = file_get_contents($url);
$content = iconv('gbk', 'utf-8', $content);

echo $content;

?>
数据的来源是一个国外的网站服务器,在加载速度上可以会稍慢。正是因为所有的数据都来源与服务器,所以我们必须要在本地搭建服务器。




© 著作权归作者所有

zfx2016
粉丝 1
博文 22
码字总数 14027
作品 0
广州
前端工程师
私信 提问
thinkPHP实现瀑布流的方法

thinkPHP实现瀑布流的方法 文章TAG:thinkphp 瀑布流 过期已备案域名,注册就能用!终身VIP会员,畅享源码下载织梦精美仿站,火热预定中! 本文实例讲述了thinkPHP实现瀑布流的方法。分享给大...

thinkyoung
2015/10/10
0
0
网页瀑布流效果实现的几种方式

前言 like a mountain that is in our path,wo cannot complain that it is there,we simply have to climb it 起由 最近,在搭建个人博客时,其中的Demo展示页面想用瀑布流形式展现,发现现有...

撒网要见鱼
2016/11/13
0
0
响应式布局页面之瀑布流布局浅析

瀑布流式布局(简称瀑布流)最先在网站上应用 Pinterest (貌似是最早使用这种布局的网站了),Mark之,蘑菇街,点点网等页面都采用了这种布局。那么什么是瀑布流呢?瀑布流的好处在哪? 瀑布流...

H_J
2014/03/14
1K
0
瀑布流布局与木桶布局

瀑布流布局 在瀑布流布局中,每一个元素的宽度相同,高度不同,下图中的数字表示图片被添加的顺序,每次添加新的图片时,都将其放在高度最小的一栏,以保证每一栏的高度尽可能相近。 思路 假...

_Dot大师兄
2017/09/20
0
0
Ajax+json+jquery实现无限瀑布流布局

Ajax+json+jquery实现无限瀑布流布局 <!doctype html><html><head><meta charset="utf-8"><title>定宽Jquery+AJAX+JSON瀑布流布局(每行代码都有详细注释)</title><style type="text/css">......

mengmeng1990
2012/08/19
3.7K
0

没有更多内容

加载失败,请刷新页面

加载更多

编程作业20190210900169

1编写一个程序,提示用户输入名和姓,然后以“名,姓”的格式打印出来。 #include <stdio.h>#include <stdlib.h> int main(){ char firstName[20]; char lastName[20]; print......

1李嘉焘1
23分钟前
4
0
补码的优点及原理分析

只讨论整数 1.计算机内部为什么没有减法器? 减法运算本身其实就是加法,如x - y即x +(-y),所以只需要将负数成功表示出来并可以参加加法运算,那加法器就可同时实现“+”和“-”的运算。这...

清自以敬
38分钟前
63
0
Docker 可视化管理 portainer

官网安装指南: https://portainer.readthedocs.io/en/latest/deployment.html docker-compose.yml 位置,下载地址:https://downloads.portainer.io/docker-compose.yml...

Moks角木
今天
5
0
Spring Security 实战干货:必须掌握的一些内置 Filter

1. 前言 上一文我们使用 Spring Security 实现了各种登录聚合的场面。其中我们是通过在 UsernamePasswordAuthenticationFilter 之前一个自定义的过滤器实现的。我怎么知道自定义过滤器要加在...

码农小胖哥
今天
8
0
常见分布式事务解决方案

1 微服务的发展 微服务倡导将复杂的单体应用拆分为若干个功能简单、松耦合的服务,这样可以降低开发难度、增强扩展性、便于敏捷开发。当前被越来越多的开发者推崇,很多互联网行业巨头、开源...

asdf08442a
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部