最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
当前位置: 首页 - 科技 - 知识百科 - 正文

AJAX实现瀑布流布局

来源:懂视网 责编:小采 时间:2020-11-27 22:51:47
文档

AJAX实现瀑布流布局

AJAX实现瀑布流布局:瀑布流是当前一种比较流行的网站界面布局方式,参差不齐的多栏布局以及到达底部自动加载的方式,使网站在视觉和用户体验上都能得到较大的提升。最早使用此布局的是国外的图片网站Pinterest,之后国内的一些图片网站也开始使用瀑布流布局,包括和Pintere
推荐度:
导读AJAX实现瀑布流布局:瀑布流是当前一种比较流行的网站界面布局方式,参差不齐的多栏布局以及到达底部自动加载的方式,使网站在视觉和用户体验上都能得到较大的提升。最早使用此布局的是国外的图片网站Pinterest,之后国内的一些图片网站也开始使用瀑布流布局,包括和Pintere

瀑布流是当前一种比较流行的网站界面布局方式,参差不齐的多栏布局以及到达底部自动加载的方式,使网站在视觉和用户体验上都能得到较大的提升。最早使用此布局的是国外的图片网站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; 
 
?> 

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文档

AJAX实现瀑布流布局

AJAX实现瀑布流布局:瀑布流是当前一种比较流行的网站界面布局方式,参差不齐的多栏布局以及到达底部自动加载的方式,使网站在视觉和用户体验上都能得到较大的提升。最早使用此布局的是国外的图片网站Pinterest,之后国内的一些图片网站也开始使用瀑布流布局,包括和Pintere
推荐度:
标签: 实现 布局 ajax
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top