viewer.js+lazyload.js实现滚动ajax异步懒加载及图片查看器

  • Post author:
  • Post category:其他



1.viewer的用法:

关于viewer,一款强大的jquery图片查看器可以看这篇文章


https://blog.csdn.net/lianzhang861/article/details/80702741

下载地址:


https://download.csdn.net/download/lianzhang861/10480866

值得一提的是,不管你的img被什么元素包裹(li,div,或者单纯的img),viewer都可以在你点击图片时正常使用

<body>
	<ul id="viewer">
		<li>
			<img src="img/lks1.jpg" alt="" />
		</li>
		<li>
			<img src="img/lks2.jpg" alt="" />
		</li>
		<li>
			<img src="img/lks3.jpg" alt="" />
		</li>
		<li>
			<img src="img/lks4.jpg" alt="" />
		</li>
	</ul>
	
	<div id="viewer">
		<div>
			<img src="img/lks1.jpg" alt="" />
		</div>
		<div>
			<img src="img/lks2.jpg" alt="" />
		</div>
		<div>
			<img src="img/lks3.jpg" alt="" />
		</div>
		<div>
			<img src="img/lks4.jpg" alt="" />
		</div>
	</div>
	
	<div id="viewer" style="display: none;">
		<img src="img/lks2.jpg" alt="" />
		<img src="img/lks1.jpg" alt="" />
	</div>
	
	<script type="text/javascript">
		$("#viewer").viewer();
	</script>
</body>

