现在类似于pinterest这类的表现效果很火,其实我比较中意的是他的布局效果,而不是那种瀑布流。

虽然我不是特别喜欢这种瀑布流的表现样式,但是还是写了几篇关于无限滚动瀑布流效果的文章,Infinite scroll+Masonry=无限滚动瀑布流infinite-scroll-jquery滚动条(下拉)加载数据插件之类的文章。可能是我表达描述不是很详细清楚,所以好多朋友看了不是很清楚,并发信给我求解释。所以有了今天这篇文章。

其实早在:十几款jquery无限滚动插件这 篇文章中我就提到过这种效果的实现原理。主要是判断滚动条滚动的位置距离底部的距离,如果小于或者等于设置的高度的话,那么就执行ajax加载异步数据到 固定的盒子中。我想大家对于这点是比较清楚的,恐怕对于怎样获取数据有点不甚了了的感觉。OK,下面看痞子的步步解析!

无限滚动第一步,ajax异步加载的条件:

我们都知道,对于一些列表页面的布局结构都是一样的,数据部分是由程序生成的。并且每个页面都有下一页的链接地址。OK完毕,这点这是基本条件(注意红色部分)。

为了给大家做直观的对比,我这里拿出3个页面进行对比分析,其中采用的masonry的效果,关于这个插件我这里不多说,可以看Masonry-jquery插件打造的瀑布流样式效果来对该效果有个简单的认识。这三个页面的结构是一样的,内容是不一样的(我们用不同的图片来区分)。

这三个页面左边都有下一页的链接,链接层次分别是

default.html -> default1.html ->default2.html -> 无

下面是三个页面地址:

http://www.niumowang.org/demo/infinite/default.html
http://www.niumowang.org/demo/infinite/default1.html
http://www.niumowang.org/demo/infinite/default2.html

我们点击每个页面的下一页会看到,页面会打开一个新的页面结构与之前的页面相同,内容不同。最后一个页面default2.html的下一页链接处是空连接,代表后面没有页面了。

无限滚动第二步,ajax异步加载如何进行:

第一步的工作完成后,我们要在上面的下一页链接处做文章。在第一步提供的链接中,我们点击下一页都会打开下一页的链接,并显示内容。但是我们现在要做的就是用ajax异步加载数据到当前页面,实现点击链接不打开新的页面,但是加载这个链接中的数据到本页面。这里当然就用到了ajax了,所幸jquery封装的ajax比较简单,我们很容易实现将其他页面的内容加载到当前页面中。

还是三个结构相同,内容不同的页面:(点击下一页可以看到效果)

http://www.niumowang.org/demo/infinite/ajax.html
http://www.niumowang.org/demo/infinite/ajax1.html
http://www.niumowang.org/demo/infinite/ajax2.html

我们来看具体实现代码部分:

