首頁 > php教程 > PHP开发 > 主體

AJAX實現瀑布流佈局

高洛峰
發布: 2017-01-03 10:39:03
原創
1243 人瀏覽過

瀑布流是當前一種比較流行的網站介面佈局方式,參差不齊的多欄佈局以及到達底部自動加載的方式,使網站在視覺和用戶體驗上都能得到較大的提升。最早使用此佈局的是國外的圖片網站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(&#39;Microsoft.XMLHTTP&#39;); 
  } 
    
  if (method == &#39;get&#39; && data) { 
    url += &#39;?&#39; + data; 
  } 
    
  xhr.open(method,url,true); 
  if (method == &#39;get&#39;) { 
    xhr.send(); 
  } else { 
    xhr.setRequestHeader(&#39;content-type&#39;, &#39;application/x-www-form-urlencoded&#39;); 
    xhr.send(data); 
  } 
    
  xhr.onreadystatechange = function() { 
      
    if ( xhr.readyState == 4 ) { 
      if ( xhr.status == 200 ) { 
        success && success(xhr.responseText); 
        console.log(xhr.responseText); 
      } else { 
        alert(&#39;出错了,Err:&#39; + xhr.status); 
      } 
    } 
      
  } 
}
登入後複製

 ajax部分是在之前所寫的內容中所寫的簡單原理那個之後看這個基本上沒難度。這個相對那個來說多了一個data參數,data是用來讀取資料的頁碼。

window.onload = function() { 
  //获取界面节点 
  var ul = document.getElementById(&#39;ul1&#39;); 
  var li = document.getElementsByTagName(&#39;li&#39;); 
  var liLen = li.length; 
  var page = 1; 
  var bool = false; 
  //调用接口获取数据 
  loadPage();//首次加载 
  /** 
   * 加载页面的函数 
   */
  function loadPage(){ 
    ajax(&#39;get&#39;, &#39;getPics.php&#39;, &#39;cpage=&#39;+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(&#39;div&#39;); 
        var img = document.createElement(&#39;img&#39;); 
        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(&#39;p&#39;); 
        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(&#39;Content-type:text/html; charset="utf-8"&#39;); 
  
/* 
API: 
  getPics.php 
  
    参数 
    cpage : 获取数据的页数 
*/
$cpage = isset($_GET[&#39;cpage&#39;]) ? $_GET[&#39;cpage&#39;] : 1; 
  
$url = &#39;http://www.wookmark.com/api/json/popular?page=&#39; . $cpage; 
  
$content = file_get_contents($url); 
$content = iconv(&#39;gbk&#39;, &#39;utf-8&#39;, $content); 
  
echo $content; 
  
?>
登入後複製

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持PHP中文網。

更多AJAX實現瀑布流佈局相關文章請關注PHP中文網!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門推薦
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板