jQuery瀑布流无限拖三大利器:masonry+imagesloaded+infinitescroll
瀑布流已经是几乎过时的技术了,不过对于很多想要快速实现它的朋友而言,却绝非易事,因为即使我们已经有很多现成的代码,却发现在自己的开发环境中无法快速得到自己想要的结果。就像我们现在要介绍的三大利器(masonry+imagesloaded+infinitescroll)即使它们是如此有效,却在马上要使用的时候让我们拿着如烫手山芋班很难真正达到我们想要的效果。
下面,我们从其原理来讲解它们的使用,以帮助你更好的发挥它的功效。但为了快速实现,我们不讲解它们的全部内容。
1. 合理的HTML布局是问题的基本 ↑
在一些案例中,由于HTML布局的差错(特别是在WordPress中),导致无限拖的失败。我们来看看比较合理的HTML结构
<div id="container">
<div class="item">...</div>
<div class="item w2">...</div>
<div class="item">...</div>
...
</div>
<div id="page-navi">...</div>
注意:上面的#container和#page-navi被分开,#container的任务就包含瀑布流列表,翻页的工作交给#page-navi来完成。
不少案例中,#container内的结构不规律,有一些杂项,甚至把#page-navi也放在里面,这是导致后面处理中出错的根源。
2. 存在图片时masonry+imagesloaded搭配使用 ↑
在一些案例里面小白按照官网上给出的代码进行布局,结构发现图片重叠在了一起,于是小白慌张了,觉得是不是插件冲突啊,不可能官方代码也存在问题吧!是的,官方代码存在问题,因为小白没有读完官方的介绍,单纯看一小段代码就会有这个问题。
在图片出现在.item中时,我们必须等到图片加载完成再来执行masonry,否则masonry会按照图片还没加载的高度来给.item赋予高度,这结果可想而知,就是错乱感。
而使用imagesloaded则可以避免这种情况,imagesloaded会检查#container中的图片是否加载完成,只有当图片都加载完了,才会执行回调中的代码。所以,如果小白要想在存在图片的时候实现瀑布流,就必须等到图片加载完了再来使用masonry。当然,有些人不用imagesloaded,他们牛皮哄哄的使用window.load,但是这样的话会等很久很久,假如网速慢,图片加载了半天没有加载完,瀑布流就永远不会出来。所以,我在使用代码的时候都是这样使用的:
$('#container').imagesLoaded( function() {
new Masonry( document.getElementById('container'),{itemSelector:'.item'} );
});
这种用法非常奇怪,官方说你可以用jQuery的方法啦,可以用$('#container').masonry({itemSelector:'.item'});就可以啦但是你要这样思考,jQuery的$()是即时获取,一个node加载好就马上获取的,这可不是什么好事,就像ready和load一样有的时候ready好了,但是还没有load,这就是图片的情况!图片ready就是加载一个<img>标签,秒秒钟的事,但是要load却要花大把的时间和流量才行。
而如果你的列表中全部都是文字,那么就不用考虑这些了,因为文字真的就是ready可以完成的事。
3.让infinitescroll执行完,获得加载完的节点 ↑
小白在使用infinitescroll的时候着急的很,希望马上就能无限拖了,但是有一个非常严肃的问题就是,你必须等到要加载的所有的内容都加载还了,甚至加载过来的图片也已经搞定了,才开始行动。就像上面那段代码一样,如果你加载过来了一堆图片,但是图片还没有load,仅仅是ready好了,你就开始执行masonry,那么重新加载masonry就会因为从后面一页抓取的图片还没有load,而无法确定.item的高度,最后有可能让这些新加载的.item跑到#container的顶部。我想这个情况绝大部分的小白都遇到过。
如果你深刻理解了这里,你就会觉得上面那段短短的,看上去奇怪的代码,是多么精妙。
把它放在infinitescroll的执行完回调函数中。
$('#container').infinitescroll({
navSelector : '#page-navi',
nextSelector : '#page-navi a.next',
itemSelector : '#container .item'
// .. 省去了其他参数
},function(arrayOfNewElems){
$(arrayOfNewElems).appendTo('#container');
$('#container').imagesLoaded( function() {
new Masonry( document.getElementById('container'),{itemSelector:'.item'} );
});
// .. 省去了其他动作
});
这样的一个逻辑就非常清晰了。
当然了,在infinitescroll中还有一个this比较难把握。我们虽然获得了arrayOfNewElems,但是没有获取整个DOM。官方提示这个时候this就是获取的整个DOM,但又马上提示1.5版本之后this仅仅是获取的DOM中的#container,让人有些纳闷。
官方地址:infinitescroll?masonry imagesloaded
jQuery瀑布流无限拖三大利器:masonry+imagesloaded+infinitescroll的更多相关文章
- jQuery瀑布流+无限加载图片
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 8款实用的Jquery瀑布流插件
1.网友Null分享Jquery响应式瀑布流布局插件 首先非常感谢网友Null的无私分享,此作品是一款响应式瀑布流布局Jquery插件,网友Null增加了一个屏幕自适应和响应式,响应式就是支持智能手机 ...
- jQuery瀑布流从不同方向加载3种效果演示
很实用的一款插件jQuery瀑布流从不同方向加载3种效果演示在线预览 下载地址 实例代码 <section class="grid-wrap"> <ul clas ...
- jquery瀑布流排列样式代码
<!DOCTYPE html><html><head lang="en"> <meta charset="gb2312" ...
- 瀑布流无限加载infinitescroll插件与masonry插件使用
masonry官网地址http://masonry.desandro.com/,infinitescroll官网地址http://www.infinite-scroll.com/ 无限滚动原理:无限滚 ...
- jQuery瀑布流插件masonry
项目要做荣誉证书的排版,宽度是统一的,但是高度不一致 采用瀑布流的效果来实现 默认先实现前15张,点击按钮再加载全部剩下的数据 效果图 首先是html部分,写好样式 <!-- 荣誉资质 --&g ...
- jQuery瀑布流插件——jQuery.Waterfall
插件--jQuery.Waterfall 思路: 其实只要了解了整个流程,要实现这个插件也不难,大家都玩过俄罗斯方块吧,原理差不多,找到合适的地方叠上去就好了,在这里,每个块的宽度是必需给定的,然后计 ...
- jquery瀑布流的制作
首先,还是来看一下炫酷的页面: 今天就边做边说了: 一.准备工作 新建css,js,img文件夹存放相应文件,并在demo.html文件中引入外部文件(注意要把jquery文件引入),这里就不过多描述 ...
- 炫酷的jquery瀑布流
最近做了一个瀑布流效果,思路很简单 首先计算屏幕一行可以放多少个图片,然后在第二行开始,计算每一列的高度并取出最小值,将新图片加载在最小列高度下,如此循环,并且设定一个条件,当滑动到一定距离后,开始重 ...
随机推荐
- Objective-C:异常的处理
// // main.m // 03-动态绑定 // // Created by mac on 15/8/11. // Copyright (c) 2015年. All rights reserved ...
- libcurl使用easy模式阻塞卡死等问题的完美解决---超时设置
libcurl使用时疑难问题: 在使用libcurl时, jwisp发现, curl_easy_perform是阻塞的方式进行下载的, curl_easy_perform执行后,程序会在这里阻塞等待下 ...
- [转]室友靠打游戏拿30万offer,秘密竟然是……
又是一年秋招季,苦逼的小编还天天泡在图书馆里刷PAT,室友大佬却已经到处拿offer.上周某室友已经成功拿到杭州某企业年薪30W的offer,小编虚心向其讨教,某室友一脸兴奋地告诉小编,HR让面试者们 ...
- Informatica 常用组件Aggregator之一 聚合表达式
转换类型:已连接.主动 聚合转换允许您执行聚合计算,比如平均值和总和.聚合转换与表达式转换不同,您可以使用聚合转换对多组执行计算.而表达式转换只允许您逐行地执行计算. 使用 ...
- C/C++中printf/cout 计算顺序与缓冲区问题
1.printf/cout在同一个语句中都是从右向左计算的. 看如下的代码: #include <stdio.h> int main() { ; printf("%d %d&qu ...
- go语言基础之同级目录
1.同级目录 分文件编程(多个源文件),必须放在src目录 同一个目录,包名必须一样 设置GOPATH环境变量 go env 查看go相关环境路径 GO PATH: 在windows系统中,添加go环 ...
- 廖雪峰的python学习网址
http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/00140737570055886 ...
- ECharts演习(一)
前几天小组讨论,窗外的麻雀在电线杆上多嘴,想想很有夏天的感觉,手中的铅笔在纸上来了又回,我用几行字形容孰是孰非......... Echarts使用指南 百度网站:http://echarts.bai ...
- TextView跑步灯效果及在特殊情况下无效的解决方式
概述: 关于在TextView中使用跑马灯效果的样例在网上一搜一大把.他们可能会让你像以下这样来在xml中定义TextView控件的属性.而事实也确是如此. 只是我不知道他们有没有遇到和我一样的问题( ...
- 【android】模拟点击某个指定坐标作用在View上
/** * 模拟点击某个指定坐标作用在View上 * @param view * @param x * @param y */ public void clickView(View view,floa ...