您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關(guān)AJAX實現(xiàn)瀑布流布局的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
瀑布流是當(dāng)前一種比較流行的網(wǎng)站界面布局方式,參差不齊的多欄布局以及到達底部自動加載的方式,使網(wǎng)站在視覺和用戶體驗上都能得到較大的提升。最早使用此布局的是國外的圖片網(wǎng)站Pinterest,之后國內(nèi)的一些圖片網(wǎng)站也開始使用瀑布流布局,包括和Pinterest類似的花瓣網(wǎng)、圖片社區(qū)lofter、美麗說、蘑菇街等等。
瀑布流在布局上對于大多數(shù)人來說應(yīng)該是很簡單的,比較只有幾列而已。瀑布流最主要的還是數(shù)據(jù)的異步加載。
首先說一下這次實例所用的瀑布流式方法。瀑布流布局實現(xiàn)的方法很多,具體可以自行百度,此處不再贅述。本文中瀑布流實現(xiàn)方法為四列布局(li*4),每個圖片為一個盒子(div>img+p),從后臺讀取數(shù)據(jù)后賦值給盒子中的元素,判定此時高度最小的列(li),然后將盒子添加到對應(yīng)的列(li),之后進行下一次判定,以此類推,直至本頁所有數(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部分和實現(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('出錯了,Err:' + xhr.status); } } } }
ajax部分是在之前所寫的Ajax工作原理以及函數(shù)的簡單封裝上修改而來,理解那個之后看這個基本沒難度。這個相對那個來說多了一個data參數(shù),data是用來讀取數(shù)據(jù)的頁碼。
window.onload = function() { //獲取界面節(jié)點 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é)點:div>img+p var div = document.createElement('div'); var img = document.createElement('img'); img.src = data[i].preview;//img獲取圖片地址 img.alt = "等著吧..." //根據(jù)寬高比計算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獲取圖片標(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; }
這部分的功能主要是動態(tài)的將生成的div寫入到頁面中,其中包含對盒子樣式的修改和數(shù)據(jù)的寫入,數(shù)據(jù)通過ajax函數(shù)從服務(wù)器端獲取。
需要注意的是:該實例的運行依賴于服務(wù)器,所以需要在本地搭建一個簡單的服務(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; ?>
ajax是一種在無需重新加載整個網(wǎng)頁的情況下,能夠更新部分網(wǎng)頁的技術(shù),可以通過在后臺與服務(wù)器進行少量數(shù)據(jù)交換,使網(wǎng)頁實現(xiàn)異步更新。
感謝各位的閱讀!關(guān)于“AJAX實現(xiàn)瀑布流布局”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。