初始化就是用$(“#viewer”).viewer();

销毁为$(“#viewer”).viewer(“destroy”);


重点

:viewer只能初始化一次,也就是说如果用ajax添加了新的图片,你再初始化新添加的图片还是出不来,只有第一次初始化加载的图片


解决办法

:1.不建议的方法:每次ajax完都$(“#viewer”).viewer(“destroy”)一下再$(“#viewer”).viewer(),此方法太麻烦

2.

建议的方法

:每次ajax完都用    $(“#viewer”).viewer(“update”)  方法来更新一下


2.lazyload使用

lazyload作为jquery的懒加载插件效果相当不错,会自动判断图片是否出现在屏幕显示区域,在才会请求图片资源。

图片可以不写src,只写data-original属性,也可以写src给一个loading图片的路径

<img class="lazy" data-original="img/bmw_m1_hood.jpg">
<img class="lazy" data-original="img/bmw_m1_side.jpg">
<img class="lazy" data-original="img/viper_1.jpg">
<img class="lazy" data-original="img/viper_corner.jpg">
<img class="lazy" data-original="img/bmw_m3_gt.jpg">
<img class="lazy" data-original="img/corvette_pitstop.jpg">


<script type="text/javascript" charset="utf-8">
  $(function() {
      $("img.lazy").lazyload({effect: "fadeIn"});
  });
</script>
$("img.lazy").lazyload({
  placeholder : "img/grey.gif", //用图片提前占位
    // placeholder,值为某一图片路径.此图片用来占据将要加载的图片的位置,待图片加载时,占位图则会隐藏
  effect: "fadeIn", // 载入使用何种效果
    // effect(特效),值有show(直接显示),fadeIn(淡入),slideDown(下拉)等,常用fadeIn
  threshold: 200, // 提前开始加载
    // threshold,值为数字,代表页面高度.如设置为200,表示滚动条在离目标位置还有200的高度时就开始加载图片,可以做到不让用户察觉
  event: 'click',  // 事件触发时才加载
    // event,值有click(点击),mouseover(鼠标划过),sporty(运动的),foobar(…).可以实现鼠标莫过或点击图片才开始加载,后两个值未测试…
  container: $("#container"),  // 对某容器中的图片实现效果
    // container,值为某容器.lazyload默认在拉动浏览器滚动条时生效,这个参数可以让你在拉动某DIV的滚动条时依次加载其中的图片
  failurelimit : 10 // 图片排序混乱时
     // failurelimit,值为数字.lazyload默认在找到第一张不在可见区域里的图片时则不再继续加载,但当HTML容器混乱的时候可能出现可见区域内图片并没加载出来的情况,failurelimit意在加载N张可见区域外的图片,以避免出现这个问题.
});


3.实例

<!DOCTYPE HTML>
<html>
<head>
	<link rel="stylesheet" href="${ctx }/resource/css/viewer.css">
	<script src="js/jquery-3.2.1.min.js" type="text/javascript" charset="utf-8"></script>
	<script src="${ctx }/resource/js/viewer.js"></script>
	<script src="${ctx }/resource/js/jquery.lazyload.js"></script>
	<title>相册</title>
	<style type="text/css">
		td,th{
			text-align:center !important;
		}
	    .images{
	        padding:10px;
	    }
	    .images .image{
	        padding:0px;border:1px solid #ddd;
	        background:white;margin-right:20px;
	        margin-bottom:20px;padding-bottom:0;
	        height:160px;
	
	    }
	    .images .image:hover{
	        cursor:pointer;box-shadow:2px 2px 2px #ddd;
	    }
	    .images .image img{
	        width:100%;height:130px;
	    }
	    .images .image p{
	        height:30px;line-height:30px;
	        text-align: center;margin-bottom:0;
	        overflow:hidden;
	    }
	    .shadow{
	        position: fixed;width:100%;height:1000px;z-index:1000000;background:rgba(0,0,0,0.5)
	    }
	</style>
</head>
<body>
	<div class="big-page">
		<div class="col-xs-12 col-sm-12  radius">
			<div class="images">
	
	        </div>
		</div>
	</div>

	<script type="text/javascript">
		
		var start=1;//页码
		var length=20;//每页图片数
		var pages;//总页数
		var loading = false; //加载控制阀,防止在ajax请求时继续触发请求
		$(function(){
		    loadImages();
		})
		//页面滚动时加载图片
		$(window).scroll(function(){
		    if((($(window).scrollTop()+$(window).height())+250)>=$(document).height()){
		        if(loading == false){
		        	//触发后禁止再次触发,等loadImages加载完成后才能继续触发
		            loading = true;
		            if(start<pages){//页码小于总页数才加载
		                start++;
		                loadImages();
		            }
		        }
		    }
		});
		//ajax请求加载图片
		function loadImages(){
		    $.ajax({
		        type: 'POST',
		        url: "${ctx}/webmana/getImages",
		        data:{
		            classId:$("input[name=classId]").val(),
		            start:start,
		            length:length,
		        },
		        dataType: 'json',
		        async:false,
		        success: function(data){
		            if(data.success){
		                var html='';
		                var data1=data.data;
		                for(var i=0;i<data1.size;i++){
		                    var data=data1.list[i];
		                    html+='<div class="image col-xs-4 col-sm-2 .col-md-2" title="'+data.attachment_name+'">'
		                    html+='<img class="lazy" data-original="${ctx}'+data.attachment_url+'" alt="">'
		                    html+='<p>'+data.attachment_name+'</p>'
		                    html+='</div>'
		                }
		                //给总页数赋值
		                pages=data1.pages;
		                $el=$(html);
		                $(".images").append($el);
		                //重点:每次都给新添加的img绑定懒加载
		                $("img.lazy",$el).lazyload({effect: "fadeIn"});
		               // $(".images").viewer("destroy");
		               //重点:每次都要给viewer更新绑定
		                $(".images").viewer("update");
		                //全部完成后恢复滚动触发功能
		                loading = false;
		            }
		        },
		        error:function(data) {
		            //console.log(data.msg);
		        },
		    });
		}
	</script> 
</body>
</html>

这里提一下不要每次ajax完都执行$(“img.lazy”).lazyload({effect: “fadeIn”}),这样会把所有图片都重新绑定一遍懒加载,也就是说加载过得图片回滚时图片又会闪烁一遍,用户体验不好



解决办法


:$el=$(html);

$(“.images”).append($el);

//重点:每次都给新添加的img绑定懒加载

$(“img.lazy”,$el).lazyload({effect: “fadeIn”});

每次都给新添加的元素中找img绑定懒加载,注意$(“子”,“父”),的jq选择器形式,与$(“兄弟,兄弟”),$(“父 子”)的区别;



版权声明:本文为lianzhang861原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。