ajax学习实例之瀑布流

初学者在某课堂学习ajax的过程中,有做一个瀑布流形式的小实例,为了加深理解知识点,因此把做实例的过程记录下来。

首先要实现的页面的最终样式是这样的:

最终效果图

效果:

1.四列布局,每列等宽;

2.每一列内的每一个包含文字和图片的块的高度是不一样的,由内容确定,因此看起来是交错的;

3.一次加载的页面是有限的,当翻滚到底部时才会继续加载下一页。


现在要求已经明确了,那么开始工作:

一、工具和环境

HBuilder、Google浏览器、wampserver服务器环境、一个php数据文件。


二、页面布局

因为本实例只做瀑布流效果,因此布局比较简单:


最终页面结构

这就是大体页面结构,因为li里的内容会是动态变化的,因此通过javascript来动态添加添加,但是为了方便编写样式,因此先添加一点内容,之后再删除:


添加li的内容


css样式

下图就是初步效果图,可以看到分为四列,高度不一,而后面的单个图片我是通过在li中添加div来实现的,因此整个页面总共就只有四列。看到了效果后,把所有的div删掉,接下来编写JavaScript,通过js来动态生成内容。

初步效果图

三、JS部分

js部分主要需要实现的功能有一下几个部分:

1.动态生成页面结构:其中,用来生成页面结构的所有数据都是有php文件形式的,因此需要用到ajax来获取数据,然后再对数据进行处理,生成页面结构,因为有的div内容不一样,高度不相同,为了防止有的li越来越长,而有的却较短,因此页面中的每一个新的div都会接在最短的li中,这样整个页面就会较为均衡的向下添加内容;

2.实现滚动加载效果:在前面的的基础上通过ajax实现动态加载。

1.生成页面结构

首先,获得页面上的元素

然后获取php文件中的数据,数据格式是这样的

这里通过一个封装好的函数来进行获取:


获取数据函数

因为ajax中get方式和post方式获取数据的方法不同,因此需要进行一些判断处理,另外数据的处理是通过一个函数来进行处理,然后调用ajax函数:

处理数据

ajax函数得到的会是一大串类似JSON格式的字符串,因此通过JSON对象的parse方法把数据转为json对象,这样方便利使用。这里获取到的只是第一页的数据,接下来,就在这个处理函数中生成页面结构:

生成页面架构

这部分代码就写在上文的后面,其中还用到了一个函数getShort(),用来获取最短的li的索引,这样整个页面结构就生成了:

效果图

因为数据源的原因,有些图片展示不出来。现在页面结构生成了,现在还有一个需求,就是在页面翻滚到底部时,继续加载下一页。

2.翻滚加载更多数据

当页面翻滚到底部时需要加载更多数据只需要在调用一遍ajax函数即可,但是由于ajax函数内部的数据处理函数还包含着更多内容,因此在外部用一个函数进行封装,方便调用:

现在加载的知识第一页数据,要想页面翻滚到底部时加载新的页面,不能把页数写死,因此,创建一个新变量,来改变加载的页数:

用鼠标滚轮事件来调用函数,原理就是当最短li的底部出现在可视区内以后,说明滚动到底了,这里需要用到getTop()函数;然后调用getList()函数,改变页数;另外,为了防止一次就把后续的页面全部加载出来,导致加载缓慢,设置一次只加载一页,在ajax函数的末尾,也需要设置一下b的值:


最后程序编写完了,还有一些页面布局的优化就没有做了,因为以前很少有记录过,内容写的的有点混乱。最后附上完整的js代码:

```

window.onload = function(){

var oUl = document.getElementById('ul');

var aLi = oUl.getElementsByTagName('li');

var iLen = aLi.length;

var b = true;

var iPage = 1;

getList();

//当鼠标往下翻滚到底时继续加载

window.onscroll = function(){

var _index = getShort();

var oLi = aLi[_index];

var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;

if(getTop(oLi) + oLi.offsetHeight < document.documentElement.clientHeight + scrollTop){

//当最短的li底部出现在可视区时加载下一页

if(b){//一次只能加载一页

b=false;

iPage++;

getList()

}

}

}

function getList(){

//初始化数据处理

ajax('get','getPics.php','cpage='+iPage,function(data){//数据处理并生成文档结构函数

//把获取到的字符串解析成对象;

var data = JSON.parse(data);

//根据数据生成文档结构

for(var i=0;i

//获取高度最短的li的索引

var _index = getShort();

var oDiv = document.createElement('div');//创建div节点

var oImg = document.createElement('img');//创建img节点

oImg.src = data[i].preview;//把请求的数据中的preview值赋给img的src属性

oImg.style.width = '240px';//设置img的宽度

oImg.style.height = data[i].height*(240/data[i].width) + 'px';//设置img的高度

oDiv.appendChild(oImg);//把img节点添加至div节点内

var oP = document.createElement('p');//创建p节点

oP.innerHTML = data[i].title;//把解析的对象数据中的title值作为节点的内容

oDiv.appendChild(oP);//把p节点添加至div节点内

aLi[_index].appendChild(oDiv);//把div节点添加至高度最短的li节点内

/*

图片加载延迟会造成高度误差,所以需要提前获得高度,防止偏差

* */

}

b = true;

})

}

//获取高度最短li的索引的函数

function getShort(){

var index = 0;

var ih = aLi[index].offsetHeight;//获得第0个li的高度

for(var i=0;i

if(aLi[i].offsetHeight < ih){

index = i;

ih = aLi[i].offsetHeight;

}

}

return index;//返回高度最短li的索引;

}

function getTop(obj){

var iTop = 0;

while(obj){

iTop += obj.offsetTop;

obj = obj.offsetParent;

}

return iTop;

}

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.send('content-type','application/x-www-form-urlencoded');

}

xhr.onreadystatechange = function(){

if(xhr.readyState == 4){

if(xhr.status == 200){//得到想要的数据

success && success(xhr.responseText);//数据处理函数

}else{

console.log("出错了,Err:"+ xhr.status)

}

}

}

}

}


```

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容

  • 1.JQuery 基础 改变web开发人员创造搞交互性界面的方式。设计者无需花费时间纠缠JS复杂的高级特性。 1....
    LaBaby_阅读 1,167评论 0 1
  • 1.JQuery 基础 改变web开发人员创造搞交互性界面的方式。设计者无需花费时间纠缠JS复杂的高级特性。 1....
    LaBaby_阅读 1,330评论 0 2
  • 第一章 入门 基本功能:访问和操作 dom 元素,控制页面样式,对页面的事件处理,与ajax完美结合,有丰富的插件...
    X_Arts阅读 1,034评论 0 2
  • <a name='html'>HTML</a> Doctype作用?标准模式与兼容模式各有什么区别? (1)、<...
    clark124阅读 3,462评论 1 19
  • 一样的落叶不一样的秋 一样的秋不一样的愁思 一样的愁思不一样的人 一样的人不一样的思念 一样的思念不一样的情 一样...
    山顶高佬丶阅读 235评论 0 1