赞
踩
最终效果图展示:
1.首先在html中写上名为 perspective 的div盒子
2.再在其中加上放图片的容器div,ID名为 wrap
3.然后在HTML文件同级目录images下放10张规格大致相同的图片,路径如下
<!--盒子--> <div id="perspective"> <!--容器--> <div id="wrap"> <img src="images/1.jpg" alt=""> <img src="images/2.jpg" alt=""> <img src="images/3.jpg" alt=""> <img src="images/4.jpg" alt=""> <img src="images/5.jpg" alt=""> <img src="images/6.jpg" alt=""> <img src="images/7.jpg" alt=""> <img src="images/8.jpg" alt=""> <img src="images/9.jpg" alt=""> <img src="images/10.jpg" alt=""> <img src="images/11.jpg" alt=""> </div> </div>
一些基本的属性如下
注意其中图片img 定义了X轴Y轴旋转度数,初始为0度
* { margin: 0px; padding: 0px; } body { overflow: hidden; background: #000000; } #wrap img { width: 133px; height: 200px; position: absolute; /*绝对定位*/ top: 0px; transform: rotateX(0deg) rotateY(0deg); }
1
.perspective: 800px;定义盒子3D视图距离 (即其深度(Z轴)深800px)
perspective 属性定义 3D 元素距视图的距离,以像素计。该属性允许您改变 3D 元素查看 3D 元素的视图。
2
transform-style 属性规定如何在 3D 空间中呈现被嵌套的元素。
preserve-3d子元素将保留其 3D 位置。
同样容器也定义了X轴Y轴旋转度数,初始为0度
#perspective { perspective: 800px; /*场景景深800px*/ } #wrap { position: relative; /*容器 相对定位*/ width: 133px; height: 200px; border: 1px solid #ffffff; margin: 150px auto; transform-style: preserve-3d; /*定义3d属性*/ transform: rotateX(-10deg) rotateY(0deg); }
此时效果如下
1.var Deg = 360 / oImg.length;
oImg对象长度为11(本列中有11张图片),即oImg.length=11
则Deg则为图片单位旋转度数,实际上为了实现3d效果,每张图片因索引值index而有着不同的旋转度数,
2. Array.prototype.forEach.call(oImg, function (el, index){}
prototype 属性使您有能力向对象添加属性和方法。
3. 图片的transform属性, 旋转度数变为 Deg*index
比如第一张图片旋转度数为(360/11)*0=0,即不旋转正对屏幕
后面图片的依次多旋转360/11度
4 translateZ(350px)";
所有图片都向内移动350px
若将350px改为800px,则视图平面将位于容器内部,即看不到正对容器最前面的几张图
5. el.style.zIndex = -index;
通过index索引值 设置每张图片的z-index,使索引值小的图片置于顶层
6. el.style.transition = "transform 1s " + index*0.1+“s”;
同样通过每张图片索引值index的不同 设置过度时间 使每张图片延迟时间不同 每张图片过过渡时间依次增加0.1秒
7.注意:forEach是数组的方法,非数组不能直接用
window.onload = function () { var oImg = document.getElementsByTagName("img"); //通过过标签获取元素节点 var oWrap = document.getElementById("wrap"); //通过ID获取元素 var Deg = 360 / oImg.length; //初始度数为360/11 Array.prototype.forEach.call(oImg, function (el, index) { //改变横向度数(Y),且度数随图片索引值不同而不同 el.style.transform = "rotateY(" + Deg * index + "deg) translateZ(350px)"; //通过index索引值增大设置z-index,使索引值小的图片置于顶层 el.style.zIndex = -index; //过度 根据图片索引值不同每张图片延迟时间不同 el.style.transition = "transform 1s " + index*0.1+"s"; }); }
此时效果如下图所示
设置要用到的变量
var nowX=0 , nowY = 0; //现在的鼠标坐标
var lastX=0 , lastY = 0; //上一次的鼠标坐标
var minX=0 , minY = 0; //两次鼠标坐标 距离差
var roX=-10, roY = 0; //容器旋转总度数
1. 当点击时,通过参数获得鼠标点击位置的坐标 ev.clientX,ev.clientY,并赋值给"上一次的鼠标坐标",成为旧值
注意:IE游览器不支持通过参数获得event对象,需通过var ev = window.event;
2. 拖动鼠标时计算鼠标移动的距离差,并且再一次获得当前鼠标坐标位置 赋值给"现在的鼠标坐标"
3. 计算鼠标坐标距离差(X,Y方向都单独计算),再分别累加到X,Y轴旋转总度数roX,roY上,然后改变容器属性产生旋转
4 最后松开鼠标时,鼠标移动事件和松开事件都结束.
//点 document.onmousedown = function(ev){ var ev = ev; //获取event对象 lastX = ev.clientX; lastY = ev.clientY; //拖 this.onmousemove = function(ev){ var ev = ev ; nowX = ev.clientX; nowY = ev.clientY; minX = nowX - lastX; minY = nowY - lastY; //TODO roX -= minY; //左右滚动 总度数 roY += minX; //上下滚动 oWrap.style.transform = "rotateX(" + roX + "deg) rotateY(" + roY +"deg)"; lastX = nowX,lastY = nowY; } //松 this.onmouseup = function(){ this.onmousemove = null; //松开鼠标 移动事件结束 this.onmouseup = null; //松开鼠标 松开事也件结束 } }
此时3d旋转相册效果就达成了
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。