AJAX实现瀑布流布局

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

?> 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 原生JS实现响应式瀑布流布局

    原生JS实现的瀑布流布局,代码及demo代码地址:https://github.com/leozdgao/responsive_waterfall Demo:http://leozdgao.github.io/demo/responsive_waterfall/ 演示图: 核心代码: responsive_waterfall.js (function() { var Waterfall = function(opts) { var minBoxWidth; Object.defineProper

  • 原生js实现移动端瀑布流式代码示例

    瀑布流布局已成为当今非常普遍的图片展示方式,无论是PC还是手机等移动设备上.最近使用到了"懒加载",现在更新一般,因为平时主要使移动端的开发所以库文件使用的是zepto.js .当然也可以和jQuery 通用. 代码如下: function loadImgLazy(node) { var lazyNode = $('[node-type=imglazy]', node), mobileHeight, lazyOffSetHeight, tempHeight, currentNodeTo

  • 原生ajax瀑布流demo分享(必看篇)

    最近听朋友们说起瀑布流挺多的,自己就去研究下了,一个简单的原生demo,分享给大家... 简单分为三个文档,有详细的注释:img:ajax.php:demo.php 其中img文件夹中放入图片 1.jpg:2.jpg;3.jpg.... ajax.php页面 <?php //模拟从数据库读取数据 $arr = array(); $op = opendir('./img'); //打开目录 //循环读取目录 while (($file = readdir($op)) !== false) { //

  • AJAX实现瀑布流布局

    瀑布流是当前一种比较流行的网站界面布局方式,参差不齐的多栏布局以及到达底部自动加载的方式,使网站在视觉和用户体验上都能得到较大的提升.最早使用此布局的是国外的图片网站Pinterest,之后国内的一些图片网站也开始使用瀑布流布局,包括和Pinterest类似的花瓣网.图片社区lofter.美丽说.蘑菇街等等. 瀑布流在布局上对于大多数人来说应该是很简单的,比较只有几列而已.瀑布流最主要的还是数据的异步加载. 首先说一下这次实例所用的瀑布流式方法.瀑布流布局实现的方法很多,具体可以自行百度,此处不

  • PHP结合Jquery和ajax实现瀑布流特效

    不废话,直接上代码, 前台: <?php $category=$this->getMyVal('category',$_GET); $xiaohuaList=Xiaohua::model()->getXiaohao($category); //打开页面默认显示的数据 ?> <div id="waterfall"> <?php foreach ($xiaohuaList as $xiaohua):?> <?php $q_id=$xia

  • 纯js实现瀑布流布局及ajax动态新增数据

    本文用纯js代码手写一个瀑布流网页效果,初步实现一个基本的瀑布流布局,以及滚动到底部后模拟ajax数据加载新图片功能. 缺点: 1. 程序不是响应式,不能实时调整页面宽度: 2. 程序中当新增ajax模拟数据图片后,是将整个页面的所有图片都重新定位一次. 3. 程序是等所有图片加载完成后再读取图片的尺寸,实际中肯定不能这样做. 4. 实际项目中,应该由后台程序给出图片尺寸值,在js代码中直接使用图片的width属性. 本程序思路: html结构: <body> <div id="

  • jquery实现简单的瀑布流布局

    是开头都会说的原理 瀑布流布局有两种,一种是固定列,一种是非固定列.在此主要记述第一种的实现. 固定列的特征是:无论页面如何缩放,每行的总列数都一致. 一行4列的瀑布流从布局的角度来说,就是4个li标签.通过一定的事件(比如滚动条滚动多少px),然后读取之,再把数据动态地添加到页面中. 添加数据原则,不是根据li索引值来加,而是根据各列中高度最短的的那列动态添加.否则可能导致页面很难看(左右高度不统一). 实例涉及ajax方法.可在服务器环境下运行. 废话不多说了.直接上样式. <ul id=&qu

  • AJAX实现瀑布流触发分页与分页触发瀑布流的方法

    所谓的瀑布流效果就正如轻图床首页效果那样,多个内容相近的栏目紧密排列,尽量使到栏目间的间隙最小(即流体布局),并且随着页面滚动条向下滚动,新的数据会追加至当前页面的尾部直到所有数据加载完毕(滚动触发的 Ajax 翻页). 瀑布流触发分页 这里说一下思路,虽然下面的实例中不能全都用到: 1.当进入屏幕时,判断内容是否为空,如果不为空,开始初始化数据. 2.当往屏幕下拉时,判断数据的最底部与屏幕高度+滚动的高度的大小.如果最底部小于上面两者之和,重新请求接口,即加载数据. 3.当遇到数据超过某个页数

  • js自定义瀑布流布局插件

    瀑布流布局是网页中经常采用的一种布局方式,其布局有如下特点: 瀑布流布局特点: (1)图文元素按列排放 (2)列宽一致,但高度不等 (3)布局过程中将优先向高度最小的列补充数据 以下是自定义的一个jQuery瀑布流插件:jquery.myWaterfull.js (function ($) { $.fn.extend({ myWaterfull: function () { var parentWidth = $(this).width(); //获取每行的宽度 var childItems =

  • 瀑布流布局代码一例

    复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv=&qu

  • 基于jquery实现瀑布流布局

    本文实例为大家介绍了基于jquery实现瀑布流布局的关键代码,分享给大家供大家参考,具体内容如下 效果图: 具体代码: 使用jquery-1.8.3.min.js,waterfall.js代码如下: $( window ).load( function(e){ waterfall(); var dataInt = { 'data': [{ 'src': '1.jpg' },{ 'src': '2.jpg' },{ 'src': '3.jpg' },{ 'src': '4.jpg' }]}; $(

  • JS实现瀑布流布局

    本文实例为大家分享了JS实现瀑布流布局展示的具体代码,供大家参考,具体内容如下 html部分 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>瀑布流布局</title> <script src="wallpoll.js"></script> <link r

  • javascript瀑布流布局实现方法详解

    本文实例讲述了javascript瀑布流布局实现方法.分享给大家供大家参考,具体如下: html结构: <div id="waterfall"> <div class="mod-box"> <div class="mod-img">...</div> </div> <div class="mod-box"> <div class="mod-

随机推荐