Ajax平滑翻页+预加载

相信昨晚看过最初版本的PX555已经体验到“平滑翻页+预加载”的魅力所在了吧?

平滑翻页本身对于一页展示的内容来说就很舒服了,很多手机的浏览器前进后退也都采用了这样的过渡效果。对于网页端来说,实现这个平滑也不难,无非就是3个DIV:

 
#essay{width:555px;height:488px;position:relative;overflow:hidden;}
 
#essay-content{width:555000px;height:488px;position:absolute;}
 
#essay-content .postlist{width:555px;float:left;}

 
<div id="essay"><!-- 第一个限高度限宽度,相对定位,超出隐藏; -->
 
	<div id="essay-content"><!-- 第二个限高,宽度设为超大,绝对定位; -->
 
		<div class="postlist"><!-- 第三个限宽,左浮动。 -->
 
			<!-- 文章循环 1 -->
 
		</div>
 
		<div class="postlist">
 
			<!-- 文章循环 2 -->
 
		</div>
 
	</div>
 
</div>
 
<!-- 导航的html代码 -->
 
<div id="pagelist">
 
	<a id="prev">上一页</a>
 
	<a id="nnum">1</a>
 
	<a id="next">下一页</a>
 
</div>

你可以理解为:一大堆车需要通过一个收费站,而收费站长宽与一辆车的长宽相同,我们需要做的就是把这些车挤一挤排出一条长长长长类似一条长纸带的队伍来,如此接下来只需拉动这条纸带,一次距离是一辆车的长~

井然有序,就是我们需要的!

一、最最基础的jQuery点击平滑代码:

 
$('#next').click(function(){  //下一页点击事件
 
	var dnum=parseFloat($('#nnum').text());  //取得当前显示的页码
 
	$('#essay-content').animate({left:'-=555'},{  //纸带向左滑555px
 
		duration:400,
 
		complete:function(){
 
			$('#nnum').text(dnum+1);  //滑完给页码+1
 
		}
 
	});
 
});
 
$('#prev').click(function(){  //上一页点击事件
 
	var dnum=parseFloat($('#nnum').text());
 
	if(dnum>1){  //当前页码大于1才执行,即第一页时不滑动
 
	$('#essay-content').animate({left:'+=555'},{  //纸带向右滑555px
 
		duration:400,
 
		complete:function(){
 
			$('#nnum').text(dnum-1);  //滑完给页码-1
 
		}
 
	});
 
	}
 
});

以上实现的仅是向左滑一次然后向右滑一次的效果,仅是如此当然是不够的,不过没实现此步下面也是无法继续的!

除非你一开始就php输出几百个文章列表,然后用上面代码左滑滑右滑滑,这显然是不妥的。这时就需要用到Ajax预加载~

二、Ajax预加载

基本思路:首页index.php输出2个文章列表,点击下一页平滑出第2页文章列表,同时Ajax预加载第3页文章列表。再点,平滑出预加载进来的第3页,同时Ajax预加载第4页,以此往复……

可真正折腾起来考虑的因素还是相当多的,最大的问题是访客点击事件及间隔是无法预测的,也由此得在代码上做好访客点击的逻辑判断!

比如常见的几个问题:

1.连续快速点击,文章列表滑的欢快,而Ajax预加载速度根本跟不上;因此预加载文章列表不够,得停止点击事件的响应。

2.到头了还是继续点“上一页”,到底了还执着得点“下一页”;因此显示第1页时“上一页”得隐藏,显示最后一页时“下一页”得隐藏。

3.并非连续点“下一页”,而是一会儿上一下一会儿下一页;因此不分青红皂白对所有点击“下一页”都Ajax预加载是不合理的。

…… ……

最新翻页效果无冷已经启用,可一边点击一边看以下代码注释:http://meapo.net/

平滑+预加载的jQuery代码(无过渡效果):

 
var num=1,noclick=false;  //num来记录预加载次数,并设置默认不响应点击
 
