`

扩展fancybox图片展示js插件,实现对图片的旋转

 
阅读更多

什么是FancyBox?

FancyBox是一款基于jquery开发的类Lightbox插件。支持对放大的图片添加阴影效果,对于一组相关的图片添加导航操作按纽,该lightbox除了能够展示图片之外,还可以展示iframed内容,通过css自定义外观。

该插件自身提供了不少功能及效果,其特点如下:

  1. 可以支持图片、html文本、flash动画、iframe以及ajax的支持。
  2. 可以自定义播放器的CSS样式。
  3. 可以以组的形式进行播放。
  4. 如果将鼠标滚动插件(mouse wheel plugin)包含进来的话Fancybox还能支持鼠标滚轮滚动来翻阅图片。
  5. 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%;
}

    完成可以,查看效果了

0
0
分享到:
评论
3 楼 java小叶檀 2015-05-08  
按着做效果是出来了 有一些小细节确实得研究一下代码 有一个需要优化的地方:旋转正方形图很完美,但是如果是长方形图就会变形。还得再研究下 具体采用的原理是css3的webkit-transform: rotate(40deg);这个属性
2 楼 java小叶檀 2015-05-07  
我很想说你这是在哪抄的别人博客
1 楼 yj20141126 2015-01-22  
博主,我按照你写的教程实验了一下 没有任何效果  你能提供的一个你修改过的fancybox使图片旋转的demo进行下载吗  非常感谢

相关推荐

Global site tag (gtag.js) - Google Analytics