js实现3D旋转效果


Posted in Javascript onAugust 18, 2020

本文实例为大家分享了js实现3D旋转效果的具体代码,供大家参考,具体内容如下

实现效果:

js实现3D旋转效果

实现过程:

步骤一:先写一个简单的html结构,创建一个box盒子,里面放对应的图片(也可以用js创建图片,这里为了好理解,我们直接用html创建).

<body><div class="box">
 <img src="./img/1.jpg" alt="">
 <img src="./img/2.jpg" alt="">
 <img src="./img/3.jpg" alt="">
 <img src="./img/4.jpg" alt="">
 <img src="./img/5.jpg" alt="">
 <img src="./img/6.jpg" alt="">
 <img src="./img/7.jpg" alt="">
 <img src="./img/8.jpg" alt="">
 <img src="./img/9.jpg" alt="">
 <img src="./img/10.jpg" alt="">
 <img src="./img/11.jpg" alt="">
 <img src="./img/12.jpg" alt="">
</div>

步骤二:给盒子和图片,设置对应的样式

<style>
 *{
  margin: 0;
  padding: 0;
 }
 body {
  background-color: #000;
  /*overflow: hidden;*/
 }
 #box{
  width:133px;
  height: 200px;
  margin: 200px auto;
  position:relative;
  border: 1px solid #fff;
  transform-style: preserve-3d;
  /*2.transform?style属性指定嵌套元素是在三维空间中呈现。(使用此属性必须先使用transform 属性)*/
  /*perspective:800px;*/
  /*3.设置透视距离*/
  transform:perspective(800px) rotateX(-15deg) rotateY(0deg) ;                                                     deg);


 }
 #box img{
  position: absolute;
  top:0;
  left: 0;
  width: 100%;
  height: 100%;
  border-radius: 3px;
  box-shadow: 0px 0px 5px #fff;
  /*4.设置图片阴影*/
  /*-webkit-box-reflect: below 15px -webkit-linear-gradient(top,rgba(0,0,0,0) 40%,rgba(0,0,0,.5) 100%);*/
  /*-webkit-box-reflect:below 8px -webkit-linear-gradient(top,rgba(0,0,0,0)40%,rgba(0,0,0,.5)100%);*/
  -webkit-box-reflect:below 10px -webkit-linear-gradient(transparent,transparent 50%,rgba(0,0,0,.6));
  /*5.设置图片倒影:直接记住吧(3个值。1. direction 定义方向,取值包括 above 、 below 、 left 、 right。);2. offset定义反射偏移的距离;3.mask-box-image定义遮罩图像,该图像将覆盖投影区域。如果省略该参数值,则默认为无遮罩图像。*/
 }

</style>

第三步: js

<script>
 // //js动态添加11个img标签
 // //创建11个img标签的办法
 // var box=document.getElementById('box');
 // for(var i=1;i<=11;i++){//有多少张图就循环多少次
 // var imgs= document.createElement('img');
 // imgs.setAttribute("src", "img/"+i+".jpg");
 // box.appendChild(imgs);} 
  //当页面加载完毕后再执行代码
  window.onload=function ( ) {
   //1.获取元素
   var oWrap=document.getElementById('box');
   var oImg=oWrap.children;
   // var oImgLen=oImg.length;
   var deg=360/oImg.length;//3.每个需要旋转的度数
   // 定义一个开始的度数
   var roX=-10;
   var roY=0;
   var x,y,x_,y_,xN,yN,time=null;
   //2.遍历所有的img标签
   for(var i=0;i<oImg.length;i++){
   // oImg[i].style.cssText='transform:rotateY('+i*deg+'deg ) translateZ(350px);transition:1s'+ (oImgLen-i)*0.1 +'s;';
   oImg[i].style.transform = 'rotateY('+ i*deg + 'deg) translateZ(350px)';
   oImg[i].style.transition ='all 1s '+ (oImg.length-i-1)*0.1 +'s';
   //transition:设置过渡
   oImg[i].ondragstart=function ( ) {
   return false;
   }
   }
   //3.事件处理
   document.onmousedown=function ( e ) {
   clearInterval(time);
   e=e||window.event;
   x_=e.clientX;
   y_=e.clientY;
   // console.log ( "鼠标按下了" )
   this.onmousemove=function ( e ) {
   e=e||window.event;
   //获取滚动的X和Y轴
    //client:鼠标触发点相对于页面可视区域左上角距离
    x=e.clientX;
    y=e.clientY;
    //两点之间的差值:第一次走的时候两值相等,第二次走的时候x已经更新,但x_没更新,所以两个差值就是xN;
    xN=x-x_;
    yN=y-y_;
    //差值拼接到旋转的Y里面去
    roY+=xN*0.2;//水平拖影响Y轴;
    roX-=yN*0.2;
    oWrap.style.transform='perspective(800px) rotateX('+roX+'deg) rotateY('+roY+'deg)';
    // var oDiv =document.createElement('div');
    // this.body.appendChild(oDiv);
    // oDiv.style.cssText='width:5px;height:5px; background:red;position:absolute;left:'+x+"px;top:"+y+"px";
    x_=e.clientX;
    y_=e.clientY;
   }
   this.onmouseup=function ( ) {
    // console.log ( "鼠标抬起了" )
    this.onmousemove= null;
    //设置一个定时器,实现后面惯性效果8
    time=setInterval(function ( ) {

   //无限乘以零点95它会接近0的状态
   xN*=0.95;
   yN*=0.95;
   //当它小到0.1时停止计时器
   if(Math.abs(xN)<0.1 && Math.abs(yN)<0.1){//Math.abs()是返回绝对值
    clearInterval(time);
   }
   //差值拼接到旋转的Y里面去
   roY+=xN*0.2;//水平拖影响Y轴;
   roX-=yN*0.2;
   oWrap.style.transform='perspective(800px) rotateX('+roX+'deg) rotateY('+roY+'deg)';

  },30)
   }
   }
  }
 </script>

