AJAX实现瀑布流布局_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; 

?> 

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索ajax
瀑布流
瀑布流布局实现、纯css实现瀑布流布局、css实现瀑布流布局、浮动实现瀑布流布局、瀑布流布局实现原理,以便于您获取更多的相关知识。

时间: 2024-09-23 05:51:39

AJAX实现瀑布流布局_AJAX相关的相关文章

AJAX实现瀑布流布局

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

Ajax上传图片的本质_AJAX相关

1.图片上传到服务器. 2.后台将图片地址传到html页面,以图片形式展现. 3.后天将图片地址加入到input表单中,表单处于隐藏状态. 4.前端删除图片,通过js操作,移除图片与表单数据. 5.图片上传表单,是单独的.不能嵌套在总的表单中. 6.牛逼的图片上传,可以对图片进行处理.压缩,加水印等. 7.点击btn,触发图片点击,图片改变之后,触发图片表单提交. 点击按钮 <div id="up_status" style="display:none">

浅析JSONP之解决ajax跨域问题_AJAX相关

JSON和JSONP JSONP和JSON好像啊,他们之间有什么联系吗? JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.对于JSON大家应该是很了解了吧,不是很清楚的朋友可以去json.org上了解下,简单易懂. JSONP是JSON with Padding的略称.它是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问(这仅仅是JSONP简单的实现形式). JSO

Django框架如何使用ajax的post方法_AJAX相关

Django是一个开放源代码的Web应用框架,由Python写成.采用了MVC的软件设计模式,即模型M,视图V和控制器C.它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理系统)软件.并于2005年7月在BSD许可证下发布.这套框架是以比利时的吉普赛爵士吉他手Django Reinhardt来命名的. 今天在尝试调用jQuery的ajax时发现一个问题,就是使用GET方法服务器可以正常返回,但是使用POST方法却不行.后来再测试表单方式的POST的方法也

基于firefox实现ajax图片上传_AJAX相关

图片文件上传,有很多种协议的,这次主要讲的是"Content-Type:multipart/form-data;"的形式. 在工作中前台一些静态文件是通过FTL模版系统,前台页面通过SSI进行引用的,项目开发的时候就需要生成大量的静态SHTML文件了,本来觉得应该是后台的事情,可是自从我进这公司,这快东西就交给了前端~~我表示无语,没办法就按着习惯来吧,但我是个懒人,就想着能不能通过ajax提交呢 基于平时对MDN的翻阅,今天主要是FormData这个对象解决多文件上传的协议. htt

原生AJAX写法实例分析_AJAX相关

本文实例分析了原生AJAX写法.分享给大家供大家参考.具体分析如下: 虽然现在很多JS的框架提供了AJAX的调用方法,我们甚至不用去了解其具体的实现原理就可以直接调用了,但是我认为不去从最基础的层面了解一个东西,就很难做到最好. var XHR=null; if (window.XMLHttpRequest) { // 非IE内核 XHR = new XMLHttpRequest(); } else if (window.ActiveXObject) { // IE内核,这里早期IE的版本写法不

Ajax 框架学习笔记_AJAX相关

一.XMLHttpRequest 对象的三个重要的属性. onreadystatechange 属性 onreadystatechange 属性存有处理服务器响应的函数.下面的代码定义一个空的函数,可同时对 onreadystatechange 属性进行设置: xmlHttp.onreadystatechange=function() {   // 我们需要在这里写一些代码   } readyState 属性 readyState 属性存有服务器响应的状态信息.每当 readyState 改变时

js与jQuery终止正在发送的ajax请求的方法_AJAX相关

本文实例讲述了js与jQuery终止正在发送的ajax请求的方法.分享给大家供大家参考,具体如下: 核心:调用XMLHttpRequest对象上的abort方法 jquery的ajax方法有自己的超时时间设置参数: $.ajax({type:'POST', url:'b.php', data:'', timeout:5000, success:function(){ } }) 同时 1. $.get返回的数据类型是XMLHttpRequest,请参考手册.($.post.$.ajax.$.get

AJAX技术基础介绍_AJAX相关

基于XML的异步JavaScript,简称AJAX,是当前Web创新(称为Web2.0)中的一个王冠.感谢组成AJAX的各种技术,Web应用的交互如Flickr, Backpack和Google在这方面已经有质的飞跃.这个术语源自描述从基于网页的Web应用到基于数据的应用的转换.在基于数据的应用中,用户需求的数据如联系人列表,可以从独立于实际网页的服务端取得并且可以被动态地写入网页中,给缓慢的Web应用体验着色使之像桌面应用一样. 虽然大部分开发人员在过去使用过XMLHttp或者使用Iframe