html写3D旋转相册的原理,【源码+教程】3D旋转相册(css3+js/纯css)

编程知识 更新时间:2023-04-06 08:03:39

今天在抖音刷到了一个旋转相册,挺好玩的,就试着写了一下,我只是一个菜鸟,勿喷。另外,演示站请PC端食用,移动端不能拖拽(很卡)

工具:DW/Editplus等等都行、一部电脑/云电脑、有电、一堆图片

由于这是写着玩的,我就没按套路搞了(不喜欢看的,源码在最下面)

OK!步入正题,这里只讲代码,不讲萌新教程(重点都标出来了)

新建站点:名字自取,创建img文件夹存放图片,新建HTML文件

第一步:配置好景深(设置div盒子体现出景深)

首先设置一个盒子,由于是要体现景深的盒子,我就取名为perspective

然后我们需要一个用来放图片的盒子,并插入图片,我就取名为wrap了

`

第一步布局总代码为:

`

第二部,页面布局

首先清除默认边距:

*{margin:0;padding:0;}/*清除浏览器默认样式*/

接着把body的滚动条去掉,然后再加一个背景色:body{

background:#66677c;

overflow:hidden;

}

做完这些,效果是这样的:

然后再把图片缩在一起(wrap里面)相框大小与图片大小等同:#wrap{

width:149px;

height:200px;

margin:150px auto 0;/*居中*/

}

到这里效果如下图:

然后将其叠加:#wrap img{

position:absolute;

}

tips:需要在其父级(wrap)加上相对定位:

position:relative;

效果图如下:

然后设置景深。之前说了perspective是景深,代码如下:#perspective{

perspective:800px;/*场景景深*/

}

tips:什么是场景景深?场景景深就类似于一个视角问题。

然后给wrap元素赋予3D属性:

transform-style:preserve-3d;/*当前元素3D效果*/

设置wrap元素原始度数:

transform:rotateX(-20deg) rotateY(0deg);

然后我们需要计算图片入场动画时所需要旋转的度数,这个我们就交给JavaScript(HTML是从上执行到下的,所以这个放在最后 )

1.求出图片旋转的单位度数 360/图片的个数

①获取到所有图片:

var oImg = document.getElementsByTagName("img");//通过元素的名字获取节

②算出单位度数:

var deg = 360/oImg.length;//单位度数

2.针对每一张图片旋转相对应的度数

call改变数组的forEach方法中的实例执行 用元素集合去代替:[].forEach.call(oImg,function(node,index){

console.log(index*deg);//每张图片应该旋转的度数

node.style.transform = "rotateY("+index*deg+"deg)translatez(350px)";//赋予给图片,并撑开350px

});

①:设置图片精致拖拽,在最前面的里添加οndragstart="return false":

3.入场动画

在第2步的代码里加上过渡属性:

node.style.transition = "1s ";//过渡属性:时间

然后发现这个动画并没有过渡性(延迟加载)于是我搞了一下延迟加载(不加也能用)代码如下:

node.style.transition = "1s "+(oImg.length - index)*0.11+"s";

然后说一下特效是什么?

特效:JS控制元素节点 在指定的时间点改变元素的样式或者属性的值 算法 逻辑思维

4.拖拽元素:分开处理——点击(onmousedown)、移动(onmousemove)、松开(onmouseup)

点击事件:

document.onmousedown = function(e){}

移动事件(位于点击时间内,为什么?你吃饭为什么要煮饭):

document.onmousemove = function(e){}

松开事件(这里还是位于点击事件内,且要结束移动事件):document.onmouseup =function(e){

document.onmousemove = null; //清空鼠标移动事件}

接下来就很麻烦了,我也说不清,就不细说了(其实是懒):

5拖拽:每一次移动 移动了多少距离 每次鼠标的位置在哪里

每两次 是 哪两次移动了

距离 添加到原有的元素度数上

移动距离差 = 新的移动距离 - 旧的移动距离

①定义六个值:

var newX,newY,pervX,pervY,minusX,minusY;//分别为新值、旧值、差值

②定义的新值使用完后就变成了旧值(移动内):pervX = newX;

pervY = newY;//新的值用完之后就变成了旧的值

那么新值是从哪来的呢?

③第一次点击的值(很明显,点击内):pervX = e.clientX;

pervY = e.clientY;//第一次点击时候的值

④保存新值,计算差值,给给出旋转速度(移动内)://保存新的鼠标位置的值

newX = e.clientX;

newY = e.clientY;

minusX = newX - pervX;

minusY = newY - pervY;//差值

rotateX -= minusY*0.2;

rotateY += minusX*0.1;//距离差加上当前元素度数

oWrap.style.transform = "rotateX("+rotateX+"deg) rotateY("+rotateY+"deg)";

重要的差不多就是上面那些了(对了,舞台颜色用文本渲染,这些是没有写惯性的,如果需要自行百度,当然,源码我有,也会放出来),下面放出上面的总代码:

HTML代码:

css样式:*{margin:0;padding:0;}

body{

background:#66677c;

overflow:hidden;

}

#perspective{

perspective:800px;/*场景景深*/

}