附件:完整版代码

<!DOCTYPE html >
<html lang="en" onselectstart="return false;">
<head>
 <meta charset="UTF-8">
 <title>Title</title>
 <style>
 *{
  margin: 0;
  padding: 0;
 }
 body {
  background-color: #000;
 }
 #box{
  width:133px;
  height: 200px;
  margin: 100px auto;
  position:relative;
  /* border: 1px solid #fff; 测试用到*/
  transform-style: preserve-3d;
  /*2.transform?style属性指定嵌套元素是在三维空间中呈现。(使用此属性必须先使用transform 属性)*/
  /*perspective:800px;*/
  /*3.设置透视距离*/
  transform:perspective(800px) rotateX(-15deg) rotateY(0deg) ;             }
 #box img{
  position: absolute;
  top:0;
  left: 0;
  width: 100%;
  height: 100%;
  border-radius: 3px;
  box-shadow: 0px 0px 5px #fff;
  /*4.设置图片阴影*/
  -webkit-box-reflect:below 10px -webkit-linear-gradient(transparent,transparent 50%,rgba(0,0,0,.6));
  /*方法2-webkit-box-reflect:below 8px -webkit-linear-gradient(top,rgba(0,0,0,0)40%,rgba(0,0,0,.5)100%);*/
  /*5.设置图片倒影:直接记住吧(3个值。1. direction 定义方向,取值包括 above 、 below 、 left 、 right。);2. offset定义反射偏移的距离;3.mask-box-image定义遮罩图像,该图像将覆盖投影区域。如果省略该参数值,则默认为无遮罩图像。*/
 }

 </style>
</head>
<body>
<div id="box">
 <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" >
 <img src="./img/12.jpg" >
</div>

 <script>
 // //js动态添加11个img标签
 // //创建11个img标签的办法
 // var box=document.getElementById('box');
 // for(var i=1;i<=11;i++){//有多少张图就循环多少次
 // var imgs= document.createElement('img');
 // imgs.setAttribute("src", "img/"+i+".jpg");
 // box.appendChild(imgs);} 
  //当页面加载完毕后再执行代码
  window.onload=function ( ) {
   //1.获取元素
   var oWrap=document.getElementById('box');
   var oImg=oWrap.children;
   // var oImgLen=oImg.length;
   var deg=360/oImg.length;//3.每个需要旋转的度数
   // 定义一个开始的度数
   var roX=-10;
   var roY=0;
   var x,y,x_,y_,xN,yN,time=null;
   //2.遍历所有的img标签
   for(var i=0;i<oImg.length;i++){
   // oImg[i].style.cssText='transform:rotateY('+i*deg+'deg ) translateZ(350px);transition:1s'+ (oImgLen-i)*0.1 +'s;';
   oImg[i].style.transform = 'rotateY('+ i*deg + 'deg) translateZ(350px)';
   oImg[i].style.transition =' all 1s '+ (oImg.length-i-1)*0.1 +'s';
   //transition:设置过渡
   oImg[i].ondragstart=function ( ) {
   return false;
   }
   }
   //3.事件处理
   document.onmousedown=function ( e ) {
   clearInterval(time);
   e=e||window.event;
   x_=e.clientX;
   y_=e.clientY;
   // console.log ( "鼠标按下了" )
   this.onmousemove=function ( e ) {
   e=e||window.event;
   //获取滚动的X和Y轴
    //client:鼠标触发点相对于页面可视区域左上角距离
    x=e.clientX;
    y=e.clientY;
    //两点之间的差值:第一次走的时候两值相等,第二次走的时候x已经更新,但x_没更新,所以两个差值就是xN;
    xN=x-x_;
    yN=y-y_;
    //差值拼接到旋转的Y里面去
    roY+=xN*0.2;//水平拖影响Y轴;
    roX-=yN*0.2;
    oWrap.style.transform='perspective(800px) rotateX('+roX+'deg) rotateY('+roY+'deg)';
    // var oDiv =document.createElement('div');
    // this.body.appendChild(oDiv);
    // oDiv.style.cssText='width:5px;height:5px; background:red;position:absolute;left:'+x+"px;top:"+y+"px";这三行是测试用的
    x_=e.clientX;
    y_=e.clientY;
   }
   this.onmouseup=function ( ) {
    // console.log ( "鼠标抬起了" )
    this.onmousemove= null;
    //设置一个定时器,实现后面惯性效果8
    time=setInterval(function ( ) {

   //无限乘以零点95它会接近0的状态
   xN*=0.95;
   yN*=0.95;
   //当它小到0.1时停止计时器
   if(Math.abs(xN)<0.1 && Math.abs(yN)<0.1){//Math.abs()是返回绝对值
    clearInterval(time);
   }
   //差值拼接到旋转的Y里面去
   roY+=xN*0.2;//水平拖影响Y轴;
   roX-=yN*0.2;
   oWrap.style.transform='perspective(800px) rotateX('+roX+'deg) rotateY('+roY+'deg)';

  },30)
   }
   }
  }


 </script>
