转:jQuery插件之Wookmark:流布局插件遇到图片资源请求过慢导致最终计算图片绝对位置top不够准确发生图片重叠的解决方案
谈起Wookmark我想做过前端的大侠都不会觉得陌生,它就是远近闻名的流布局jQuery插件,这个插件使用起来非常简单,需要引入两个js:
1.<script src="/js/jquery-1.10.2.min.js"></script>2.<script src="js/jquery.wookmark.min.js"></script>因为Wookmark是基于jQuery编写的插件,自然是少不了jQuery.js文件且必须在wookmark.js之前已入,否则将会报错。
接着就是html内图片容器的布局讲究了:
1、容器需要指定position为relative相对位置;
2、必须指定图片的高度和宽度;
示例代码如下所示:
01.<div class="example">02.<div id="main" role="main">03.<ul id="tiles">04.<!-- These are our grid blocks -->05.<li><img src="img/image_1.jpg" width="200" height="283"><p>1</p></li>06.<li><img src="img/image_2.jpg" width="200" height="300"><p>2</p></li>07.<li><img src="img/image_3.jpg" width="200" height="252"><p>3</p></li>08.<li><img src="img/image_4.jpg" width="200" height="158"><p>4</p></li>09.<li><img src="img/image_5.jpg" width="200" height="300"><p>5</p></li>10.<li><img src="img/image_6.jpg" width="200" height="297"><p>6</p></li>11.<li><img src="img/image_7.jpg" width="200" height="200"><p>7</p></li>12.<li><img src="img/image_8.jpg" width="200" height="200"><p>8</p></li>13.<li><img src="img/image_9.jpg" width="200" height="398"><p>9</p></li>14.<li><img src="img/image_10.jpg" width="200" height="267"><p>10</p></li>15.<li><img src="img/image_1.jpg" width="200" height="283"><p>11</p></li>16.<li><img src="img/image_2.jpg" width="200" height="300"><p>12</p></li>17.<li><img src="img/image_3.jpg" width="200" height="252"><p>13</p></li>18.<li><img src="img/image_4.jpg" width="200" height="158"><p>14</p></li>19.<li><img src="img/image_5.jpg" width="200" height="300"><p>15</p></li>20.<li><img src="img/image_6.jpg" width="200" height="297"><p>16</p></li>21.<li><img src="img/image_7.jpg" width="200" height="200"><p>17</p></li>22.<li><img src="img/image_8.jpg" width="200" height="200"><p>18</p></li>23.<li><img src="img/image_9.jpg" width="200" height="398"><p>19</p></li>24.<li><img src="img/image_10.jpg" width="200" height="267"><p>20</p></li>25.<li><img src="img/image_1.jpg" width="200" height="283"><p>21</p></li>26.<li><img src="img/image_2.jpg" width="200" height="300"><p>22</p></li>27.<li><img src="img/image_3.jpg" width="200" height="252"><p>23</p></li>28.<li><img src="img/image_4.jpg" width="200" height="158"><p>24</p></li>29.<li><img src="img/image_5.jpg" width="200" height="300"><p>25</p></li>30.<li><img src="img/image_6.jpg" width="200" height="297"><p>26</p></li>31.<li><img src="img/image_7.jpg" width="200" height="200"><p>27</p></li>32.<li><img src="img/image_8.jpg" width="200" height="200"><p>28</p></li>33.<li><img src="img/image_9.jpg" width="200" height="398"><p>29</p></li>34.<li><img src="img/image_10.jpg" width="200" height="267"><p>30</p></li>35.<!-- End of grid blocks -->36.</ul>37.</div>38.</div>接着就是当所有页面元素渲染完毕过后调用流布局的方法,如下所示:
01.(function ($){02.var handler = $('#tiles li');03. 04.handler.wookmark({05.// Prepare layout options.06.autoResize: true, // This will auto-update the layout when the browser window is resized.07.container: $('#main'), // Optional, used for some extra CSS styling08.offset: 5, // Optional, the distance between grid items09.outerOffset: 10, // Optional, the distance to the containers border10.itemWidth: 210 // Optional, the width of a grid item11.});12. 13.// Capture clicks on grid items.14.handler.click(function(){15.// Randomize the height of the clicked item.16.var newHeight = $('img', this).height() + Math.round(Math.random() * 300 + 30);17.$(this).css('height', newHeight+'px');18. 19.// Update the layout.20.handler.wookmark();21.});22.})(jQuery);只要一句:wookmark()即可调用流布局,插件会自动根据容器内图图片容器的大小个数计算每一个容器的绝对位置(top、left)值和width和height值,从而达到每一张图片非常完美地呈现出来,且成一种水流一样的均匀垂直分布。
问题暴露:
1、当我们的站点访问资源速度很慢的情况下,你会发现最终呈现出来的流布局会有一些瑕疵,也就是尾部有一些图片容器发生了相互重叠的现象。
问题分析:
1、问题根源在于图片资源请求过慢,倒是插件无法获得图片的准确height和width值,从而导致了计算其position为absolute的情况下的top值不够准确,最后出现了图片相互重叠的情况。这个时候,让你改变窗体大小的情况下重新去调用一下wookmark() 将会发现重新的布局非常完美。因为这个时候图资源已经全部获取到了的。
问题解决办法:
1、既然是图片资源尚未完全加载的情况下出现的问题,那么我们就何不等待所有图片资源都加载完毕过后在执行流布局呢?
这个时候我们想到了jQuery的另外一个插件jquery.imagesloaded
这个插件就是用于等待和监听页面内所有图片资源全部加载完毕,我们可以直接这样下载这个插件的js:http://code.ciaoca.com/jquery/wookmark/demo/js/jquery.imagesloaded.js
这个js文件需要引入在jQuery之后wookmark之前
1.<script src="/js/jquery-1.10.2.min.js"></script>2.<script src="js/jquery.imagesloaded.js"></script>3.<script src="js/jquery.wookmark.min.js"></script>接着我们就是调用imagesloaded监听加载完毕过后的状态然后调用流布局,代码如下所示:
01.(function ($) {02.var loadedImages = 0, // Counter for loaded images03.handler = $('#tiles li'); // Get a reference to your grid items.04. 05.// Prepare layout options.06.var options = {07.autoResize: true, // This will auto-update the layout when the browser window is resized.08.container: $('#main'), // Optional, used for some extra CSS styling09.offset: 5, // Optional, the distance between grid items10.outerOffset: 10, // Optional, the distance to the containers border11.itemWidth: 210 // Optional, the width of a grid item12.};13. 14.$('#tiles').imagesLoaded(function(){15.// Call the layout function.16.handler.wookmark(options);17. 18.// Capture clicks on grid items.19.handler.click(function(){20.// Randomize the height of the clicked item.21.var newHeight = $('img', this).height() + Math.round(Math.random() * 300 + 30);22.$(this).css('height', newHeight+'px');23. 24.// Update the layout.25.handler.wookmark();26.});27.}).progress(function(instance, image) {28.// Update progress bar after each image load29.loadedImages++;30.if (loadedImages == handler.length)31.$('.progress-bar').hide();32.else33.$('.progress-bar').width((loadedImages / handler.length * 100) + '%');34.});35.})(jQuery);imagesLoaded(function(){}); 这样就表示图片资源全部加载完毕的状态监听了的。
这样一来,我们就彻底解决了流布局当图片资源请求过慢导致图片相互重叠的问题了的。

转:jQuery插件之Wookmark:流布局插件遇到图片资源请求过慢导致最终计算图片绝对位置top不够准确发生图片重叠的解决方案的更多相关文章
- myWaterfall - jQuery瀑布流布局插件
myWaterfall - jQuery瀑布流布局插件 Demo http://jsfiddle.net/q3011893/p5k2ogy8/embedded/result,html,css,js/ ...
- Waterfall———瀑布流布局插件, 类似于 Pinterest、花瓣、发现啦。
瀑布流布局插件, 类似于 Pinterest.花瓣.发现啦. En 中文 文档 下载 下载waterfall插件最新版本. 使用 html: <div id="container&qu ...
- 响应式流布局插件DyLay
jQuery插件-Dylay,流布局我们前面介绍过很多,但这个流布局jQuery插件不同的是它的动画效果很不错,大家可以尝试使用下.另外<有用的jQuery布局插件推荐>这篇文章中有好几个 ...
- jquery validate表单验证插件-推荐
1 表单验证的准备工作 在开启长篇大论之前,首先将表单验证的效果展示给大家. 1.点击表单项,显示帮助提示 2.鼠标离开表单项时,开始校验元素 3.鼠标离开后的正确.错误提示及鼠标移入时的帮 ...
- 轻量级jQuery语法高亮代码高亮插件jQuery Litelighter。
<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>jQ ...
- 20款jQuery 的音频和视频插件
分享 20 款jQuery的音频和视频插件 Blueimp Gallery: DEMO || DOWNLOAD Blueimp gallery 主要为移动设备而设计,同时也支持桌面浏览器.可定制视频和 ...
- jQuery模仿人类打字效果插件typetype
typetype是一款模仿人类打字效果的jQuery插件,typetype非常轻巧,文件不到2K,gzipped压缩后只有578字节,但模仿的效果非常逼真,一字一字的顿出和回删效果,让人惊叹不止,喜欢 ...
- jQuery插件 -- 动态事件绑定插件jquery.livequery.js
http://blog.csdn.net/zzq58157383/article/details/7721974 动态事件绑定插件livequery, 可以利用它给相应的DOM元素注册事件或者触发回调 ...
- jquery validate表单验证插件
1 表单验证的准备工作 在开启长篇大论之前,首先将表单验证的效果展示给大家. 1.点击表单项,显示帮助提示 2.鼠标离开表单项时,开始校验元素 3.鼠标离开后的正确.错误提示及鼠标移入时的帮 ...
随机推荐
- Azure Paas SQL 修改用户名密码的相关问题
现总结如下,供您参考: 1) 如何单独修改每个数据库的密码? 在portal中,我们提供了一个最高权限的,可管理服务器下所有数据库的服务器用户 跟密码,但在实际使用中,由于权限过大,会有潜在的安全隐 ...
- Go语言中的RPC调用
首先,说一下目录结构: 一.HttpRPC 1.建立服务文件 /*Go RPC的函数只有符合下面的条件才能被远程访问,不然会被忽略,详细的要求如下: 函数必须是导出的(首字母大写) 必须有两个导出类型 ...
- Spring ActiveMQ Caused By: javax.jms.IllegalStateException: Connection closed
根据 http://www.cnblogs.com/yshyee/p/7448808.html 进行JMS操作时,发送跟监听放到不同的项目中进行时,出现以下异常信息: org.springframew ...
- POSTGRESQL 支持正则表达式
昨天遇到了一个奇葩的问题,需要在WHERE条件里面添加正则表达式,抱着试试看的态度,查看了一下postgresql,发现确实可以支持正则,例如: select * from user where em ...
- vuejs组件交互 - 03 - vuex状态管理实现组件交互
组件交互模式的使用场景 简单应用直接使用props down,event up的模式就可以了 小型应用使用事件中心模式即可 中大型应用使用vuex的状态管理模式 vuex 包含要管理的应用数据和更新数 ...
- ios网络学习------9 播放网络视频
IOS提供了叫做MPMoviePlayerController MPMoviePlayerViewController两个类.能够轻松用来实现视频播放. MPMoviePlayerViewContr ...
- Oracle 12c 用户创建、角色、权限
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAd4AAADHCAIAAAA4UqVzAAAgAElEQVR4nOy9Z5Bk13UmyN/6vZrlrG
- POJ 2186 强联通分量
点击打开链接 题意:牛A喜欢牛B,若牛B喜欢牛C,则牛A喜欢牛C,问最后多少牛被其它全部牛喜欢 思路:用强联通分量进行缩点,最后形成的图是有向无环图DAG.而拓扑序的值为DAG的长度,则加一,可是最后 ...
- 利用WatchService监听文件变化
在实现配置中心的多种方案中,有基于JDK7+的WatchService方法,其在单机应用中还是挺有实践的意义的. 代码如下: package com.longge.mytest; import jav ...
- 关于继承中的super()调用父类构造方法
super super可以理解为是指向自己超(父)类对象的一个指针,而这个超类指的是离自己最近的一个父类. 每当你new一个子类对象的时候,子类对象都隐式内置了一个父类对象.所以说,为了那个内置的父类 ...