转:jQuery插件之Wookmark:流布局插件遇到图片资源请求过慢导致最终计算图片绝对位置top不够准确发生图片重叠的解决方案

谈起Wookmark我想做过前端的大侠都不会觉得陌生,它就是远近闻名的流布局jQuery插件,这个插件使用起来非常简单,需要引入两个js:

view sourceprint?

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、容器需要指定positionrelative相对位置;

2、必须指定图片的高度宽度

示例代码如下所示:

view sourceprint?

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>

接着就是当所有页面元素渲染完毕过后调用流布局的方法,如下所示:

view sourceprint?

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 styling

08.offset: 5, // Optional, the distance between grid items

09.outerOffset: 10, // Optional, the distance to the containers border

10.itemWidth: 210 // Optional, the width of a grid item

11.});

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之前

view sourceprint?

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监听加载完毕过后的状态然后调用流布局,代码如下所示:

view sourceprint?

01.(function ($) {

02.var loadedImages = 0, // Counter for loaded images

03.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 styling

09.offset: 5, // Optional, the distance between grid items

10.outerOffset: 10, // Optional, the distance to the containers border

11.itemWidth: 210 // Optional, the width of a grid item

12.};

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 load

29.loadedImages++;

30.if (loadedImages == handler.length)

31.$(‘.progress-bar‘).hide();

32.else

33.$(‘.progress-bar‘).width((loadedImages / handler.length * 100) + ‘%‘);

34.});

35.})(jQuery);

imagesLoaded(function(){}); 这样就表示图片资源全部加载完毕的状态监听了的。

这样一来,我们就彻底解决了流布局当图片资源请求过慢导致图片相互重叠的问题了的。

时间: 2024-08-28 16:54:02

转:jQuery插件之Wookmark:流布局插件遇到图片资源请求过慢导致最终计算图片绝对位置top不够准确发生图片重叠的解决方案的相关文章

jQuery延迟加载(懒加载)插件 – jquery.lazyload.js

Lazy Load 是一个用 JavaScript 编写的 jQuery 插件. 它可以延迟加载长页面中的图片. 在浏览器可视区域外的图片不会被载入, 直到用户将页面滚动到它们所在的位置. 这与图片预加载的处理方式正好是相反的.在包含很多大图片长页面中延迟加载图片可以加快页面加载速度. 浏览器将会在加载可见图片之后即进入就绪状态. 在某些情况下还可以帮助降低服务器负担. Demo页面: 基本选项 淡入效果 对不支持JavaScript浏览器的降级处理 水平滚动 容器内水平滚动 容器内垂直滚动 页

jQuery超酷下拉插件6种效果演示

原始的下拉框很丑啦, 给大家一款jQuery超酷下拉插件6种效果 效果预览 下载地址 实例代码 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 <div class="container">                       <section class="main clearfix">                 <select id="cd-dr

jquery动态改变背景颜色插件

GETHUB下载地址 背景颜色用animate方法时时无法改变颜色的 所以要使用插件进行补充. 用法: <!DOCTYPE html> <html> <head> <style> div { background-color: #bada55; width: 100px; border: 1px solid green; } </style> <script src="http://code.jquery.com/jquery-1

分享一个jquery功能强大的提示信息插件代码

代码属于提示文字特效,很好,使用有些复杂,请参demo使用 下载地址:jquery功能强大的提示信息插件代码 预览DEMO:DEMO 分享一个jquery功能强大的提示信息插件代码,布布扣,bubuko.com

【锋利的jQuery】表单验证插件踩坑

和前几篇博文提到的一样,由于版本原因,[锋利的jQuery]表单验证插件部分又出现照着敲不出效果的情况. 书中的使用方法: 1. 引入jquery源文件, 2. 引入表单验证插件js文件, 3. 在form中class类名中添加"required","email"等去作为验证时读取的参数. 4. 调用代码: $("#commentform").validate(); 很不幸,报错了.前端有个说法是学新不学旧,这里就不去深究原因,直接提供最新的写法

第一百八十五节,jQuery,Ajax 表单插件

jQuery,Ajax 表单插件 学习要点: 1.核心方法 2.option 参数 3.工具方法 传统的表单提交,需要多次跳转页面,极大的消耗资源也缺乏良好的用户体验.而这款 form.js 表单的 Ajax 提交插件将解决这个问题. 一.核心方法 官方网站:http://malsup.com/jquery/form/ form.js 插件有两个核心方法:ajaxForm()和 ajaxSubmit(),它们集合了从控制表单元素 到决定如何管理提交进行的功能.

10个免费的响应式jQuery Carousel 轮播图插件

jQuery Carousel 轮播图插件可以给网站创建华丽的动画效果,这里列出的10个jQuery Carousel 轮播图插件都是响应式的,并且可以免费使用. 1. ItemSlide.js 简单的触摸式Carousel 轮播图插件,提供多种样式的旋转动画,如向上滑动,基于全屏的触摸滑动,左右滑动等. 2. Liquid 每当Liquid 容器的大小改变时,都会重新调整列表中的项目数,以适应新的宽度. 3. jCarousel jCarousel 是一个用来控制水平或垂直方向上列表项的jQu

jQuery Json数据格式排版高亮插件json-viewer.js的使用

1.插件介绍: jquery.json-viewer.js是一款查看json格式数据的jquery插件.它可以将混乱的json数据漂亮的方式展示在页面中,并支持节点的伸展和收缩和语法高亮等功能. 2.代码演示: 1).首先引入jquery和json.viewer.js插件 <script src="http://www.jq22.com/jquery/jquery-1.10.2.js"></script> <script src="js/jque

第一百八十六节,jQuery,验证表单插件,Ajax 表单插件,验证和提交表单

jQuery,验证表单插件,Ajax 表单插件,验证和提交表单 HTML <form id="reg" method="post" action="yzh.php" title="会员注册"> <ol class="reg_error"></ol> <p> <label for="user">帐号:</label>