什么是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%;
}
完成可以,查看效果了