jquery实现简单瀑布流布局(续):图片懒加载


这篇文章是jquery实现简单瀑布流布局思想的小小扩展。代码基于前作的代码继续完善。

图片懒加载就是符合某些条件时才触发图片的加载。最常见的具体表现就是,当页面被请求时,只加载可视区域的图片,其它部分的图片只占位而不加载,只有这些图片出现在可视区域时才会动态加载。具体实现的技术并不复杂,下面分别对其说明。

技术路线


  • 怎么加载。首先未加载的图片有一个占位假图片(一般是loading),按照真实图片的大小进行样式化。网上较为常用的思路是对图片元素的父级定义一个data-src属性,用来存放该图片元素的真实src。到用的时候再调用。
  • 加载判断条件:

    首屏一次性加在20张。保证首页有料。

    后边的图片基于以下思路。

往下拉(滚动),找到第一个顶部进入可视区的img,优先加载。

  • 监听位置:
  • 滚动条滚动时,这提示需要写一个新加载的函数。
  • 第二个有点难察觉,就是在getlist方法加载瀑布流完结之前。因为getList一旦调用,就意味着有新的图片进入可视区。不能只靠滚动进行触发

修改getList函数

  1. function getList(n){
  2. $.getJSON(createUrl(n),function(data){
  3. if(data.length==0){
  4. return false;
  5. }else{
  6. for(var i=0;i<data.length;i++){
  7. var $html=null;
  8. if(i<=20&&n==1){//首屏一次加载20张
  9. $html=$('<div><img src="'+data[i].preview+'"><p>'+data[i].title+'</p></div>');
  10. }else{
  11. $html=$('<div><img src="images/1.jpg"><p>'+data[i].title+'</p></div>');
  12. $html.find('img').css('opacity','0'); //占位图片不透明度为0
  13. }
  14. $('li').eq(getShortestLi()).append($html);
  15. $html.attr('data-src',data[i].preview);
  16. $html.find('img').css('height',(data[i].height*225/data[i].width)+'px');
  17. $html.find('img').css('width','225px');
  18. };
  19. }
  20. bCheck=true;
  21. });
  22. }

加载真实图片的执行函数

  1. function loadClientPic(arr){//arr是页面所有的img标签。
  2. var scrollTop=document.documentElement.scrollTop||document.body.scrollTop;
  3. for(var i=0;i<arr.length;i++){
  4. if(arr.eq(i).attr('src')=='images/1.jpg'){
  5. if(arr.eq(i).offset().top<document.documentElement.clientHeight+scrollTop){//进入可视区内!
  6. arr.eq(i).attr('src',arr.eq(i).parent().attr('data-src'));
  7. //console.log(i)
  8. //transition: 1s; opacity: 1
  9. if(arr.eq(i).attr('src')!=='images/1.jpg'&&arr.eq(i).height()!==0){
  10. arr.eq(i).css('transition','1s').css('opacity','1');
  11. }
  12. }else{
  13. //console.log('不在可视区!')
  14. }
  15. }else{
  16. //console.log('已加载')
  17. }
  18. }
  19. };

