zoukankan      html  css  js  c++  java
  • jQuery制作图片旋转效果

    这是本人第一次在博客园写点东西,初出茅庐,东西写的不好还请各位看官,各位兄弟姐妹不要见笑。

    以前用JQuery写过一个纵深方向上的图片旋转效果,在这里拿出来跟大家分享下,贴上一张图片看看效果是如何的:

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

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

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

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

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

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

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

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

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

    下面来看下主要代码:

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

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

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

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

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


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

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

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

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

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

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

      1 (function($) {
      2     $.fn.scroll3d = function(options) {
      3       var opts = $.extend({}, $.fn.scroll3d.defaults, options);
      4       var $this = $(this);
      5       var o = $.meta ? $.extend({}, opts, $(this).data()) : opts;
      6       var radius = o.radius;
      7       var timer = 0;
      8       var xx = 0;
      9       var speed = o.speed;
     10       var dir = o.direction;
     11       $(this).hide();
     12       
     13       return this.each(function() {
     14         var $img = $(this).find('img').css({'position': 'absolute'}), num = 0;
     15         var imgnum = $img.length;
     16         var holderwidth = $(this).width(),
     17           holderheight = $(this).height();
     18 
     19         $img.each(function(i) {
     20           var imgsrc = $(this).attr("src");
     21           $(this).data({
     22             "index": i
     23           });
     24 
     25           $(this).load(function() {
     26             ++num;
     27             if (num == imgnum) {
     28               $this.show();
     29             }
     30           }).attr({
     31             "src": imgsrc
     32           });
     33 
     34           var thisleft = -(o.radius) * Math.sin((360 / imgnum) * $(this).data("index") * (Math.PI * 2 / 360)) + (holderwidth / 2);
     35           var thiszindex = 360 / imgnum * $(this).data("index") > 180 ? 360 / imgnum * $(this).data("index") - 360 : -360 / imgnum * $(this).data("index");
     36           var thisopacity = 360 / imgnum * $(this).data("index") <= 180 ? (180 - 360 / imgnum * $(this).data("index")) / 180 * 1.2 :
     37             (360 / imgnum * $(this).data("index") - 180) / 180 * 1.2;
     38 
     39           $(this).attr({
     40             "nowdeg": (360 / imgnum) * $(this).data("index")
     41           });
     42 
     43           $(this).css({
     44             "left": thisleft - (o.width * thisopacity) / 2 + "px",
     45             "top": (holderheight / 2) - o.width * (thisopacity + 1) / 4,
     46             "z-index": thiszindex + 180,
     47             "opacity": (thisopacity + 0.2) / 1.2,
     48             "width": o.width * (thisopacity + 1) / 2,
     49             "height": o.height * (thisopacity + 1) / 2
     50           });
     51         });
     52 
     53         function scrollimg() {
     54           $img.each(function() {
     55             var thisdeg = $(this).attr('nowdeg');
     56             var thisleft;
     57             xx = thisdeg;
     58 
     59             if (dir == 'left') {
     60               thisleft = -(o.radius) * Math.sin(xx * (Math.PI * 2 / 360)) + (holderwidth / 2);
     61             } else {
     62               thisleft = (o.radius) * Math.sin(xx * (Math.PI * 2 / 360)) + (holderwidth / 2);
     63             }
     64 
     65             var thiszindex = xx > 180 ? xx - 360 : -xx;
     66             var thisopacity = xx <= 180 ? (180 - xx) / 180 : ($(this).attr('nowdeg') - 180) / 180;
     67 
     68             $(this).css({
     69               "left": thisleft - (o.width * thisopacity) / 2 + "px",
     70               "top": (holderheight / 2) - o.width * (thisopacity + 1) / 4,
     71               "z-index": thiszindex + 180,
     72               "opacity": (thisopacity + 0.2) / 1.2,
     73               "width": o.width * (thisopacity + 1) / 2,
     74               "height": o.height * (thisopacity + 1) / 2
     75             });
     76 
     77             xx++;
     78             if (xx > 360) xx = 0;
     79             $(this).attr({
     80               "nowdeg": xx
     81             });
     82           });
     83         };
     84 
     85         var tt = setInterval(scrollimg, speed);
     86 
     87         $img.hover(function() {
     88           clearInterval(tt);
     89         }, function() {
     90           tt = setInterval(scrollimg, speed);
     91         });
     92 
     93       });
     94     };
     95 
     96     $.fn.scroll3d.defaults = {
     97       speed: 25,
     98       radius: 300,
     99        200,
    100       height: 150,
    101       direction: 'left'
    102     }
    103   })(jQuery);

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

    <div class="holder" style="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();

    写的有点乱七八糟,还望各位见谅!

    压缩包:test.zip







  • 相关阅读:
    Mysql Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column To disable safe mode
    vs2012+ winform+.net4.0发布如何在xp上运行
    ubuntu下手动配置apache2.4.12
    mysql连接错误解决(ERROR 2049 (HY000): Connection using old (pre-4.1.1) authentication protocol ref used (client option 'secure_auth' enabled))
    位运算取绝对值
    位运算两数交换
    java mysql prepareStatement模糊查询like使用注意
    idea14远程调试linux下的tomcat
    web视频播放插件:Video For Everybody
    cmd杀死进程
  • 原文地址:https://www.cnblogs.com/moyiqing/p/2318952.html
Copyright © 2011-2022 走看看