Html
    Css
    Js

    
                        

                        
↑上面代码改变,会自动显示代码结果 jQuery调用版本:1.11.3
 立即下载

jQuery制作图片旋转效果

实现原理并不复杂,在数学上只用到了其中的正弦函数,制作过程大致如下:

(1)先定义好图片旋转的半径

(2)图片旋转的过程需要用到setInterval()方法,来获取每一张图片所在位置的的角度,角度会根据时间变化逐渐变化

(3)根据一个数学公式:x=R*SIN(deg)可以获得图片在X方向的位置

(4)透明度的设置其实也是根据图片旋转时候的角度来定的。初始设置图片在正前方时是0度,无论是正时针还是逆时针方式旋转,当图片旋转角度大于0度

    小于180度时图片的透明度是逐渐减小的,这里为了图片在180度时不至于完全透明加了个小小的计算公式,代码会在下面展示。

(5)图片的缩放也是根据图片旋转角度而定的,相信容易理解。

(6)有了图片的X轴位置信息,缩放信息,透明度信息后,接下来就是很简单的事情了,只要将所有的信息通过CSS样式显示出来就可以了。

css的样式会通过setInterval()方法逐渐改变。

下面来看下主要代码:

var thisleft=-(o.radius)*Math.sin((360/imgnum)*$(this).data("index")*(Math.PI*2/360))+(holderwidth/2);
var thiszindex=360/imgnum*$(this).data("index")>180?360/imgnum*$(this).data("index")-360:-360/imgnum*$(this).data("index");
var thisopacity=360/imgnum*$(this).data("index")<=180?(180-360/imgnum*$(this).data("index"))/180*1.2:
(360/imgnum*$(this).data("index")-180)/180*1.2;

第二行的thiszindex是图片的深度信息,对每张图片我都给它加了一个index属性保存其索引值,图片会根据这个信息通过计算得到相应的深度值。

第三行的thisopacity是图片的透明度信息。

每一张图片都会被赋予一下的CSS样式:

$(this).css({
  "left":thisleft-(o.width*thisopacity)/2+"px",
  "top":(holderheight/2)-o.width*(thisopacity+1)/4,
  "z-index":thiszindex+180,
  "opacity":(thisopacity+0.2)/1.2,
  "width":o.width*(thisopacity+1)/2,
  "height":o.height*(thisopacity+1)/2
});

第五行的opacity用了一个简单的公式使其在最深度时不至于完全透明。

在功能上我加了左右转的功能,其原理也就是将图片的X轴信息的正负值转换而已,代码如下:

if(dir=='left'){
  thisleft=-(o.radius)*Math.sin(xx*(Math.PI*2/360))+(holderwidth/2);
  }else{
  thisleft=(o.radius)*Math.sin(xx*(Math.PI*2/360))+(holderwidth/2);
}

整个效果中用户可以自定义一下参数:

$.fn.scroll3d.defaults={
 speed:25,
 radius:100,
 width:200,
 height:150,
 direction:'left' 
}

下面附上效果的完整代码:

(function($) {
	$.fn.scroll3d = function(options) {
		var opts = $.extend({},
		$.fn.scroll3d.defaults, options);
		var $this = $(this);
		var o = $.meta ? $.extend({},
		opts, $(this).data()) : opts;
		var radius = o.radius;
		var timer = 0;
		var xx = 0;
		var speed = o.speed;
		var dir = o.direction;
		$(this).hide();
		return this.each(function() {
			var $img = $(this).find('img').css({
				'position': 'absolute'
			}),
			num = 0;
			var imgnum = $img.length;
			var holderwidth = $(this).width(),
			holderheight = $(this).height();
			$img.each(function(i) {
				var imgsrc = $(this).attr("src");
				$(this).data({
					"index": i
				});
				$(this).load(function() {++num;
					if (num == imgnum) {
						$this.show();
					}
				}).attr({
					"src": imgsrc
				});
				var thisleft = -(o.radius) * Math.sin((360 / imgnum) * $(this).data("index") * (Math.PI * 2 / 360)) + (holderwidth / 2);
				var thiszindex = 360 / imgnum * $(this).data("index") > 180 ? 360 / imgnum * $(this).data("index") - 360 : -360 / imgnum * $(this).data("index");
				var thisopacity = 360 / imgnum * $(this).data("index") <= 180 ? (180 - 360 / imgnum * $(this).data("index")) / 180 * 1.2 : (360 / imgnum * $(this).data("index") - 180) / 180 * 1.2;
				$(this).attr({
					"nowdeg": (360 / imgnum) * $(this).data("index")
				});
				$(this).css({
					"left": thisleft - (o.width * thisopacity) / 2 + "px",
					"top": (holderheight / 2) - o.width * (thisopacity + 1) / 4,
					"z-index": thiszindex + 180,
					"opacity": (thisopacity + 0.2) / 1.2,
					"width": o.width * (thisopacity + 1) / 2,
					"height": o.height * (thisopacity + 1) / 2
				});
			});
			function scrollimg() {
				$img.each(function() {
					var thisdeg = $(this).attr('nowdeg');
					var thisleft;
					xx = thisdeg;
					if (dir == 'left') {
						thisleft = -(o.radius) * Math.sin(xx * (Math.PI * 2 / 360)) + (holderwidth / 2);
					} else {
						thisleft = (o.radius) * Math.sin(xx * (Math.PI * 2 / 360)) + (holderwidth / 2);
					}
					var thiszindex = xx > 180 ? xx - 360 : -xx;
					var thisopacity = xx <= 180 ? (180 - xx) / 180 : ($(this).attr('nowdeg') - 180) / 180;
					$(this).css({
						"left": thisleft - (o.width * thisopacity) / 2 + "px",
						"top": (holderheight / 2) - o.width * (thisopacity + 1) / 4,
						"z-index": thiszindex + 180,
						"opacity": (thisopacity + 0.2) / 1.2,
						"width": o.width * (thisopacity + 1) / 2,
						"height": o.height * (thisopacity + 1) / 2
					});
					xx++;
					if (xx > 360) xx = 0;
					$(this).attr({
						"nowdeg": xx
					});
				});
			};
			var tt = setInterval(scrollimg, speed);
			$img.hover(function() {
				clearInterval(tt);
			},
			function() {
				tt = setInterval(scrollimg, speed);
			});
		});
	};
	$.fn.scroll3d.defaults = {
		speed: 25,
		radius: 300,
		width: 200,
		height: 150,
		direction: 'left'
	}
})(jQuery);

在HTML中只需要有一个DIV包含你所需要的图片就可以完成这个效果,例如:

<div class="holder" style="width:550px;height:300px;position:relative;">
 <img src="img/1.jpg" />
 <img src="img/2.jpg" />
 <img src="img/3.jpg" />
 <img src="img/1.jpg" />
 <img src="img/2.jpg" />
</div>

代码的调用可以这样写:

$('.holder').scroll3d();
0