这是一款使用jQueryCSS3来制作的炫酷的带倒影的3D万花筒旋转动画特效。该3D万花筒特效通过简单的CSS transform和jquery代码来实现在用户鼠标按下时,万花筒图片可以跟随鼠标进行3D旋转动画。

使用方法

在页面底部,<body>标签结束之前,引入jquery文件。

<script src="path/to/js/jquery.min.js"></script>
                
HTML结构

该3D万花筒旋转动画特效的基本HTML结构如下:

<div class="pic">
  <img src="img/1.jpg"/>
  <img src="img/2.jpg" />
  <img src="img/3.jpg"/>
  <img src="img/4.jpg"/>
  <img src="img/5.jpg"/>
  <img src="img/6.jpg"/>
  <img src="img/7.jpg"/>
  <img src="img/8.jpg"/>
  <img src="img/9.jpg"/>
  <img src="img/10.jpg"/>
  <p></p>
</div>    
                
CSS样式

设置全局样式如下:

*{margin:0;padding: 0;}
body{background-color: #000;overflow:hidden;}                  
                

为3D万花筒容器元素.pic设置固定的宽度和高度,然后通过transform属性来依次设置透视效果perspective为800像素,绕X轴旋转rotateX()-10度,绕Y轴旋转rotateY()0度。

.pic{
  width: 120px;
  height: 180px;
  margin: 150px auto 0;
  position: relative;
  /*transform 旋转元素*/
  transform-style:preserve-3d;
  transform:perspective(800px) rotateX(-10deg) rotateY(0deg);
}
                

然后为每一张图片设置box-shadow阴影效果,以及使用-webkit-box-reflect属性来制作阴影效果。

.pic img{
  position: absolute;
  width: 100%;
  height: 100%;
  border-radius: 5px;
  box-shadow: 0px 0px 10px #fff;
  /*倒影的设置*/
  -webkit-box-reflect:below 10px -webkit-linear-gradient(top,rgba(0,0,0,0) 50%,rgba(0,0,0,.5) 100%);
}                  
                

容器中空的<p>元素用于制作一个椭圆形渐变效果。

.pic p{
  width: 1200px;
  height: 1200px;
  background: -webkit-radial-gradient(center center,600px 600px,rgba(255,255,255,.5),rgba(0,0,0,0));
  position: absolute;
  top:100%;left:50%;
  margin-top: -600px;
  margin-left: -600px;
  border-radius:600px;
  transform:rotateX(90deg);
}                  
                
JavaScript

在页面DOM元素加载完毕之后,使用下面的方法来初始化该3D万花筒特效。

$(function(){

  var imgL=$(".pic img").size();
  var deg=360/imgL;
  var roY=0,roX=-10;
  var xN=0,yN=0;
  var play=null;

  $(".pic img").each(function(i){
    $(this).css({
      <!--translateZ 定义2d旋转沿着z轴-->
      "transform":"rotateY("+i*deg+"deg) translateZ(300px)" });
      <!--防止图片被拖拽-->
      $(this).attr('ondragstart','return false');
    });

    $(document).mousedown(function(ev){
    var x_=ev.clientX;
    var y_=ev.clientY;
    clearInterval(play);
      console.log('我按下了');
      $(this).bind('mousemove',function(ev){
        /*获取当前鼠标的坐标*/
        var x=ev.clientX;
        var y=ev.clientY;
              /*两次坐标之间的距离*/
                xN=x-x_;
          yN=y-y_;

         roY+=xN*0.2;
        roX-=yN*0.1;
        console.log('移动');
  
        $('.pic').css({
          transform:'perspective(800px) rotateX('+roX+'deg) rotateY('+roY+'deg)'
        });
        /*之前的鼠标坐标*/
           x_=ev.clientX;
           y_=ev.clientY;

      });
    }).mouseup(function(){
            $(this).unbind('mousemove');
            var play=setInterval(function(){
             
             xN*=0.95;
             yN*=0.95
             if(Math.abs(xN)<1 && Math.abs(yN)<1){
                clearInterval(play);
             }
              roY+=xN*0.2;
        roX-=yN*0.1;
        $('.pic').css({
          transform:'perspective(800px) rotateX('+roX+'deg) rotateY('+roY+'deg)'
        });

      },30);

    });

  });