什么是FancyBox?
FancyBox是一款基于jquery开发的类Lightbox插件。支持对放大的图片添加阴影效果,对于一组相关的图片添加导航操作按纽,该lightbox除了能够展示图片之外,还可以展示iframed内容,通过css自定义外观。
该插件自身提供了不少功能及效果,其特点如下:
- 可以支持图片、html文本、flash动画、iframe以及ajax的支持。
- 可以自定义播放器的CSS样式。
- 可以以组的形式进行播放。
- 如果将鼠标滚动插件(mouse wheel plugin)包含进来的话Fancybox还能支持鼠标滚轮滚动来翻阅图片。
- Fancybox播放器支持投影,更有立体的感觉。
具体使用方法就不在此阐述了,下面我们要讲的是如何加入旋转图片的效果。这个功能主要用于浏览上传时没有摆正的图片。
实现旋转图片效果
旋转图片,我们首先可以想到的就是利用CSS3 transform的rotate及translate属性,但是IE不支持CSS3新增属性,那么我们此时得使用IE的滤镜方法。那么基本的思路就出来了,首先判断浏览器,然后根据不同的浏览器使用不同的实现方式。
1.为插件增加旋转按钮
需要改动 jquery.fancybox-buttons.js和jquery.fancybox-buttons.css
query.fancybox-buttons.css修改
#fancybox-buttons a.btnRotateL { background-position: 5px 0; } #fancybox-buttons a.btnRotateR { background-position: -33px 0; border-right: 1px solid #3e3e3e; } //修改#fancybox-buttons ul中的width属性
jquery.fancybox-buttons.js修改
F.helpers.buttons = { defaults : { skipSingle : false, // disables if gallery contains single image position : 'top', // 'top' or 'bottom' tpl : '<div id="fancybox-buttons"><ul><li><a class="btnPrev" title="Previous" href="javascript:;"></a></li><li><a class="btnPlay" title="Start slideshow" href="javascript:;"></a></li><li><a class="btnNext" title="Next" href="javascript:;"></a></li><li><a class="btnToggle" title="Toggle size" href="javascript:;"></a></li><li><a class="btnClose" title="Close" href="javascript:;"></a></li></ul></div>' } /**增加下边的旋转按钮*/ <li><a class="btnRotateL" title="left" href="javascript:;"></a></li><li><a class="btnRotateR" title="right" href="javascript:;"></a></li>
afterShow: function (opts, obj) { var buttons = this.buttons; if (!buttons) { this.list = $(opts.tpl).addClass(opts.position).appendTo('body'); buttons = { prev : this.list.find('.btnPrev').click( F.prev ), next : this.list.find('.btnNext').click( F.next ), play : this.list.find('.btnPlay').click( F.play ), toggle : this.list.find('.btnToggle').click( F.toggle ), close : this.list.find('.btnClose').click( F.close ), rotateL : this.list.find('.btnRotateL').click( F.rotateL ),//增加左转单击事件 rotateR : this.list.find('.btnRotateR').click( F.rotateR )//增加右转单击事件 } } //Prev if (obj.index > 0 || obj.loop) { buttons.prev.removeClass('btnDisabled'); } else { buttons.prev.addClass('btnDisabled'); } //Next / Play if (obj.loop || obj.index < obj.group.length - 1) { buttons.next.removeClass('btnDisabled'); buttons.play.removeClass('btnDisabled'); } else { buttons.next.addClass('btnDisabled'); buttons.play.addClass('btnDisabled'); } this.buttons = buttons; this.onUpdate(opts, obj); }
2.修改jquery.fancybox.js
为div增加id
// HTML templates tpl: { wrap : '<div id="fancybox-wrap" class="fancybox-wrap" tabIndex="-1"><div id="fancybox-skin" class="fancybox-skin"><div id="fancybox-outer" class="fancybox-outer"><div id="fancybox-content" class="fancybox-inner"></div></div></div></div>', image : '<img id="fancybox-img" class="fancybox-image" src="{href}" alt="" />', iframe : '<iframe id="fancybox-frame{rnd}" name="fancybox-frame{rnd}" class="fancybox-iframe" frameborder="0" vspace="0" hspace="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen' + (IE ? ' allowtransparency="true"' : '') + '></iframe>', error : '<p class="fancybox-error">The requested content cannot be loaded.<br/>Please try again later.</p>', closeBtn : '<a title="Close" class="fancybox-item fancybox-close" href="javascript:;"></a>', next : '<a title="Next" class="fancybox-nav fancybox-next" href="javascript:;"><span></span></a>', prev : '<a title="Previous" class="fancybox-nav fancybox-prev" href="javascript:;"><span></span></a>' }
增加旋转相关的js函数
定义全局rad变量,用于赋值旋转的角度
rotateL : function(){ var f_w = $("#fancybox-content").width(); var f_h = $("#fancybox-content").height(); var translate = (f_h - f_w)/2; rad=rad-90; if(rad==-360){ rad = 0; } //if($.browser.msie){ // if($.browser.version=="7.0"||$.browser.version=="8.0"){ // F.rotIsIE(f_w,f_h,translate); // }else{ // F.rot(f_w,f_h,translate); // } //}else{ // F.rot(f_w,f_h,translate); //} F.rot(f_w,f_h,translate); }, rotateR : function(){ var f_w = $("#fancybox-content").width(); var f_h = $("#fancybox-content").height(); var translate = (f_h - f_w)/2; rad=rad+90; if(rad==360){ rad = 0; } //if($.browser.msie){ // if($.browser.version=="7.0"||$.browser.version=="8.0"){ // F.rotIsIE(f_w,f_h,translate); // }else{ // F.rot(f_w,f_h,translate); // } //}else{ // F.rot(f_w,f_h,translate); //} F.rot(f_w,f_h,translate); }, rot : function(f_w,f_h,translate){ if(rad/90%2){ $("#fancybox-img").css("-webkit-transform","translate("+(translate-4)+"px,"+(-translate)+"px)"+" rotate("+rad+"deg)").css("-moz-transform","translate("+(translate-4)+"px,"+(-translate)+"px)"+" rotate("+rad+"deg)").css("-o-transform","translate("+(translate-4)+"px,"+(-translate)+"px)"+" rotate("+rad+"deg)").css("-ms-transform","translate("+(translate-4)+"px,"+(-translate)+"px)"+" rotate("+rad+"deg)").css("transform","translate("+(translate-4)+"px,"+(-translate)+"px)"+" rotate("+rad+"deg)"); $("#fancybox-img").height(f_h).width(f_w); $("#fancybox-content").height(f_w).width(f_h); $("#fancybox-wrap").width($("#fancybox-content").width()+20); var left = $("#fancybox-wrap").css("left"); var leftvalue = left.substring(0,left.length - 2); var tempvalue = ($("#fancybox-content").height()-$("#fancybox-content").width())/2; var pianyivalue = parseInt(leftvalue) + parseInt(tempvalue); $("#fancybox-wrap").css("left",pianyivalue+"px"); }else{ $("#fancybox-img").css("-webkit-transform","rotate("+rad+"deg)").css("-moz-transform","rotate("+rad+"deg)").css("-o-transform","rotate("+rad+"deg)").css("-ms-transform","rotate("+rad+"deg)").css("transform","translate(-4px, 0px) rotate("+rad+"deg)"); $("#fancybox-img").height("100%").width("100%"); $("#fancybox-content").height(f_w).width(f_h); $("#fancybox-wrap").width($("#fancybox-content").width()+20); var left = $("#fancybox-wrap").css("left"); var leftvalue = left.substring(0,left.length - 2); var tempvalue = ($("#fancybox-content").height()-$("#fancybox-content").width())/2; var pianyivalue = parseInt(leftvalue) + parseInt(tempvalue); $("#fancybox-wrap").css("left",pianyivalue+"px"); } }, rotIsIE : function (f_w,f_h,translate){ if(rad/90%2){ F.progidIE(); $("#fancybox-img").height(f_h).width(f_w); $("#fancybox-content").height(f_w).width(f_h); $("#fancybox-wrap").width($("#fancybox-content").width()+20); var left = $("#fancybox-wrap").css("left"); var leftvalue = left.substring(0,left.length - 2); var tempvalue = ($("#fancybox-content").height()-$("#fancybox-content").width())/2; var pianyivalue = parseInt(leftvalue) + parseInt(tempvalue); $("#fancybox-wrap").css("left",pianyivalue+"px"); }else{ F.progidIE(); $("#fancybox-img").height("100%").width("100%"); $("#fancybox-content").height(f_w).width(f_h); $("#fancybox-wrap").width($("#fancybox-content").width()+20); var left = $("#fancybox-wrap").css("left"); var leftvalue = left.substring(0,left.length - 2); var tempvalue = ($("#fancybox-content").height()-$("#fancybox-content").width())/2; var pianyivalue = parseInt(leftvalue) + parseInt(tempvalue); $("#fancybox-wrap").css("left",pianyivalue+"px"); } }, progidIE : function(){ alert(rad); switch(rad/90){ case -3: $("#fancybox-img").css("filter","progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"); break; case -2: $("#fancybox-img").css("filter","progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"); break; case -1: $("#fancybox-img").css("filter","progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"); break; case 0: $("#fancybox-img").css("filter","progid:DXImageTransform.Microsoft.BasicImage(rotation=0)"); break; case 1: $("#fancybox-img").css("filter","progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"); break; case 2: $("#fancybox-img").css("filter","progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"); break; case 3: $("#fancybox-img").css("filter","progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"); break; } },
修改next和prev方法
// Navigate to next gallery item next: function ( direction ) { var current = F.current; rad = 0;//加入重置rad值 if (current) { if (!isString(direction)) { direction = current.direction.next; } F.jumpto(current.index + 1, direction, 'next'); } }, // Navigate to previous gallery item prev: function ( direction ) { var current = F.current; rad = 0;//加入重置rad值 if (current) { if (!isString(direction)) { direction = current.direction.prev; } F.jumpto(current.index - 1, direction, 'prev'); } }
修改jquery.fancybox.css
.fancybox-image { max-width: 100%; max-height: 100%; } //改为 .fancybox-image { width: 100%; height: 100%; }
完成可以,查看效果了