首先来看一下今天的炫酷效果:

首先分析一下这张图片:

1.每张图片都有倒影

2.这11张图片呈圆形均匀排列

3.可旋转,上下移动(当然这是效果做出来以后,图片是分析不出来的)

那下面就开始吧。

一。准备

新建三个文件夹分别命名为css,js,img分别存放demo.css,jquery.js、demo.js,11张示例图片。新建demo.html将demo.css,jquery.js,demo.js引入。

二。图片倒影制作

 <div id="wrap">
<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">
<img src="img/11.jpg">
</div>

首先我们新建一个大的div来包裹这11张图片

*{
padding:;
margin:;
}
body{
background:#000;
overflow:hidden;
}
#wrap{
width:133px;
height:200px;
margin: 200px auto;
position:relative;
transform-style:preserve-3d;
transform:perspective(900px) rotateX(-10deg) rotateY(0deg);
}
#wrap img{
position:absolute;
top:;
left:;
box-shadow: 0 0 10px #FFFFFF;
border-radius:10px;
box-reflect:below 8px linear-gradient(top,rgba(0,0,0,0) 40%,rgba(0,0,0,.7) 100%);
-webkit-box-reflect:below 8px -webkit-linear-gradient(top,rgba(0,0,0,0) 40%,rgba(0,0,0,.7) 100%);
}

(1)*这里就不多说了,是为了消除浏览器默认的间距。

(2)body属性设置背景颜色为黑色,溢出隐藏(这里主要是为了不出现滚动条影响图片整体效果)。

(3)#wrap它的宽高大家一定很好奇为什么会那么小,他的宽高是等同于一张图片的宽高,这里是为了使后期制作旋转时候它能够以图片自身旋转而不跑偏(这里大家不明白的话,可以写完所有代码后设置一个较大的值,试试就知道了哦)。

  margin主要是为了让图片水平居中距上下200px。

  transform-style:preserve-3d主要是让图片展示出3d效果。

  transform:perspective(900px)[这个属性设置镜头到元素平面的距离(大家如果不好理解的话就记住这个是利用近大远小的道理后期可以调节他的大小实验哦)] rotateX(-10deg)[围绕x轴旋转-10°] rotateY(0deg)[围绕y轴旋转0°]。告诉大家一个简单易懂的方法,画一个平面直角坐标系,这是非常直观的。

(4)#wrap img是规定了#wrap里面的img属性,前面的绝对定位是为了让所有图片重叠在一起。

  box-shadow设置设置了他的阴影效果

  border-radius设置了它的圆角大小

  box-reflect设置它的倒影效果

  这里就不过多陈述css3属性的用法了,大家可以在w3c查看。

二。使图片均匀分布

$(function(){
$('#wrap img').each(function(i) {
//遍历 $('#wrap img')----改变他们的css样式
$(this).css('transform', 'rotateY('+ i*Deg +'deg) translateZ(350px)').attr('ondragstart','return false');
  //旋转以及禁止拖拽复制
});
})

如果设置css属性有疑问的话,可以这样想:translateZ(350px)设置了Z轴的距离,把他看成以(0,0)为圆心,350px为半径的圆,把图片均匀分布在圆上。

这里设置了图片禁止拖拽的属性,与之相呼应的是我们需要的html页面加上这个属性

<html onselectstart='return false'>

不加这个的话页面会报错。当然如果不加的话不影响现在图片的显示,但是会影响下面做图片的旋转。

进行到这步为止,图片上的效果就展示出来了,但是现在是生硬的,没有动画,只是静态的显示。

三。旋转、移动图片

思路:

当鼠标按下并滑动的时候wrap的整体也是跟着滑动的,所以需要记录鼠标开始到结束的位置,根据鼠标x轴和y轴之间的差值,计算#wrap需要旋转和移动的大小

 $(function(){
  var imgL = $('#wrap img').length;
//获取当前的img 长度
var Deg = 360 / imgL;
// 360/imgL 和角度有关系
var roY = 0,roX = -10,xN,yN;
$(document).mousedown(function(ev){
  //绑定事件 鼠标按下时触发的时间
var x_ = ev.clientX;
//获取当前鼠标相对于浏览器页面(或客户区)的 x 方向的位置 保存在变量 x_
var y_ = ev.clientY;
//………………y方向的位置 保存在变量y_
$(this).bind('mousemove',function(ev){
  //给当前元素 (这里的当前元素是document )绑定 mousemove(鼠标在当前元素内移动的事件)
   var x = ev.clientX;
  //获取当前鼠标相对于浏览器页面(或客户区)的 x 方向的位置 保存在变量 x
  var y = ev.clientY;
  //………………y方向的位置 保存在变量y
  xN = x - x_;
  //计算鼠标在当前元素内 相对 上次鼠标按下时的 x轴距离 并保存在变量
  yN = y - y_;
  //计算鼠标在当前元素内 相对 上次鼠标按下时的 y轴距离 并保存在变量
roY += xN*0.2;
//按照比例换算 并在变量基础上增加(围绕Y轴旋转的角度,之所以乘0.2是为了不让自己的鼠标动作太敏感,可以改变数值试一下,理解个中含义)
roX +=yN*0.07;
//按照比例换算 并在变量基础上增加(围绕x轴旋转的角度,意义同上)
$('#wrap').css('transform','perspective(800px) rotateX('+ roX +'deg) rotateY('+ roY +'deg)');
//$('#wrap') 改变css动画transform样式 值为…………角度是变量roY,roX的
x_ = ev.clientX;
//并将鼠标按下的位置设置成当前移动到的位置
y_ = ev.clientY;
//并将鼠标按下的位置设置成当前移动到的位置
});
}).mouseup(function(){
//绑定事件 鼠标松开时触发的时间
$(this).unbind('mousemove');
// 移除 当前元素(这里的当前元素是document )的 mousemove(鼠标在当前元素内移动的事件)
});
});

