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

时间:2022-10-28 08:16:38

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


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

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

技术路线


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

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

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

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

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

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

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

修改getList函数

function getList(n){
$.getJSON(createUrl(n),function(data){
if(data.length==0){
return false;
}else{
for(var i=0;i<data.length;i++){
var $html=null;
if(i<=20&&n==1){//首屏一次加载20张
$html=$('<div><img src="'+data[i].preview+'"><p>'+data[i].title+'</p></div>'); }else{
$html=$('<div><img src="images/1.jpg"><p>'+data[i].title+'</p></div>');
$html.find('img').css('opacity','0'); //占位图片不透明度为0
} $('li').eq(getShortestLi()).append($html);
$html.attr('data-src',data[i].preview);
$html.find('img').css('height',(data[i].height*225/data[i].width)+'px');
$html.find('img').css('width','225px'); };
} bCheck=true;
});
}

加载真实图片的执行函数

function loadClientPic(arr){//arr是页面所有的img标签。
var scrollTop=document.documentElement.scrollTop||document.body.scrollTop; for(var i=0;i<arr.length;i++){
if(arr.eq(i).attr('src')=='images/1.jpg'){
if(arr.eq(i).offset().top<document.documentElement.clientHeight+scrollTop){//进入可视区内!
arr.eq(i).attr('src',arr.eq(i).parent().attr('data-src'));
//console.log(i)
//transition: 1s; opacity: 1
if(arr.eq(i).attr('src')!=='images/1.jpg'&&arr.eq(i).height()!==0){
arr.eq(i).css('transition','1s').css('opacity','1');
} }else{
//console.log('不在可视区!')
}
}else{
//console.log('已加载')
}
}
};

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


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

附录


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

全部代码:

//找出高度最小li的索引值
function getShortestLi(){
var shortest=0;
for(var i=1;i<4;i++){
if($('li').eq(i).height()<$('li').eq(shortest).height()){
shortest=i;
}
}
return shortest;
} function createUrl(num){
return 'http://www.wookmark.com/api/json/popular?page='+num+'&callback=?';
} var bCheck=false;
function getList(n){
$.getJSON(createUrl(n),function(data){
if(data.length==0){
return false;
}else{
for(var i=0;i<data.length;i++){
var $html=null;
if(i<=20&&n==1){//首屏一次加载20张
$html=$('<div><img src="'+data[i].preview+'"><p>'+data[i].title+'</p></div>'); }else{
$html=$('<div><img src="images/1.jpg"><p>'+data[i].title+'</p></div>');
$html.find('img').css('opacity','0'); //占位图片不透明度为0
} $('li').eq(getShortestLi()).append($html);
$html.attr('data-src',data[i].preview);
$html.find('img').css('height',(data[i].height*225/data[i].width)+'px');
$html.find('img').css('width','225px'); };
}
loadClientPic($('img'));//函数临结束执行判断
bCheck=true;
});
} $(function(){
var pageNum=1;
getList(pageNum);
$(window).scroll(function(){ var $li=$('li').eq(getShortestLi());
var scrollTop=document.documentElement.scrollTop||document.body.scrollTop;
//console.log([$li.offset().top+$li.height(),document.documentElement.clientHeight+scrollTop])
//如果li高度与li到页面顶部的高度之和<可视区高度+滚动距离
if($li.offset().top+$li.height()<document.documentElement.clientHeight+scrollTop){
if(bCheck){
bCheck=false;
pageNum++; //console.log(pageNum);
getList(pageNum);
}else{
return false;
} } loadClientPic($('img'));
})
}) function loadClientPic(arr){
var scrollTop=document.documentElement.scrollTop||document.body.scrollTop; for(var i=0;i<arr.length;i++){
if(arr.eq(i).attr('src')=='images/1.jpg'){
if(arr.eq(i).offset().top<document.documentElement.clientHeight+scrollTop){//进入可视区内!
arr.eq(i).attr('src',arr.eq(i).parent().attr('data-src'));
//console.log(i)
//transition: 1s; opacity: 1
if(arr.eq(i).attr('src')!=='images/1.jpg'&&arr.eq(i).height()!==0){
arr.eq(i).css('transition','1s').css('opacity','1');
} }else{
//console.log('不在可视区!')
}
}else{
//console.log('已加载')
}
}
};

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

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

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

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

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

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

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

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

  4. jQuery插件图片懒加载lazyload

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

  5. &lbrack;jQuery插件&rsqb;手写一个图片懒加载实现

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

  6. jQuery&period;imgLazyLoad图片懒加载组件

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

  7. jquery图片懒加载效果

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

  8. 插件:&starf;&starf;&starf; &excl;&excl;&excl;图片懒加载 lazyload&period;js 、 jquery&period;scrollLoading&period;js

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

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

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

随机推荐

  1. RSA非对称加密,使用OpenSSL生成证书,iOS加密,java解密

    最近换了一份工作,工作了大概一个多月了吧.差不多得有两个月没有更新博客了吧.在新公司自己写了一个iOS的比较通用的可以架构一个中型应用的不算是框架的一个结构,并已经投入使用.哈哈 说说文章标题的相关的 ...

  2. oracle字符集相关

    转: Database character set (AL32UTF8) and Client character set (ZHS16GBK) are different. Character se ...

  3. 现在流行什么 JS库&sol;框架?

    现在大家最感兴趣的 JS 库和框架是什么? jQuery 91.5% Underscore 38.6% AngularJS 28.5% Backbone 18.6% React 15.7% Knock ...

  4. php加速缓存Xcache的安装与配置

    安装环境:centos 6.5 32bit  php5.5.7 nginx1.6.0 [root@localhost opt]# wget http://xcache.lighttpd.net/pub ...

  5. TCP&sol;IP具体解释--nagle算法和TCP&lowbar;NODELAY

    在client一直给server发送小数据的时候,接受到一个回应会在非常长的时间以后,可是将多个小数据写操作合并成一个写操作,问题就没了. 这个事件的缘由可能是TCP_NODELAY的原因 如今大概明 ...

  6. JavaWeb学习笔记九 过滤器、注解

    过滤器Filter filter是对客户端访问资源的过滤,符合条件放行,不符合条件不放行,并且可以对目标资源访问前后进行逻辑处理. 步骤: 编写一个过滤器的类实现Filter接口 实现接口中尚未实现的 ...

  7. Redis的持久化之AOF方式

    AOF方式:将以日志,记录每一个操作 优势:安全性相对RDB方式高很多: 劣势:效率相对RDB方式低很多: 配置: [root@localhost redis]# vi redis.conf 编辑re ...

  8. RPM包的版本号比较

    版本号表示格式为 epoch:version-release,例如 1:2-3 第一条原则是 rpm 属性优先级 epoch > version > release        两个 r ...

  9. &lt&semi;亲测&gt&semi;CentOS中yum安装ffmpeg

    CentOS中yum安装ffmpeg 1.升级系统 sudo yum install epel-release -y sudo yum update -y sudo shutdown -r now 2 ...

  10. springboot&plus;dubbo&plus;tomcat部署出错问题

    刚用springboot+dubbo有点不熟悉,部署的时候出现了问题 1 The APR based Apache Tomcat Native library which allows optimal ...