#wrap{

position:relative;

width:149px;

height:200px;

margin:150px auto 0;

transform-style:preserve-3d;/*当前元素3D效果*/

transform:rotateX(-20deg) rotateY(0deg);

}

#wrap img{

position:absolute;

/*倒影设置*/

-webkit-box-reflect:below 10px -webkit-linear-gradient(top,rgba(0,0,0,0) 50%,rgba(0,0,0,0.5) 100%);

cursor:pointer;

-moz-user-select: -moz-none;

-moz-user-select: none;

-o-user-select: none;

-khtml-user-select: none;

-webkit-user-select: none;

-ms-user-select: none;

user-select: none;

border-radius:5px;

box-shadow:0 0 20px #FFF;

/*背景渐变效果!important*/

-webkit-box-reflect:below 10px

-webkit-linear-gradient(top,rgba(0,0,0,0) 80%,rgba(0,0,0,1) 100%);

}

#wrap p{

width: 1200px;

height: 1200px;

background: -webkit-radial-gradient(center center,600px 600px,rgba(255,255,255,0.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代码:/*1.求出图片旋转的单位度数 360/图片的个数

2.针对每一张图片旋转相对应的度数

3.入场动画

4.拖拽元素 分开处理事件 点击 移动 松开

特效:JS控制元素节点 在指定的时间点改变元素的样式或者属性的值 算法 逻辑思维

*/

var oImg = document.getElementsByTagName("img");//通过元素的名字获取节点

var deg = 360/oImg.length;//单位度数

//call改变数组的forEach方法中的实例执行 用元素集合去代替

window.onload = function(){//页面加载完毕之后再执行的脚本

[].forEach.call(oImg,function(node,index){

console.log(index*deg);

node.style.transform = "rotateY("+index*deg+"deg)translatez(350px)";

node.style.transition = "1s "+(oImg.length - index)*0.11+"s";

});

}

/*

拖拽:

每一次移动 移动了多少距离 每次鼠标的位置在哪里

每两次 是 哪两次移动了

距离 添加到原有的元素度数上

移动距离差 = 新的移动距离 - 旧的移动距离

*/

var newX,newY,pervX,pervY,minusX,minusY;

var rotateX = -20,rotateY = 0;

var oWrap = document.getElementById("wrap");//通过id获取元素

var timer;

//点击

document.onmousedown = function(e){

pervX = e.clientX;

pervY = e.clientY;//第一次点击时候的值

//移动

document.onmousemove = function(e){

//保存新的鼠标位置的值

newX = e.clientX;

newY = e.clientY;

minusX = newX - pervX;

minusY = newY - pervY;

rotateX -= minusY*0.2;

rotateY += minusX*0.1;

oWrap.style.transform = "rotateX("+rotateX+"deg) rotateY("+rotateY+"deg)";

pervX = newX;

pervY = newY;//新的值用完之后就变成了旧的值

}

//松开

document.onmouseup =function(e){

document.onmousemove = null; //清空鼠标移动事件

//抬起

this.onmouseup = function(){

this.onmousemove = null;

timer = setInterval(function(){

minusX *= 0.95;

minusY *= 0.95;

rotateY += minusX*0.2; // roY = roY + minusX*0.2;

rotateX -= minusY*0.1;

oWrap.style.transform = 'rotateX('+ rotateX +'deg) rotateY('+ rotateY +'deg)';

if ( Math.abs(minusX)<0.1 && Math.abs( minusY )<0.1 )

{

clearInterval( timer );

}

console.log( minusX );

},13);

}

return false;

}

}

3D旋转相册css+js(拖拽惯性版):点击下载

3D旋转相册(无惯性):点击下载

3D旋转相册(自动旋转):点击下载

tips:音乐可以自己加,记得将demo.html改为index.html;演示站:

更多推荐

html写3D旋转相册的原理,【源码+教程】3D旋转相册(css3+js/纯css)

本文发布于:2023-04-06 08:03:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/3fb2cb3bed63ab28c10a6e167b2dd4d7.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:相册   源码   原理   教程   html

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!

  • 48797文章数
  • 14阅读数
  • 0评论数