$('#next').click(function(){
 
	var dnum=parseFloat($('#nnum').text()),nnum=dnum+2,cnum=num-dnum;
 
	//dnum为当前显示页码,nnum是Ajax预加载的页码,cnum为预加载次数与当前页码之差
 
if(noclick!=true){noclick=true;  //点击响应判断,当Ajax完成后才允许再点击
 
	if(cnum>=0){  //中途点击过上一页,再点下一页时
 
	$('#essay-content').animate({left:'-=555'},{
 
		duration:400,
 
		complete:function(){
 
			$('#nnum').text(dnum+1);
 
			$('#prev:hidden').fadeIn(300);  //如果“上一页”不可见则渐显
 
			noclick=false;  //直接允许响应点击
 
		}
 
	});
 
	}
 
	if(cnum==0){  //预加载次数和当前页数码一样时,才再一次执行Ajax预加载。
 
		if($('.postlist').eq(dnum).children().length<8){  //待滑出的文章列表数小于8时
 
			$('#next').fadeOut(300);  //“下一页”渐隐
 
		}
 
		$.ajax({
 
			url: "?action=ajax_post&pag="+nnum,  //php段配合,获取当前页后2页的文章列表
 
			success:function(a){
 
				if(a.length > 0){  //如果有返回数据时
 
					$('#essay-content').append("<div class='postlist'>"+a+"</div>");  //追加到第二个DIV里
 
					num++;  //预加载次数累加1
 
				}else{  //如果无返回数据时
 
					$('#next').hide(0);  //“下一页”隐藏,主要针对待滑出的文章列表数等于8时做的处理
 
				}
 
				noclick=false;  //允许响应点击
 
			}
 
		});
 
	}
 
}
 
});
 
 
 
$('#prev').click(function(){
 
if(noclick!=true){noclick=true;
 
	var dnum=parseFloat($('#nnum').text());
 
	if(dnum>1){  //当前页码大于1时
 
		$('#essay-content').animate({left:'+=555'},{
 
			duration:400,
 
			complete:function(){
 
				$('#nnum').text(dnum-1);
 
				$('#next:hidden').fadeIn(300);  //如果“下一页”不可见则渐显
 
				noclick=false;
 
			}
 
		});
 
		if(dnum==2){  //页码为2时
 
			$('#prev').fadeOut(300); //“上一页”渐隐
 
		}
 
	}
 
}
 
});

另外,css里还是得设置“上一页”隐藏。

就这些,完了(liáo)!

