基于jQuery的图片画廊、lightbox插件效果
图片演示:
使用说明:
第一步:首先你要在页面中引入一下文件,注意先后顺序
<link rel="stylesheet" type="text/css" href="css/album-lightbox.css" /> <script type="text/javascript" src="js/jquery.js"></script> <script type="text/javascript" src="js/album.js"></script>
第二部
<div> <h1>第一组图片</h1> <a class="J_AlbumItem" data-role="album" data-sort="example-2" data-origin-src="testImages/1.jpg" data-title="这是一个可爱的小妞" href="javascript:void(0);"><img height="50" src="testImages/1-1.jpg" /></a> <a class="J_AlbumItem" data-role="album" data-sort="example-2" data-origin-src="testImages/2.jpg" data-title="你知道这个车是多前嘛" href="javascript:void(0);"><img height="50" src="testImages/2-1.jpg" /></a> <a class="J_AlbumItem" data-role="album" data-sort="example-2" data-origin-src="testImages/3.jpg" data-title="再多的冯绍峰的身份哇塞的的粉色外电风扇" href="javascript:void(0);"><img height="50" src="testImages/3-1.jpg" /></a> </div>
看下以上页面渲染结构,一组图片就是多个“<a data-origin-src="这是源图地址"><img src="这是页面中小的预览图"></a>”这样结构的组合。
下面介绍下参数设置:
data-role="album"--->这个是必须存在且参数名是固定的,用来查找它是否用来渲染相册功能 data-sort="example-2"--->这个表示一组图片的组名,如果好几张图片属于同一组,那么这几张图片的参数值就是相同的 data-origin-src="testImages/1.jpg"--->顾名思义,这个就是用来存储图片源文件地址的 data-title="这是一个可爱的小妞"--->这个事用来定义这张图片的描述的
友情提示:
页面中图片元素的渲染,此插件使用全局body事件委托机制,无需关注图片是什么时候载入页面的,
源码CSS文件:
.G-AlbumOverlay{display:none; position:fixed;_position:absolute;left:0;top:0;width:100%;height:100%; background-color:#000; opacity:.6;filter:alpha(opacity:60); z-index:9999;} .G-AlbumPopup{display:none; position:absolute;top:50px;left:0px;width:100%; z-index:10000;} .G-AlbumPopup .albumPictureOfIndex .pictureCaption,.G-AlbumPopup .albumPictureOfIndex .pictureOfIndex{display:block;} .G-AlbumPopup .albumPictures,.G-AlbumPopup .albumPictureOfIndex{ position:relative;width:500px; margin:0 auto;} .G-AlbumPopup .albumPictures{height:500px; border:5px solid #fff;border-radius:5px; background-color:#fff; overflow:hidden;} .G-AlbumPopup .albumPictureOfIndex{display:none;color:#eee; margin-top:5px;} .G-AlbumPopup .albumPictureOfIndex .pictureOfIndex span{ margin-right:5px;color:#999;} .G-AlbumPopup .albumPictures span{ position:absolute;top:0; display:block;height:100%;width:50%; background-color:transparent; cursor:pointer; opacity:0;filter:alpha(opacity:0);z-index:2;} .G-AlbumPopup .albumPictures .prevBtn{left:0; background:url(../img/prev.png) no-repeat left center;} .G-AlbumPopup .albumPictures .nextBtn{right:0; background:url(../img/next.png) no-repeat right center;} .G-AlbumPopup .albumPictures .disable{display:none; cursor:default;} .G-AlbumPopup .albumPictures .hover{ opacity:1;filter:alpha(opacity:100);} .G-AlbumPopup .albumPictures .loading{ position:absolute;left:50%;top:50%; margin:-16px 0 0 -16px;display:block;width:32px;height:32px; background:url(../img/loading.gif) no-repeat center center;} .G-AlbumPopup .albumPictureOfIndex .colseAlbumBtn{ position:absolute;right:0px;top:5px;display:block;width:27px;height:27px; background:url(../img/close.png) no-repeat center center;} .G-AlbumPopup .albumPictures .picture{display:none;}
用到的ICON图标:
DOM结构演示:
1 <div> 2 <h1>第一组图片</h1> 3 <a class="J_AlbumItem" data-role="album" data-sort="example-2" data-origin-src="testImages/1.jpg" data-title="这是一个可爱的小妞" href="javascript:void(0);"> 4 <img height="50" src="testImages/1-1.jpg" /></a> 5 <a class="J_AlbumItem" data-role="album" data-sort="example-2" data-origin-src="testImages/2.jpg" data-title="你知道这个车是多前嘛" href="javascript:void(0);"><img height="50" src="testImages/2-1.jpg" /></a> 6 <a class="J_AlbumItem" data-role="album" data-sort="example-2" data-origin-src="testImages/3.jpg" data-title="再多的冯绍峰的身份哇塞的的粉色外电风扇" href="javascript:void(0);"><img height="50" src="testImages/3-1.jpg" /></a> 7 </div> 8 9 <div> 10 <h1>第二组图片</h1> 11 <a class="J_AlbumItem" data-role="album" data-sort="example-1" data-origin-src="testImages/4.jpg" data-title="额范围分为分王菲王菲王菲 额度为EVA" href="javascript:void(0);"><img height="50" src="testImages/4-1.jpg" /></a> 12 <a class="J_AlbumItem" data-role="album" data-sort="example-1" data-origin-src="testImages/5.jpg" data-title="青岛前雾灯阿瓦的非常多色粉" href="javascript:void(0);"><img height="50" src="testImages/5-1.jpg" /></a> 13 <a class="J_AlbumItem" data-role="album" data-sort="example-1" data-origin-src="testImages/6.jpg" data-title="阿瓦的期望的服务的未拆封阿什顿长撒分为" href="javascript:void(0);"><img height="50" src="testImages/6-1.jpg" /></a> 14 <a class="J_AlbumItem" data-role="album" data-sort="example-1" data-origin-src="testImages/7.jpg" data-title="额外地方额外氛围分额外分为V大纷纷认为" href="javascript:void(0);"><img height="50" src="testImages/7-1.jpg" /></a> 15 </div> 16 17 <h1>第三组图片</h1> 18 <a class="J_AlbumItem" data-role="album" data-sort="example-3" data-origin-src="testImages/8.jpg" data-title="这是一个可爱的小妞" href="javascript:void(0);"><img height="50" src="testImages/8-1.jpg" /></a> 19 </div>
源码JS:
1 /** 2 *图片画廊效果插件v1.0.1 3 *自由修改CSS实现自定义效果 4 *name:杨永 5 *QQ :377746756 6 */ 7 (function($){ 8 function Album(args){ 9 var _this_=this; 10 //初始化参数 11 this.setting={ 12 isShowCaption:true,//是否显示图片title 13 isShowIndex:true, //是否显示索引值 14 isShowColseBtn:true//是否显示关闭按钮 15 }; 16 //如果配置了参数,就覆盖默认参数 17 if(args){ 18 $.extend(this.setting,args); 19 }; 20 //创建蒙层#J_AlbumOverlay和相册弹出区域J_AlbumLightBox 21 this.albumOverlayDiv=$(‘<div id="J_AlbumOverlay" class="G-AlbumOverlay">‘); 22 this.albumLightDiv=$(‘<div id="J_AlbumLightBox" class="G-AlbumPopup">‘); 23 //存储body 24 this.bodyNode=$("body"); 25 //构建结构到body下 26 this.build(); 27 //所需结构创建好后,获取操作对象 28 this.albumPicturesDiv=this.albumLightDiv.find(".albumPictures"); 29 this.albumPictureOfIndexDiv=this.albumLightDiv.find(".albumPictureOfIndex"); 30 this.prevBtn=this.albumLightDiv.find(".prevBtn"); 31 this.nextBtn=this.albumLightDiv.find(".nextBtn"); 32 this.loadPicture=this.albumLightDiv.find(".picture"); 33 this.loading=this.albumLightDiv.find(".loading"); 34 this.colseAlbumBtn=this.albumLightDiv.find(".colseAlbumBtn"); 35 this.pictureCaption=this.albumLightDiv.find(".pictureCaption"); 36 this.curNum=this.albumLightDiv.find(".curNum"); 37 this.totalNum=this.albumLightDiv.find(".totalNum"); 38 //标识点击的类别名称,存储同类别的数组,当前点击对象的索引位置,防止狂点 39 this.sortName="null"; 40 this.albumArray=[]; 41 this.curIndex=0; 42 this.imgLoadStatus=true; 43 //事件委托到body 44 this.bodyNode.delegate("a[data-role=album],a.J_AlbumItem","click",function(){ 45 var sortName=$(this).attr("data-sort"), 46 title =$(this).attr("data-title"); 47 //根据点击的类别,查找页面中所有的同类别元素 48 if(_this_.sortName!=sortName){//防止在同一个类别上点击继续查找 49 _this_.findSortList(sortName); 50 //设置图片总数到节点上 51 _this_.totalNum.text(_this_.albumArray.length); 52 }; 53 //获取当前点击对象在存储数组中的索引位置 54 _this_.curIndex=_this_.getCurIndex($(this).attr("data-origin-src")); 55 //相册数组和当前点击的索引准备好后,初始化控件 56 _this_.initPopup($(this).attr("data-origin-src"),title); 57 }); 58 //绑定事件 59 this.prevBtn.hover(function(){ 60 if(!$(this).hasClass("disable")){ 61 $(this).addClass("hover"); 62 }; 63 },function(){ 64 if(!$(this).hasClass("disable")){ 65 $(this).removeClass("hover"); 66 }; 67 }).click(function(){ 68 //如果下一张图片还没有载入完毕,不让重复点击 69 if(_this_.imgLoadStatus){ 70 _this_.imgLoadStatus=false; 71 if(!$(this).hasClass("disable")){ 72 _this_.prevTo($(this)); 73 }; 74 }; 75 }); 76 this.nextBtn.hover(function(){ 77 if(!$(this).hasClass("disable")){ 78 $(this).addClass("hover"); 79 }; 80 },function(){ 81 if(!$(this).hasClass("disable")){ 82 $(this).removeClass("hover"); 83 }; 84 }).click(function(){ 85 if(_this_.imgLoadStatus){ 86 _this_.imgLoadStatus=false; 87 if(!$(this).hasClass("disable")){ 88 _this_.nextTo($(this)); 89 }; 90 }; 91 }); 92 93 this.colseAlbumBtn.click(function(){ 94 _this_.closeAlbum(); 95 }); 96 this.albumOverlayDiv.click(function(){ 97 _this_.closeAlbum(); 98 }); 99 this.albumLightDiv.click(function(){ 100 _this_.closeAlbum(); 101 }); 102 this.albumPicturesDiv.click(function(e){ 103 e.stopPropagation(); 104 }); 105 this.albumPictureOfIndexDiv.click(function(e){ 106 e.stopPropagation(); 107 }); 108 }; 109 Album.prototype={ 110 //初始化弹窗 111 initPopup:function(curUrl,title){ 112 var _self=this; 113 //根据当前索引和相册图片数设置上下切换按钮 114 if(this.curIndex==0){ 115 this.prevBtn.addClass("disable"); 116 }else{ 117 this.prevBtn.removeClass("disable"); 118 }; 119 if(this.curIndex==this.albumArray.length-1){ 120 this.nextBtn.addClass("disable"); 121 }else{ 122 this.nextBtn.removeClass("disable"); 123 }; 124 //设置title 125 this.pictureCaption.html(title); 126 /*加载图片,获取图片尺寸,滚动条位置,窗口大小开发*/ 127 this.albumLightDiv.css("top",$(document).scrollTop()+50); 128 //当弹出浮出后切换图片 129 this.loadPicture.hide(); 130 this.loading.show(); 131 this.albumOverlayDiv.fadeIn("slow",function(){ 132 _self.changeImage(curUrl); 133 }); 134 this.albumLightDiv.fadeIn(); 135 }, 136 //向上切换 137 prevTo:function(self){ 138 this.curIndex--; 139 if(this.curIndex!=this.albumArray.length-1){ 140 this.nextBtn.removeClass("disable hover"); 141 }; 142 if(this.curIndex<=0){ 143 self.addClass("disable"); 144 }; 145 this.changeImage(this.albumArray[this.curIndex].src); 146 this.pictureCaption.html(this.albumArray[this.curIndex].title); 147 }, 148 //向下切换 149 nextTo:function(self){ 150 this.curIndex++; 151 if(this.curIndex!=0){ 152 this.prevBtn.removeClass("disable hover"); 153 }; 154 if(this.curIndex>=this.albumArray.length-1){ 155 self.addClass("disable"); 156 }; 157 this.changeImage(this.albumArray[this.curIndex].src); 158 this.pictureCaption.html(this.albumArray[this.curIndex].title); 159 }, 160 //切换图片 161 changeImage:function(src){ 162 var _self=this; 163 //显示加载等待图片 164 this.loading.show(); 165 this.albumPictureOfIndexDiv.hide(); 166 this.loadPicture.css({width:"auto",height:"auto"}).hide(); 167 //等待图片加载完成 168 this.preLoadImg(src,function(){ 169 //设置当前索引和title到对应节点上 170 _self.curNum.text(_self.curIndex+1); 171 //替换图片 172 _self.loadPicture.prop("src",src); 173 //设置lightbox的尺寸 174 var width=_self.loadPicture.width(), 175 height=_self.loadPicture.height(); 176 _self.setAlbumSize(width,height); 177 }); 178 }, 179 //更具浏览器窗口大小处理下width,height 180 filterWH:function(width,height){ 181 var bili=height/width; 182 var clientWidth=window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth, 183 clientHeight=window.innerHeight||document.documentElement.clientHeight||document.body.clientHeight; 184 185 if(height<=clientHeight&&width<=clientWidth){ 186 height=height; 187 width=width; 188 }; 189 //切换时计算尺寸 190 if(height>=clientHeight){ 191 height=clientHeight-150; 192 width=height/bili; 193 }; 194 return {width:width,height:height}; 195 }, 196 //设置lightbox的尺寸 197 setAlbumSize:function(width,height){ 198 var _self=this; 199 //更具浏览器窗口大小处理下width,height 200 var filter=this.filterWH(width,height); 201 //设置图片区域和下面的文字说尺寸 202 this.albumPicturesDiv.animate({width:filter.width,height:filter.height},"slow",function(){ 203 //开启点击状态 204 _self.imgLoadStatus=true; 205 //隐藏掉加载等待 206 _self.loading.hide(); 207 _self.loadPicture.css({width:filter.width,height:filter.height}).fadeIn(); 208 _self.albumPictureOfIndexDiv.width(filter.width).fadeIn(); 209 }); 210 }, 211 //图片加载完成状态 212 preLoadImg:function(url,callBack){ 213 var _self=this; 214 var img=new Image(); 215 if(!!window.ActiveXObject){ 216 img.onreadystatechange=function(){ 217 if(this.readyState=="complete"){ 218 callBack(); 219 }else{ 220 //开启点击状态 221 _self.imgLoadStatus=true; 222 }; 223 }; 224 }else{ 225 img.onload=function(){ 226 callBack(); 227 }; 228 img.onerror=function(){ 229 //开启点击状态 230 _self.imgLoadStatus=true; 231 }; 232 }; 233 img.src=url; 234 }, 235 //关闭相册 236 closeAlbum:function(){ 237 this.albumOverlayDiv.fadeOut(); 238 this.albumLightDiv.fadeOut(); 239 this.albumPictureOfIndexDiv.hide(); 240 }, 241 //获取当前点击对象在存储数组中的索引位 242 getCurIndex:function(src){ 243 for(var i=0,num;i<this.albumArray.length;i++){ 244 if(this.albumArray[i].src===src){ 245 num=i; 246 break; 247 }; 248 }; 249 return num; 250 }, 251 //根据点击的类别,查找页面中所有的同类别元素 252 findSortList:function(sortName){ 253 var _self=this; 254 //把点击的类别名称存储起来,下次点击如果是同类别就不就行查找 255 this.sortName=sortName; 256 var nodeList=this.bodyNode.find("a[data-sort="+sortName+"]"); 257 //添加数据到存储数组中,添加前清楚数组 258 _self.albumArray.length=0; 259 nodeList.each(function(i,o){ 260 _self.albumArray.push({ 261 src:$(o).attr("data-origin-src"), 262 title:$(o).attr("data-title")||$(o).attr("title")||"" 263 }); 264 }); 265 }, 266 //构建初始代码插入BODY 267 build:function(){ 268 //弹出层内部结构代码 269 var construct= ‘<div class="albumPictures">‘+ 270 ‘<span class="prevBtn"></span>‘+ 271 ‘<img class="picture" src="" />‘+ 272 ‘<em class="loading"></em>‘+ 273 ‘<span class="nextBtn"></span> ‘+ 274 ‘</div>‘+ 275 ‘<div class="albumPictureOfIndex">‘+ 276 ‘<span class="colseAlbumBtn"></span>‘+ 277 ‘<span class="pictureCaption"></span>‘+ 278 ‘<span class="pictureOfIndex"><span class="curNum">1</span><span class="of">of</span><span class="totalNum">10</span></span>‘+ 279 ‘</div>‘; 280 //插入到this.albumLightDiv 281 this.albumLightDiv.html(construct); 282 //插入到body 283 this.bodyNode.append(this.albumOverlayDiv,this.albumLightDiv); 284 } 285 }; 286 //注册到全局对象 287 window.Album=Album; 288 })(jQuery);
创建:
$(function(){ var album=new Album(); });
欢迎各位转载,支持原创,共同进步,使用中有任何疑问,请加我QQ(377746756)一起讨论。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。