注释讲的很清楚,这里就不过多赘述了,到现在已经可以看到效果了,按住鼠标左键上下拖动试试吧。

但是到此为止看到的效果又显得很生硬,不流畅,所以为他加个定时器,来让图片真正的转动起来。

    $(function(){
var imgL = $('#wrap img').size();
//获取当前的img 长度
console.log($('#wrap img').size());
var Deg = 360 / imgL;
// 360/imgL 和角度有关系
var roY = 0,roX = -10,xN,yN,play=null;
//挨个赋值 $('#wrap img').each(function(i) {
//遍历 $('#wrap img')----改变他们的css样式
$(this).css('transform', 'rotateY('+ i*Deg +'deg) translateZ(350px)')
.attr('ondragstart','return false');
//旋转以及禁止拖拽复制
}); $(document).mousedown(function(ev){
//绑定事件 鼠标按下时触发的时间
clearInterval( play );
//关闭计时器(play)
var x_ = ev.clientX;
//获取当前鼠标相对于浏览器页面(或客户区)的 x 方向的位置 保存在变量 x_
var y_ = ev.clientY;
//………………y方向的位置 保存在变量y_ $(this).bind('mousemove',function(ev){
//给当前元素 (这里的当前元素是document )绑定 mousemove(鼠标在当前元素内移动的事件)
var x = ev.clientX;
//获取当前鼠标相对于浏览器页面(或客户区)的 x 方向的位置 保存在变量 x
var y = ev.clientY;
//………………y方向的位置 保存在变量y xN = x - x_;
//计算鼠标在当前元素内 相对 上次鼠标按下时的 x轴距离 并保存在变量
yN = y - y_;
//计算鼠标在当前元素内 相对 上次鼠标按下时的 y轴距离 并保存在变量 roY += xN*0.2;
//按照比例换算 并在变量基础上增加
roX +=yN*0.07;
//按照比例换算 并在变量基础上增加 $('#wrap').css('transform','perspective(800px) rotateX('+ roX +'deg) rotateY('+ roY +'deg)');
//$('#wrap') 改变css动画transform样式 值为…………角度是变量roY,roX的 x_ = ev.clientX;
//并将鼠标按下的位置设置成当前移动到的位置
y_ = ev.clientY;
//并将鼠标按下的位置设置成当前移动到的位置
});
}).mouseup(function(){
//绑定事件 鼠标松开时触发的时间
$(this).unbind('mousemove');
// 移除 当前元素(这里的当前元素是document )的 mousemove(鼠标在当前元素内移动的事件)
play = setInterval(function(){
//开始周期性计时器
xN = xN * 0.95;
//按照比例换算
yN = yN * 0.95;
//按照比例换算
if ( Math.abs(xN) <= 0.5 && Math.abs(yN)<= 0.5 )
//判断 (xN的绝对值<=0.5)而且 yN的绝对值也要<= 0.5)的时候就执行下面的语句
{
clearInterval( play );
//关闭计时器(play)
}
roY += xN*0.2;
//按照比例换算 并在变量基础上增加
roX +=yN*0.07;
//按照比例换算 并在变量基础上增加
$('#wrap').css('transform','perspective(800px) rotateX('+ roX +'deg) rotateY('+ roY +'deg)');
//$('#wrap') 改变css动画transform样式 值为…………角度是变量roY,roX的
},30);
//计时器每30毫秒触发一次
});
});

这里为了比较直观定时器放在哪里,重复了上面的代码。

解释一下定时器:

当鼠标松开的时候如果没有定时器的话,旋转就到此为止了,但是这并不是这个效果想要的,当鼠标滑动幅度较大的时候,图片整体也会旋转不同角度,距离越大旋转的角度也就越大,并且到一定数值后让定时器停下来,代码与上面旋转的类似,这里不过多赘述。这里注意的是,一定要定时器停下来。乘不同数值会有不同的效果,如果不是很理解的话,改变数值看效果是你最好的选择,最近状态不好,思路可能没有之前写的好,请见谅/(ㄒoㄒ)/~~