最后,在监听位置加上写好的函数


  • 在$(window).scroll(function(){})里加上loadClientPic($('img));
  • 不要遗漏getList方法结束前也执行loadClientPic。

附录


demo地址 http://djtao.top/ppl/ppl.html

全部代码:

  1. //找出高度最小li的索引值
  2. function getShortestLi(){
  3. var shortest=0;
  4. for(var i=1;i<4;i++){
  5. if($('li').eq(i).height()<$('li').eq(shortest).height()){
  6. shortest=i;
  7. }
  8. }
  9. return shortest;
  10. }
  11. function createUrl(num){
  12. return 'http://www.wookmark.com/api/json/popular?page='+num+'&callback=?';
  13. }
  14. var bCheck=false;
  15. function getList(n){
  16. $.getJSON(createUrl(n),function(data){
  17. if(data.length==0){
  18. return false;
  19. }else{
  20. for(var i=0;i<data.length;i++){
  21. var $html=null;
  22. if(i<=20&&n==1){//首屏一次加载20张
  23. $html=$('<div><img src="'+data[i].preview+'"><p>'+data[i].title+'</p></div>');
  24. }else{
  25. $html=$('<div><img src="images/1.jpg"><p>'+data[i].title+'</p></div>');
  26. $html.find('img').css('opacity','0'); //占位图片不透明度为0
  27. }
  28. $('li').eq(getShortestLi()).append($html);
  29. $html.attr('data-src',data[i].preview);
  30. $html.find('img').css('height',(data[i].height*225/data[i].width)+'px');
  31. $html.find('img').css('width','225px');
  32. };
  33. }
  34. loadClientPic($('img'));//函数临结束执行判断
  35. bCheck=true;
  36. });
  37. }
  38. $(function(){
  39. var pageNum=1;
  40. getList(pageNum);
  41. $(window).scroll(function(){
  42. var $li=$('li').eq(getShortestLi());
  43. var scrollTop=document.documentElement.scrollTop||document.body.scrollTop;
  44. //console.log([$li.offset().top+$li.height(),document.documentElement.clientHeight+scrollTop])
  45. //如果li高度与li到页面顶部的高度之和<可视区高度+滚动距离
  46. if($li.offset().top+$li.height()<document.documentElement.clientHeight+scrollTop){
  47. if(bCheck){
  48. bCheck=false;
  49. pageNum++;
  50. //console.log(pageNum);
  51. getList(pageNum);
  52. }else{
  53. return false;
  54. }
  55. }
  56. loadClientPic($('img'));
  57. })
  58. })
  59. function loadClientPic(arr){
  60. var scrollTop=document.documentElement.scrollTop||document.body.scrollTop;
  61. for(var i=0;i<arr.length;i++){
  62. if(arr.eq(i).attr('src')=='images/1.jpg'){
  63. if(arr.eq(i).offset().top<document.documentElement.clientHeight+scrollTop){//进入可视区内!
  64. arr.eq(i).attr('src',arr.eq(i).parent().attr('data-src'));
  65. //console.log(i)
  66. //transition: 1s; opacity: 1
  67. if(arr.eq(i).attr('src')!=='images/1.jpg'&&arr.eq(i).height()!==0){
  68. arr.eq(i).css('transition','1s').css('opacity','1');
  69. }
  70. }else{
  71. //console.log('不在可视区!')
  72. }
  73. }else{
  74. //console.log('已加载')
  75. }
  76. }
  77. };

看着那些图片,不由得再感叹一句,歪果仁太会玩了..

jquery实现简单瀑布流布局(续):图片懒加载的更多相关文章

  1. jquery实现简单瀑布流布局

    jquery实现简单瀑布流布局 是开头都会说的原理 瀑布流布局有两种,一种是固定列,一种是非固定列.在此主要记述第一种的实现. 固定列的特征是:无论页面如何缩放,每行的总列数都一致. 一行4列的瀑布流 ...

  2. 代码: 两列图片瀑布流(一次后台取数据,图片懒加载。下拉后分批显示图片。图片高度未知,当图片onload后才显示容器)

    代码: 两列图片瀑布流(一次后台取数据,无ajax,图片懒加载.下拉后分批显示图片.图片高度未知,当图片onload后才显示容器) [思路]: 图片瀑布流,网上代码有多种实现方式,也有各类插件.没找到 ...

  3. jQuery图片懒加载插件jquery.lazyload.js使用实例注意事项说明

    jQuery图片懒加载插件jquery.lazyload.js使用实例注意事项说明 jquery.lazyload.js是一个用JavaScript编写的jQuery插件.它可以延迟加载长页面中的图片 ...

  4. jQuery插件图片懒加载lazyload

    来自XXX的前言: 什么是ImageLazyLoad技术 在页面上图片比较多的时候,打开一张页面必然引起与服务器大数据量的 交互.尤其是对于高清晰的图片,占的几M的空间.ImageLazyLoad技术 ...

  5. [jQuery插件]手写一个图片懒加载实现

    教你做图片懒加载插件 那一年 那一年,我还年轻 刚接手一个ASP.NET MVC 的 web 项目, (C#/jQuery/Bootstrap) 并没有做 web 的经验,没有预留学习时间, (作为项 ...

  6. jQuery.imgLazyLoad图片懒加载组件

    一.前言 当一个页面中请求的图片过多,而且图片太大,页面访问的速度是非常慢的,对用户的体验非常不友好:使用图片懒加载,可以减轻服务器的压力,增加页面的访问量,这里主要是总结一下我自己写的图片懒加载组件 ...

  7. jquery图片懒加载效果

    1.要引入jquery 2.要引入underscore.js <!DOCTYPE html> <html lang="en"> <head> & ...

  8. 插件:★★★ !!!图片懒加载 lazyload.js 、 jquery.scrollLoading.js

    插件:图片懒加载 jquery.lazyload.js 2016-3-31 插件说明:http://www.w3cways.com/1765.html (小插件,好用) 下载地址: https://r ...

  9. 使用jQuery实现图片懒加载原理

    原文:https://www.liaoxuefeng.com/article/00151045553343934ba3bb4ed684623b1bf00488231d88d000 在网页中,常常需要用 ...

随机推荐

  1. 统计文件种类数+获取子shell返回值的其它方法

    前言 只是作为一个shell的小小练习和日常统计用,瞎折腾的过程中也是摸到了获取子shell返回值的几种方法: 肯定还有别的方法,跟进程间的通信相关,希望你能提出建议和补充,谢谢~ 完整程序: #! ...

  2. jquery $.trim()去除字符串空格详解

    jquery $.trim()去除字符串空格详解 语法 jQuery.trim()函数用于去除字符串两端的空白字符. 作用 该函数可以去除字符串开始和末尾两端的空白字符(直到遇到第一个非空白字符串为止 ...

  3. Error:Flash Download Failed-"Cortex-M3"

    Error:Flash Download Failed-"Cortex-M3"出现一般有两种情况: 1.SWD模式下,Debug菜单中,Reset菜单选项(Autodetect/H ...

  4. 配置TortoiseSVN客户端, 强制签入前加注释

    正如上篇提到, 总有一些人在签入代码到SVN前没有加注释, 然后, 像这样: 鬼才知道改了什么东西. ①有些人可能就是没有写注释的习惯, ②有些人可能是忘记写注释 && SVN服务端和 ...

  5. 使用开发者工具调试jsp页面中的脚本

    只举例火狐和谷歌.如果是火狐,一般是用firebug,首先确保开启脚本调试: 然后刷新一下要调试的页面,点击firebug中的行内,选择当前页面: js文件一般直接显示的是js文件的名字,而页面一般是 ...

  6. Unix哲学

    01. 模块原则:使用简洁的接口拼合简单的部件. 02. 清晰原则:清晰胜于机巧. 03. 组合原则:设计时考虑拼接组合. 04. 分离原则:策略同机制分离,接口同引擎分离. 05. 简洁原则:设计要 ...

  7. 【2016-10-31】【坚持学习】【Day16】【MongoDB】【入门】

    下载,安装: http://www.mongodb.org/downloads 命令行下运行 MongoDB 服务器 为了从命令提示符下运行MongoDB服务器,你必须从MongoDB目录的bin目录 ...

  8. NYOJ 485

    A*B Problem 描述 设计一个程序求出A*B,然后将其结果每一位相加得到C,如果C的位数大于等于2,继续将C的各位数相加,直到结果是个一位数k. 例如: 6*8=48: 4+8=12: 1+2 ...

  9. BZOJ 1797: [Ahoi2009]Mincut 最小割

    1797: [Ahoi2009]Mincut 最小割 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2076  Solved: 885[Submit] ...

  10. VPS搭建VPN、BLOG

    FQ的正确姿势,你掌握了多少?老司机带你去墙外看看,来开车了坐稳! 购买VPS主机(服务端) 推荐性价比较高的VPS 搬瓦工https://bandwagonhost.com/ 上面的链接如果你打不开 ...