以前用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" >
<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();
写的有点乱七八糟,还望各位见谅!
压缩包:test_jb51.rar
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持天达云!