$(".next_page a").click(function() { //首先取得下一页的链接地址 var href = $(this).attr("href"); //判断该链接是否被加载过 startHref = href; //判断下一页的链接地址是否存在 if (href != undefined) { //如果存在的话,用ajax获取数据 $.ajax({ type: "get", url: href, success: function(data) { //将返回的数据进行处理,挑选出class是post的内容块 var $res = $(data).find(".post"); //结合masonry插件,将内容append进ID是content的内容块中 $("#content").append($res).masonry('appended', $res); //newHref获取返回的内容中的下一页的链接地址 var newHref = $(data).find(".next_page a").attr("href"); //判断下一页地址是否存在,如果存在,替换当前页的链接地址。不存在,将当前页链接地址属性href移除,并替换内容为“下一页没有了” if (newHref != undefined) { $(".next_page a").attr("href", newHref); } else { $(".next_page a").html("下一页没有了").removeAttr("href") } } }) } //返回false,使得点击进入新页面失效 return false; })

用文字表达一下这个过程就是:点击链接,异步加载这个链接中的数据后,挑选出符合条件的内容,然后将内容用js加载到这个页面固定的容器中,并且将这个链接的地址替换成新的链接地址。并对如果没有下一页的情况进行处理。

其中找到下一页的链接地址可能情况比较多变一些,比如存在“123456...”这样的链接结构;当然这种情况的话,我们可以采用获取比如 class为current的链接地址,那么下一页的地址就是current后面的一个链接,然后用返回数据将包含所有分页地址的容器替换掉。所谓具体问 题具体分析,这里点到即止。

另外就是masonry将ajax返回的数据进行重新布局的操作了,这个属于masonry的范畴,不做过多解释。关于masonry自己从本站找相关资料。

无限滚动第三步,滚动条控制无限加载:

所谓滚动条控制无限滚动,只不过把点击的效果替换掉。我们通过滚动鼠标滚轮,或者拖动滚动条到底部来实现原来的点击异步加载数据的情况。

如果你要实现的话,该怎么做呢?

是的,我们只需要判断滚动条距离底部的位置就行了。如果到了底部,我们就加载一次数据。
但是还有一个问题,由于我们需要实时获取滚动条的最新位置,而获取滚动条位置不是自动的,我们总不能点击一个按钮获取一次数据吧,或者用setTimeout,每隔一段时间获取一次数据。当然这些都是不可行的。
比较可行的方法就是:我们给(window)窗口绑定一个scroll事件,所谓绑定事件就是监听这个对象,监视它的一举一动。如果window窗口滚动的时候,滚动条到底了,那么我们可以进行我们的小动作异步加载数据进来了。OK,看代码实现。

//首先给窗口绑定事件scroll $(window).bind("scroll",function() { // 然后判断窗口的滚动条是否接近页面底部,这里的20可以自定义 if ($(document).scrollTop() + $(window).height() > $(document).height() - 20) { //我这里偷个懒,没有写ajax的调用,直接触发了链接的click事件。 if($(".next_page a").attr('href') != startHref){ //这里判断当前要加载的链接是否已经加载过 $(".next_page a").trigger("click"); } } })

演示地址:http://www.niumowang.org/demo/infinite/auto_ajax.html

上面代码部分,我没有写ajax的具体调用过程,而是在原基础上触发了链接的点击事件。如果想要看滚动实现的ajax效果的,打开地址:http://www.niumowang.org/demo/infinite/auto_ajax1.html自行查看代码部分。

上面有个数字是20,就是滚动条距离底部还是20像素的时候开始加载。这里是为了实现预先加载效果,不至于当用户滚动到底部的时候,数据还没有加载出来,如果你感觉你的内容较大的话,还可以增加这个值。

无限滚动效果实现原理,总结:

至此一个滚动条实现无限滚动的效果就说完了。做一个最后的总结工作。

可以说目前网上实现无限滚动的效果各有千秋,基于的框架也不尽相同。我写这篇文章的目的是让大家领会一种思路,能明白这种效果是怎么做出来的。

我这种方法的文字原理部分:滚动条滚动后,如果到达底部,或者距离底部一段距离的时候,找到下一页的链接地址,获取这个地址中的数据。然后将返回的数据,采用重新布局添加到固定的容器中。OK,就这么简单。

无限滚动的高级进阶部分:

话说高级进阶也没有多么高级,只不过可能加载数据不是采用这种get或者post,哪怕load页面的方式,而是通过传参,从数据库读取数据。亦或 是增加一些返回数据的特效,比如返回数据后,重新布局的时候增加点动画,或者滚动条增加点平滑滚动效果。不过尔尔,记住一句话:只要去实践,一切技术派都 是纸老虎。

2012.08.30 BUG调整

下面好几个朋友提到了多次加载的问题,由于当初设计的时候没有考虑到加载内容后滚动条变化的问题。所以出现了这个情况。近日有时间解决一下。顺便感谢下面提出问题的几位朋友。
修改方法,主要是定义一个全局变量 var startHref ;
然后next_page触发一次之后,修改此startHref的值,在滚动的时候拿到当前的next_page中链接的值,与startHref进行对比,如果不同的话再执行加载过程。
效果查看:http://www.niumowang.org/demo/infinite/auto_ajax.html

jquery实现无限滚动瀑布流实现原理的更多相关文章

  1. jQuery无限载入瀑布流 【转载】

    转载至 http://wuyuans.com/2013/08/jquery-masonry-infinite-scroll/ jQuery无限载入瀑布流 好久没更新日志了,一来我比较懒,二来最近也比较 ...

  2. Infinite Scroll - jQuery & WP 无限滚动插件

    无限滚动(Infinite Scroll)也称为自动分页.滚动分页和无限分页.常用在图片.文章或其它列表形式的网页中,用来在滚动网页的时候自动加载下一页的内容.Infinite Scroll  这款  ...

  3. 10 个 jQuery 的无限滚动的插件:

    很多社交网站都使用了一些新技术来提高用户体验,而无限滚动的翻页技术就是其中一项,当你页面滑到列表底部时候无需点击就自动加载更多的内容. 下面为你推荐 10 个 jQuery 的无限滚动的插件: 1.  ...

  4. 服务器代理+jQuery.ajax实现图片瀑布流

    服务器代理机制破解浏览器的同源策略 瀑布流功能实现分析 具体实现代码及业务实现分析 一.服务器代理机制破解浏览器同源策略 由于浏览器的同源策略无法请求不同域名下的资源,但是服务器的后台程序并不受同源策 ...

  5. 利用jQuery来扩展一个瀑布流插件

      简单了解jQuery.fn.extend() jQuery.fn.extend()函数用于为jQuery扩展一个或多个实例属性和方法(主要用于扩展方法). (截图来自jQuery文档) 为了更清晰 ...

  6. 在 JQuery Mobile 中实现瀑布流图库布局

    先来看在Windows系统的1080P显示器中显示的效果: 这个整合方式几乎没有现存的实例,是自己总结出来的方法,在此记录下来. 首先访问Masonry官网下载masonry.pkgd.min.js: ...

  7. 用 jQuery Masonry 插件创建瀑布流式的页面(转)

    瀑布流式的页面,最早我是在国外的一个叫 Pinterest 的网站上看到,这个网站爆发,后来国内的很多网站也使用了这种瀑布流方式来展示页面(我不太喜欢瀑布流这个名字). 我们可以使用 jQuery 的 ...

  8. Masonry + Ajax 实现无限刷新瀑布流

    效果就如我的个人站yooao.cc,把我实现的思路分享给大家. Masonry渲染页面如果有图片时需要imagesLoaded辅助,不然有可能会造成布局重叠. 一个大体的思路:前端取得最后一篇文章的i ...

  9. 用 jQuery Masonry 插件创建瀑布流式的页面

    瀑布流式的页面,最早我是在国外的一个叫 Pinterest 的网站上看到,这个网站爆发,后来国内的很多网站也使用了这种瀑布流方式来展示页面(我不太喜欢瀑布流这个名字). 我们可以使用 jQuery 的 ...

随机推荐

  1. Ubuntu下Deb软件包相关安装与卸载

    安装deb软件包 sudo dpkg -i xxx.deb 删除软件包 sudo dpkg -r xxx.deb 连同配置文件一起删除 sudo dpkg -r --purge xxx.deb 查看软 ...

  2. 识别SQL Server 性能杀手

    性能优化的重点在于识别定位问题,预先了解主要的性能杀手,能够更快的定位到问题并将工作集中在可能的原因之上. SQL SERVER性能杀手主要集中在如下几类: 1.1   低质量的索引 低质量的索引通常 ...

  3. mysql PROCEDURE ANALYSE() 用法

    PROCEDURE ANALYSE() 会让 MySQL 帮你去分析你的字段和其实际的数据,并会给你一些有用的建议.只有表中有实际的数据,这些建议才会变得有用,因为要做一些大的决定是需要有数据作为基础 ...

  4. Python 一行命令ftp服务器

    Obligatory Twisted example: twistd -n ftp And probably useful: twistd ftp --help Usage: twistd [opti ...

  5. [CSS3] Understand CSS Selector Specificity

    It is hard to explain css selector specificty, to easy way to understand it is by playing around wit ...

  6. JVM 调优 —— 新生代 Survivor 空间不足

    零. 新生代调优规律 增大新生代空间. Minor GC 频率降低, Minor GC 时间上升. 降低新生代空间, Minor GC 频率上升, Minor GC 时间下降 一. 新生代典型问题 先 ...

  7. 安卓APK瘦身

    之前打包的时候直接就用eclipse或者android studio直接生成签名文件,并没有关心大小问题,近期有人问我有没有对APK进行瘦身.对这方面内容一致没有关注过,今天试用了各种方式把项目签名a ...

  8. stream_context_create()模拟POST/GET

    有时候,我们需要在服务器端模拟 POST/GET 等请求,也就是在 PHP 程序中去实现模拟,该怎么做到呢?或者说,在 PHP 程序里,给你一个数组,如何将这个数组 POST/GET 到另外一个地址呢 ...

  9. ScrollView白边问题

    在Android开发所使用的ScrollView中..兼容比較低的版本号的时候(比方14)会出现难看的白边.这时假设使用的是xml布局文件话设置ScrollView的android:fadingEdg ...

  10. 使用Axis2开发WebService

    一.准备 1.下载Axis2.eclipse插件 axis2-1.6.2-war.zip: http://mirror.bjtu.edu.cn/apache//axis/axis2/java/core ...