</body>
</html>

最后附上源码地址  

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Javascript 面向对象特性
Dec 28 Javascript
移动设备web开发首选框架:zeptojs介绍
Jan 29 Javascript
jquery+ajax+text文本框实现智能提示完整实例
Jul 09 Javascript
jQuery实现鼠标选中文字后弹出提示窗口效果【附demo源码】
Sep 05 Javascript
详解AngularJs路由之Ui-router-resolve(预加载)
Jun 13 Javascript
webpack热模块替换(HMR)/热更新的方法
Apr 05 Javascript
简述JS浏览器的三种弹窗
Jul 15 Javascript
Vue配合iView实现省市二级联动的示例代码
Jul 27 Javascript
vue 项目接口管理的实现
Jan 17 Javascript
Vue实现数据请求拦截
Oct 23 Javascript
js实现拖拽与碰撞检测
Sep 18 Javascript
React Hook用法示例详解(6个常见hook)
Apr 28 Javascript
Vue elementui字体图标显示问题解决方案
Aug 18 #Javascript
详解三种方式在React中解决绑定this的作用域问题并传参
Aug 18 #Javascript
javascript实现移动端上传图片功能
Aug 18 #Javascript
八种Vue组件间通讯方式合集(推荐)
Aug 18 #Javascript
小程序实现上传视频功能
Aug 18 #Javascript
如何在selenium中使用js实现定位
Aug 18 #Javascript
vue实现移动端input上传视频、音频
Aug 18 #Javascript
You might like
PHP 文件系统详解
2012/09/13 PHP
php 获取页面中指定内容的实现类
2014/01/23 PHP
PHP中strnatcmp()函数“自然排序算法”进行字符串比较用法分析(对比strcmp函数)
2016/01/07 PHP
PHP创建word文档的方法(平台无关)
2016/03/29 PHP
PHP实现用户登录的案例代码
2018/05/10 PHP
php设计模式之正面模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
Git命令之分支详解
2021/03/02 PHP
最好用的省市二级联动 原生js实现你值得拥有
2013/09/22 Javascript
用js设置下拉框为只读的小技巧
2014/04/10 Javascript
arguments对象验证函数的参数是否合法
2015/06/26 Javascript
js实现页面跳转的五种方法推荐
2016/03/10 Javascript
js实现非常棒的弹出div
2016/10/06 Javascript
js仿QQ邮箱收件人选择与搜索功能
2017/02/10 Javascript
让nodeJS支持ES6的词法----babel的安装和使用方法
2017/07/31 NodeJs
详解关于Vue版本不匹配问题(Vue packages version mismatch)
2018/09/17 Javascript
vue返回上一页面时回到原先滚动的位置的方法
2018/12/20 Javascript
微信小程序实现分享商品海报功能
2019/09/30 Javascript
Vue+ElementUI 中级联选择器Bug问题的解决
2020/07/31 Javascript
windows下python之mysqldb模块安装方法
2017/09/07 Python
Django中使用Celery的方法示例
2018/11/29 Python
使用python turtle画高达
2020/01/19 Python
Java爬虫技术框架之Heritrix框架详解
2020/07/22 Python
如何基于matlab相机标定导出xml文件
2020/11/02 Python
CSS3 clip-path 用法介绍详解
2018/03/01 HTML / CSS
Html5之svg可缩放矢量图形_动力节点Java学院整理
2017/07/17 HTML / CSS
英国家居用品和床上用品零售商:P&B Home
2020/01/16 全球购物
水利公司纪检监察自我鉴定
2014/02/25 职场文书
信息总监管理职责范本
2014/03/08 职场文书
2014年党支部承诺书
2014/05/30 职场文书
承诺保证书格式
2015/02/28 职场文书
党员干部廉政承诺书
2015/04/28 职场文书
幼儿园六一主持词开场白
2015/05/28 职场文书
php 原生分页
2021/04/01 PHP
MySQL中IF()、IFNULL()、NULLIF()、ISNULL()函数的使用详解
2021/06/26 MySQL
宫崎骏十大动画电影,宫崎骏好看的动画电影排名
2022/03/22 日漫
Python利用FlashText算法实现替换字符串
2022/03/31 Python