AJAX實(shí)現(xiàn)瀑布流布局
瀑布流是當(dāng)前一種比較流行的網(wǎng)站界面布局方式,參差不齊的多欄布局以及到達(dá)底部自動(dòng)加載的方式,使網(wǎng)站在視覺和用戶體驗(yàn)上都能得到較大的提升。最早使用此布局的是國(guó)外的圖片網(wǎng)站Pinterest,之后國(guó)內(nèi)的一些圖片網(wǎng)站也開始使用瀑布流布局,包括和Pinterest類似的花瓣網(wǎng)、圖片社區(qū)lofter、美麗說、蘑菇街等等。
瀑布流在布局上對(duì)于大多數(shù)人來說應(yīng)該是很簡(jiǎn)單的,比較只有幾列而已。瀑布流最主要的還是數(shù)據(jù)的異步加載。
首先說一下這次實(shí)例所用的瀑布流式方法。瀑布流布局實(shí)現(xiàn)的方法很多,具體可以自行百度,此處不再贅述。本文中瀑布流實(shí)現(xiàn)方法為四列布局(li*4),每個(gè)圖片為一個(gè)盒子(div>img+p),從后臺(tái)讀取數(shù)據(jù)后賦值給盒子中的元素,判定此時(shí)高度最小的列(li),然后將盒子添加到對(duì)應(yīng)的列(li),之后進(jìn)行下一次判定,以此類推,直至本頁所有數(shù)據(jù)加載完成。
代碼部分:
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部分和實(shí)現(xiàn)部分
/**
*
* @param {Object} method get和post方式
* @param {Object} url 文件路徑
* @param {Object} data 頁碼
* @param {Object} success 成功的函數(shù)
*/
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('出錯(cuò)了,Err:' + xhr.status);
}
}
}
}
ajax部分是在之前所寫的Ajax工作原理以及函數(shù)的簡(jiǎn)單封裝上修改而來,理解那個(gè)之后看這個(gè)基本沒難度。這個(gè)相對(duì)那個(gè)來說多了一個(gè)data參數(shù),data是用來讀取數(shù)據(jù)的頁碼。
window.onload = function() {
//獲取界面節(jié)點(diǎn)
var ul = document.getElementById('ul1');
var li = document.getElementsByTagName('li');
var liLen = li.length;
var page = 1;
var bool = false;
//調(diào)用接口獲取數(shù)據(jù)
loadPage();//首次加載
/**
* 加載頁面的函數(shù)
*/
function loadPage(){
ajax('get', 'getPics.php', 'cpage='+page, function(data) {
//將數(shù)據(jù)庫中獲取的數(shù)據(jù)轉(zhuǎn)換成數(shù)組形式,這里要根據(jù)數(shù)據(jù)庫中的數(shù)據(jù)形式來寫,這里我獲取到的是json形式
var data = JSON.parse(data);
//將數(shù)據(jù)寫入到div中
for(var i = 0; i < data.length; i++) {
var index = getShort(li);//查找最短的li
//創(chuàng)建新的節(jié)點(diǎn):div>img+p
var div = document.createElement('div');
var img = document.createElement('img');
img.src = data[i].preview;//img獲取圖片地址
img.alt = "等著吧..."
//根據(jù)寬高比計(jì)算img的高,為了防止未加載時(shí)高度太低影響最短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獲取圖片標(biāo)題
div.appendChild(p);
//加入到最短的li中
li[index].appendChild(div);
}
bool = true;//加載完成設(shè)置開關(guān),用于后面判斷是否加載下一頁
});
}
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){
//開關(guān)為開,即上一頁加載完成,才能開始加載
if(bool){
bool = false;
page++;
loadPage();
}
}
}
}
/**
* 獲取數(shù)組中高度最小的索引
* @param {Object} li 數(shù)組
*/
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;
}
這部分的功能主要是動(dòng)態(tài)的將生成的div寫入到頁面中,其中包含對(duì)盒子樣式的修改和數(shù)據(jù)的寫入,數(shù)據(jù)通過ajax函數(shù)從服務(wù)器端獲取。
需要注意的是:該實(shí)例的運(yùn)行依賴于服務(wù)器,所以需要在本地搭建一個(gè)簡(jiǎn)單的服務(wù)器,快速搭建可以使用WampService。
下面是我們數(shù)據(jù)來源的php代碼:
<?php
header('Content-type:text/html; charset="utf-8"');
/*
API:
getPics.php
參數(shù)
cpage : 獲取數(shù)據(jù)的頁數(shù)
*/
$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;
?>
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Spring MVC前端與后端5種ajax交互方法【總結(jié)】
下面小編就為大家?guī)硪黄猄pring MVC前端與后端5種ajax交互方法【總結(jié)】。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-03-03
AJax 把拿到的后臺(tái)數(shù)據(jù)在頁面中渲染的實(shí)例
今天小編就為大家分享一篇AJax 把拿到的后臺(tái)數(shù)據(jù)在頁面中渲染的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-08-08
ajax三級(jí)聯(lián)動(dòng)實(shí)現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了ajax三級(jí)聯(lián)動(dòng)的實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
ajax實(shí)現(xiàn)提交時(shí)校驗(yàn)表單方法
這篇文章主要為大家詳細(xì)介紹了ajax實(shí)現(xiàn)提交時(shí)校驗(yàn)表單方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-02-02
分頁技術(shù)原理與實(shí)現(xiàn)之無刷新的Ajax分頁技術(shù)(三)
這篇文章主要介紹了分頁技術(shù)原理與實(shí)現(xiàn)的第三篇:無刷新的Ajax分頁技術(shù),感興趣的小伙伴們可以參考一下2016-06-06
實(shí)例代碼講解ajax實(shí)現(xiàn)的無刷新分頁
這篇文章主要介紹了實(shí)例代碼講解ajax實(shí)現(xiàn)的無刷新分頁的相關(guān)資料,需要的朋友可以參考下2015-12-12
SSH網(wǎng)上商城之使用ajax完成用戶名是否存在異步校驗(yàn)
這篇文章主要介紹了SSH網(wǎng)上商城之使用ajax完成用戶名是否存在異步校驗(yàn)的相關(guān)資料,需要的朋友可以參考下2015-12-12
實(shí)現(xiàn)AJAX異步調(diào)用和局部刷新的基本步驟
AJAX?可以在不重新加載整個(gè)網(wǎng)頁的情況下,與服務(wù)器交換數(shù)據(jù),并且更新部分網(wǎng)頁,下面這篇文章主要給大家介紹了關(guān)于實(shí)現(xiàn)AJAX異步調(diào)用和局部刷新的基本步驟,需要的朋友可以參考下2022-03-03
基于HTML5 Ajax文件上傳進(jìn)度條如何實(shí)現(xiàn)(jquery版本)
本文給大家介紹基于html5 ajax文件上傳進(jìn)度條是如何實(shí)現(xiàn)的,涉及到html5新增加的formdata對(duì)象的使用,對(duì)html5文件上傳進(jìn)度條感興趣的朋友一起學(xué)習(xí)吧2015-11-11
django使用ajax post數(shù)據(jù)出現(xiàn)403錯(cuò)誤如何解決
在django中,使用jquery ajax post數(shù)據(jù),會(huì)出現(xiàn)403的錯(cuò)誤,該如何解決呢?下面由腳本之家小編幫大家解決django使用ajax post數(shù)據(jù)出現(xiàn)403錯(cuò)誤,需要的朋友可以參考下2015-09-09