主机格调
    • 张衡
      四月 15, 2011 19:21:19

      挤下板凳。。。 :mrgreen:

  1. zrqx008
    四月 14, 2011 18:42:18 #4

    无冷那个效果很赞

  2. A.shun
    四月 14, 2011 18:44:18 #5

    效果超赞,前排支持

    • 哈,狂点狂点测试去吧~

  3. 随便给我几十个主题让我改改整站AJAX然后分我一杯羹呐… :idea:

    • 整站Ajax需求还不是很多,SEO也不好~

      • 那得看你怎么用AJAX了.
        举个更不和谐的例子吧,无冷现在的主题,<a id=”next”>下一页</a> 这是它下一页的超链接,如果浏览器没有开启JS怎么办呢?还有就是蜘蛛会怎么爬到第二页呢?
        所以说.事在人为嘛,SEO也就这样一回事,你考虑了就有了,不考虑当然没有喽~

        • 恩,这个得做一个后端判断,也是~

      • 在Firefox下 点击把启用javascript的选项去掉,然后再访问我的博客.你会发现正常翻页正常浏览.这不足以说明对SEO没有影响不?
        我一直只是把AJAX当成用户启用js后的一种可选附件,即使没有了它,网站的功能应该仍然完整.只是为了减少服务器压力,这才是AJAX技术的初衷吧.

          • kita
            四月 15, 2011 14:35:14

            kita想,通過判斷是否開啟js,如果開啟了的話,就加載全新感官的站點,如果沒有開啟的話,就加載一樣可以正常瀏覽的站點,話說html5也可以這樣用的麼 :smile:

        • CXM
          四月 21, 2011 01:16:1

          赞同,能兼顾js的开关同时不失seo优化,此举乃细心认真且需要一定修炼。。。

  4. 。潇
    四月 14, 2011 18:50:18 #8

    :grin: 好东东、耶、

  5. mopvhs
    四月 14, 2011 18:54:18 #9

    :razz: 无冷那边看到了,点起来超顺手~~不过..狂点“上一页”就会出问题~~~

  6. wmtimes
    四月 14, 2011 20:28:20 #10

    的确,效果很不错。

  7. Melody
    四月 14, 2011 20:35:20 #11

    唔,这个效果很华丽~

  8. akasuna
    四月 14, 2011 20:45:20 #12

    顶部菜单也开始得瑟了

  9. 奚少
    四月 14, 2011 21:53:21 #13

    很漂亮的效果~~

    • 必须的,发布不注释的源代码都是耍流氓~

  10. ISayMe
    四月 15, 2011 10:43:10 #15

    偶不懂 俺是来打酱油的 :lol:

  11. 蓝冰
    四月 15, 2011 12:57:12 #16

    seo只是浮云。

  12. TF`
    四月 15, 2011 15:35:15 #17

    赞赞 :grin:

  13. hey33
    四月 15, 2011 16:17:16 #18

    我去无冷哪里点点试一下。。哈哈 不错滴

  14. N
    四月 15, 2011 18:20:18 #19

    两个站点来回切换看代码。。。 :arrow:

  15. no
    四月 15, 2011 21:28:21 #20

    这个效果很酷 不知道折腾起来嘛不麻烦…..只有详细的教程 我才会的 :cry:

    • 没有基础折腾起来肯定麻烦的~懂一点点的话会好一些

  16. 蓝冰
    四月 16, 2011 12:28:12 #22

    您好,
    我是淘宝网的工作人员
    您在淘宝网订购的(安娜新版充气娃娃)已经到达本市,
    我们是给您送到您府上还是给你送到您工作单位?
    我们会绝对保密,
    请相信我们的职业操守,
    据我们这的接线人员说,
    您已经是第四次购买我们的这款产品,
    所以我们会适当给您打折,
    另外您要求我们赠送的美国纯进口春药也已经包在自我安慰器的包装袋里了!
    请您及时收取您定制的产品!
    谢谢!祝您愉快!

    • 蓝X冰,那留言昵称也换一个撒!~

      • 小邪
        四月 21, 2011 00:37:0

        。。。你无敌了 :idea: :idea: :idea: :idea:

      • 小邪
        四月 21, 2011 00:37:0

        汗。。。应该是回蓝冰的 ~ :arrow:

    • 小邪
      四月 21, 2011 00:37:0

      。。。你无敌了 :lol: :lol: :lol:

  17. heson
    四月 16, 2011 17:58:17 #23

    ajax预加载不错···· :twisted:

  18. 无为
    四月 16, 2011 23:56:23 #25

    老早就想要这种效果了,只可惜不会。手机上第一次好像是在天天动听上看到了这种效果,滑动+抖动 切实不错。

  19. Maplews
    四月 17, 2011 00:12:0 #26

    这不错。特别是预加载的东西..

  20. 哈哈,这个效果酷,体验非常棒

    • 任大哥都过来了撒,荣幸荣幸!平滑+预加载必需地撒~~

  21. 很cool。。不过我的主题现在还用不到

  22. 小清
    五月 10, 2011 19:14:19 #30

    这2个文章循环 如何让它 不一样呢?
    第2个循环 加载的是第1个后面的,具体代码能告知下吗?

    我照着教程做了,发现切换到第2页,点上页,回不去第一页了!

    • 这个就是php完成的,查查WordPress官方文档呗~

      • 不自禁
        五月 11, 2011 19:19:19

        木木,我也弄了这个循环弄了好久,想显示最新文章,每个显示5篇,不知道两个postlist里的这个代码怎么填,能给指教下吗?相信很多新手看到你这篇文章都会喜欢这条评论,期望你的指点,非常感谢!

  23. 冒昧的问下 那个”php段函数配合”,那个php段函数该怎么写,不知道是我没看到,还是您没写,是只要那几段js就可以,还是需要像您的那篇 关于ajax加载文章 代码类似的php函数? 希望木木大神指点一下.
    本人用的winy的w1s主题,想用您说的这个方法添加一个类似平常博客的侧栏,显示多点东西.平时隐藏,点击后再显示.

    • 目前php端我就保留了这段代码和完整后台代码段,暂时不想分享……

      • 理解.感谢木木回复. :oops:
        那我再看看philna2中的方法吧. philna2中也有类似的方法,我用js翻页代码中的url来请求,只返回了文章列表部分,头部,侧栏,底部什么的都没有返回数据.
        但是不知道该如何把那个响应函数独立出来.主题作者用了好多define(..) 以及defined(..)的方法,不知道这个是什么意思.

  24. jamoment
    七月 3, 2011 15:04:15 #32

    配置了一下,但是点击“上一页”or“下一页”,页面没反应。请教一下,谢谢!

    • 这个还真得你自己排查咯~

  25. 猫鱼
    二月 21, 2012 01:59:1 #34

    這個我快搞完了,現在只遇到2個問題:
    1,翻頁有點問題,直接點擊next後正常翻頁(內容也正常)但是next就消失了,此時點擊一下prev,回到先前的頁面,再第二次點擊next後,正常翻頁,且下一個去往第三頁的next也顯現了……
    查了半天是在「待滑出的文章列表數小於8時」的判斷,不知為何改成什麼數這個判斷都會起作用,導致next點一下就消失。
    如果將next消失的語句注釋掉的話,倒是可以正常翻頁,但計數會多1,即有5頁就會翻到空白的第6頁才停下(next消失)。
    不知是什麼問題……?我自己查了半天也沒找出來 :arrow:

    2,之前blog就有用這邊的「jQuery首頁文章伸縮」相關代碼,但是套上這個後,第二頁以後的伸縮效果都失效了。由於原本代碼就挺簡單的,我盯著看了好久,都不知道它為啥會失效……@@|||還請木木指點一二

    不管怎樣,先感謝木木講解並分享這段代碼!

    • 猫鱼
      二月 21, 2012 02:09:2

      追加,更神奇的事兒出現了,我本來想不能伸縮就直接點標題進入吧,先把效果裝起來看看——結果注釋掉了伸縮代碼後,next和prev竟然失效了,擦掉注釋,又恢復了…… :eek: :eek: :eek:

    • 猫鱼
      二月 21, 2012 03:13:3

      真不好意思,我又來追加了,折騰半天發現,怎麼第二頁的內容少了,按下一頁直接跳到了page3,怪不得最後有1頁的錯誤,之後發現上面的代碼裏:
      var dnum=parseFloat($(‘#nnum’).text()),nnum=dnum+2,cnum=num-dnum;
      這個dnum應該是+1不是+2,改成+1後頁數就正常了 :smile:
      不過那個下一頁會無故漸隱的問題還是沒解決Q-Q

  26. 博主你好,非常感谢你提供了效果这么棒的代码……可是,我真的搞不定它TAT!!!
    我已经研究了两天了,无数次整理代码,可就是弄不出来,我实在不知道哪里出了问题……有几次看见成功的苗头了,可是后来又不知道为什么按照同样的步骤去做却得不到一样的效果了……

    所以很冒昧的问一句,是否能请你提供一下帮助?我知道折腾这玩意挺费神,所以有偿的我也很愿意,我实在太喜欢这个效果了,而且不把它搞定我简直寝食难安,拜托拜托了T T!!!!

    • kiyoushi
      三月 10, 2012 03:33:3

      追加一下我目前的问题,第二个文章循环我写的代码是

      结果首页显示出来有滑动效果,可滑动后载入在指定区域内显示的是整个首页的页面……而且“下一页”消失,点击“上一页”没反应……

      • 先把功能函数搞定,再效果~

        • 功能函数现在已经搞定了,就是文章循环那里,我试验了一下不加翻页效果的代码,只是让首页加载第二页的文章,是正常显示没有问题的。可是加入翻页的代码,同时写了两个文章循环之后,首页就显示不出来,提示我index.php最后那一行错误。可是那一行是有而已!OTZ

          • 汗,被吞了……最后那一行就是调用页脚的函数而已……没有做任何修改的。只是一加上文章循环二的代码,就会显示调用页脚的那一行错误……

  27. kiyoushi
    三月 12, 2012 01:00:1 #36

    我终于弄出来,搞了三天啊,痛哭流涕!
    果然只要认真观察,还是能弄出来的,答案都是在博主的博客里面找到的!
    再次非常感谢博主分享效果这么帅的代码!

    然后最后两个小疑问
    第一个是和上楼一样,文章页面滑动到第三页的时候,标题展开收起效果消失了,点击标题只能直接进入文章页面
    第二个是我看了一下元素,发现随着翻页,前面加载的文章列表全部会滑到左边去。那是不是意味着,加入我翻到了第十页,那么就一共有十页的内容同时载入到当前首页上呢?这样是正常的吗?汗,关于wordpress实在是小白,如果博主方便的话,请指点指点,谢谢了OTZ

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*


您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">