css3+jquery制作3d旋转相册的更多相关文章

  1. CSS3特效----制作3D旋转导航

    大致思路:首先给 three-d-box 设置一个 transition是不可少的 然后每个 a 标签里面有两个 span 一个叫 font 一个叫 back,默认状态下 font 旋转0度,也就是没 ...

  2. css3制作3d旋转相册

    此处只是记录,解析可见原文:http://www.cnblogs.com/skyblue-li/p/6092799.html <!DOCTYPE html> <html xmlns= ...

  3. CSS3特效----制作3D旋转照片展示区

    任务一.制作多背景 提示:上层有一个径向渐变,渐变图像farthest-side ellipse at center,  rgba(246,241,232,.85) 39%,rgba(212,204, ...

  4. 一款基于jQuery和CSS3炫酷3D旋转画廊特效插件

    这是一款效果炫酷的jQuery和CSS3 3D旋转画廊特效插件.该3D画廊插件可以通过前后导航按钮来切换图片,效果就像旋转木马一样.它还带有点击放大图片,显示图片标题和用键盘操作等功能. 在线预览   ...

  5. 使用 CSS3 & jQuery 制作漂亮的书签动画

    今天的教程是关于创建使用 CSS 旋转变换和 JavaScript 制作动画书签效果.我们的想法是展现出样书状结构,使单一的色板或列表点击切换.当点击其中一项,我们就会旋转以显示所选择的项目. 在线演 ...

  6. 纯CSS3超酷3D旋转立方体动画特效

    简要教程 这是一款神奇的纯 CSS3 立方体动画特效插件.使用CSS3来制作动画效果已经成为WEB前端开发的一种时尚,从简单的颜色和尺寸动画,到复杂的旋转.翻转动画, CSS3 展现了它无穷的魅力.使 ...

  7. CSS3制作3D旋转视频展示区

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. CSS3实现3D旋转相册

    静态效果图: 代码如下: <!doctype html><html lang="en"><head> <meta charset=&quo ...

  9. 3D旋转相册(适合新手)

    <!DOCTYPE HTML> <html onselectstart="return false"> <head> <meta char ...

随机推荐

  1. Win10连接远程桌面时提示“您的凭据不工作”

    我遇到这个问题的时候查找网上都给出一堆高大上的解决办法, 然而我的错误实际上是用户名的问题, 很多人以为远程用户名就一定是锁屏状态下的登录名, 其实不是,跟自己设置有关,所以首先应该检查远程用户名是否 ...

  2. AutoMapper(二)

    返回总目录 首先,先创建一个控制台项目,引用AutoMapper程序集,创建三个类User,UserDto,UserMappingProfile,下面的知识点的演示都以此项目为基础,代码分别如下: n ...

  3. C#高级知识点&(ABP框架理论学习高级篇)——白金版

    前言摘要 很早以前就有要写ABP高级系列教程的计划了,但是迟迟到现在这个高级理论系列才和大家见面.其实这篇博客很早就着手写了,只是楼主一直写写停停.看看下图,就知道这篇博客的生产日期了,谁知它的出厂日 ...

  4. iOS开发系列--Swift进阶

    概述 上一篇文章<iOS开发系列--Swift语言>中对Swift的语法特点以及它和C.ObjC等其他语言的用法区别进行了介绍.当然,这只是Swift的入门基础,但是仅仅了解这些对于使用S ...

  5. 使用 Code Snippet 简化 Coding

    在开发的项目的时候,你是否经常遇到需要重复编写一些类似的代码,比如是否经常会使用 for.foreach ? 在编写这两个循环语句的时候,你是一个字符一个字符敲还是使用 Visual Studio 提 ...

  6. Html5 直接插入排序

    直接插入排序算法(Straight Insertion Sort),是排序算法中简单的一种算法,基本思想如下: 将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表.即:先将序列的第 ...

  7. maven repo plugin archiver

    Failure to transfer org.apache.maven:maven-archiver:pom:2.4.1 from http://repo1.maven.org/xxx was ca ...

  8. Atitit 软件架构方法的进化与演进cs bs soa roa  msa  attilax总结

    Atitit 软件架构方法的进化与演进cs bs soa roa  msa  attilax总结 1.1. 软件体系架构是沿着单机到 CS 架构,再到 BS 的三层架构甚至多层架构逐步发展过来的,关于 ...

  9. [转]VS2015中臃肿的ipch和sdf文件

    使用VS2010建立C++解决方案时,会生成SolutionName.sdf和一个叫做ipch的文件夹,这两个文件再加上*.pch等文件使得工程变得非常的庞大, 一个简单的程序都会占用几十M的硬盘容量 ...

  10. 用spm2构建seajs项目的过程

    前言 Javascript模块化规范有CommonJs规范,和主要适用于浏览器环境的AMD规范,以及国内的CMD规范,它是SeaJs遵循的模块化规范.因为以前项目中用SeaJs做过前端的模块管理工具, ...