基于css3新属性transform及原生js实现鼠标拖动3d立方体旋转
itomcoil 2025-01-05 18:05 33 浏览
基于css3新属性transform,实现3d立方体的旋转
通过原生JS,点击事件,鼠标按下、鼠标抬起和鼠标移动事件,实现3d立方体的拖动旋转,并将旋转角度实时的反应至界面上显示
实现原理:通过获取鼠标点击屏幕时的坐标和鼠标移动时的坐标,来获得鼠标在X轴、Y轴移动的距离,将距离实时赋值给transform属性
从而通过改变transform:rotate属性值来达到3d立方体旋转的效果
HTML代码块:
<body> <input type="button" class="open" value="点击散开"/> <input type="text" class="xNum" value="0"/>//X轴旋转角度 <input type="text" class="yNum" value="0"/>//Y轴旋转角度 <input type="text" class="zNum"/> <div class="big_box"> <div class="box"> <span>1</span> <span>2</span> <span>3</span> <span>4</span> <span>5</span> <span>6</span> </div> </div> </body>
CSS代码块:
<style> body{cursor: url("img/openhand1.png"),auto;} .big_box{ width: 500px; height: 500px; margin: 200px auto; } .box{ -webkit-transform-style: preserve-3d; -moz-transform-style: preserve-3d; -ms-transform-style: preserve-3d; transform-style: preserve-3d; transform-origin:100px 100px 00px; position: relative; transform: rotatex(0deg) rotatey(0deg) rotatez(0deg)scale3d(0.7,0.7,0.7); } .box span{ transition: all 1s linear; } span{ display: block; position: absolute; width: 200px; height: 200px; box-sizing: border-box; border:1px solid #999; /*opacity: 0.7;*/ text-align: center; line-height: 200px; font-size: 60px; font-weight: 700; border-radius: 12%; } .box span:nth-child(1){ background-color: deepskyblue; transform-origin: left; transform: rotatey(-90deg) translatex(-100px);//左 } .box span:nth-child(2){ background-color: red; transform-origin: right; transform: rotatey(90deg) translatex(100px) ;//右 } .box span:nth-child(3){ background-color: green; transform-origin: top; transform: rotatex(90deg) translatey(-100px) ;//上 } .box span:nth-child(4){ background-color: #6633FF; transform-origin: bottom; transform: rotatex(-90deg) translatey(100px);//下 } .box span:nth-child(5){ background-color: gold; transform: translatez(-100px);//后 } .box span:nth-child(6){ background-color: #122b40; transform: translatez(100px);//前 } .box:hover span{ opacity: 0.3; } .box:hover{ animation-play-state:paused;//设置动画暂停 } </style>
JS代码块:
<script> move; clickBox; //鼠标按下且移动时触发, function move{ var body = document.querySelector("body"); var box = document.querySelector(".box"); var xNum =document.querySelector(".xNum"); var yNum =document.querySelector(".yNum"); var x = 0,y = 0,z = 0; var xx = 0,yy = 0; var xArr = ,yArr = ; window.onmousedown = function (e) {//鼠标按下事件 body.style.cursor = 'url("img/closedhand1.png"),auto'; xArr[0] = e.clientX/2;//获取鼠标点击屏幕时的坐标 yArr[0] = e.clientY/2; window.onmousemove = function (e) {//鼠标移动事件————当鼠标按下且移动时触发 xArr[1] = e.clientX/2;//获取鼠标移动时第一个点的坐标 yArr[1] = e.clientY/2; yy += xArr[1] - xArr[0];//获得鼠标移动的距离 xx += yArr[1] - yArr[0]; xNum.value = xx+"°";//将所获得距离数字赋值给input显示旋转角度 yNum.value = yy+"°"; //将旋转角度写入transform中 box.style.transform = "rotatex("+xx+"deg) rotatey("+yy+"deg) rotatez(0deg)scale3d(0.7,0.7,0.7)"; xArr[0] = e.clientX/2; yArr[0] = e.clientY/2; } }; window.onmouseup = function {//鼠标抬起事件————用于清除鼠标移动事件, body.style.cursor = 'url("img/openhand1.png"),auto'; window.onmousemove = null; } } //点击事件、负责立方体盒子的六面伸展 function clickBox{ var btn = document.querySelector(".open"); var box = document.querySelector(".box"); var son = box.children; var value = 0; //存储立方体散开时的transform参数 var arr0 = ["rotatey(-90deg) translatex(-100px)","rotatey(90deg) translatex(100px)","rotatex(90deg) translatey(-100px)",
"rotatex(-90deg) translatey(100px)","translatez(-100px)","translatez(100px)"]; //存储立方体合并时的transform参数 var arr1 = ["rotatey(-90deg) translatex(-100px)translatez(100px)","rotatey(90deg) translatex(100px)translatez(100px)",
"rotatex(90deg) translatey(-100px)translatez(100px)","rotatex(-90deg) translatey(100px)translatez(100px)","translatez(-200px)","translatez(200px)"]; btn.onclick = function{ if(value == 0){ value = 1; btn.value = "点击合并"; for(var i=0;i<arr1.length;i++){ son[i].style.transform = arr1[i]; console.log(son[i]) } }else if(value == 1){ value = 0; btn.value = "点击散开"; for(var j=0;j<arr0.length;j++){ son[j].style.transform = arr0[j]; console.log(j); } } }; } </script>
- 上一篇:一文读懂 CSS 单位
- 下一篇:CSS Transform
相关推荐
- MySQL修改密码_mysql怎么改密码忘了怎么办
-
拥有原来的用户名账户的密码mysqladmin-uroot-ppassword"test123"Enterpassword:【输入原来的密码】忘记原来root密码第一...
- 数据库密码配置项都不加密?心也太大了吧!
-
先看一份典型的配置文件...省略...##配置MySQL数据库连接spring.datasource.driver-class-name=com.mysql.jdbc.Driverspr...
- Linux基础知识_linux基础入门知识
-
系统目录结构/bin:命令和应用程序。/boot:这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件。/dev:dev是Device(设备)的缩写,该目录...
- MySQL密码重置_mysql密码重置教程
-
之前由于修改MySQL加密模式为mysql_native_password时操作失误,导致无法登陆MySQL数据库,后来摸索了一下,对MySQL数据库密码进行重置后顺利解决,步骤如下:1.先停止MyS...
- Mysql8忘记密码/重置密码_mysql密码忘了怎么办?
-
Mysql8忘记密码/重置密码UBUNTU下Mysql8忘记密码/重置密码步骤如下:先说下大概步骤:修改配置文件,使得用空密码可以进入mysql。然后置当前root用户为空密码。再次修改配置文件,不能...
- MySQL忘记密码怎么办?Windows环境下MySQL密码重置图文教程
-
有不少小白在使用Windows进行搭建主机的时候,安装了一些环境后,其中有MySQL设置后,然后不少马大哈忘记了MySQL的密码,导致在一些程序安装及配置的时候无法进行。这个时候怎么办呢?重置密码呗?...
- 10种常见的MySQL错误,你可中招?_mysql常见错误提示及解决方法
-
【51CTO.com快译】如果未能对MySQL8进行恰当的配置,您非但可能遇到无法顺利访问、或调用MySQL的窘境,而且还可能给真实的应用生产环境带来巨大的影响。本文列举了十种MySQL...
- Mysql解压版安装过程_mysql解压版安装步骤
-
Mysql是目前软件开发中使用最多的关系型数据库,具体安装步骤如下:第一步:Mysql官网下载最新版(mysql解压版(mysql-5.7.17-winx64)),Mysql官方下载地址为:https...
- MySQL Root密码重置指南:Windows新手友好教程
-
如果你忘记了MySQLroot密码,请按照以下简单步骤进行重置。你需要准备的工具:已安装的MySQL以管理员身份访问命令提示符一点复制粘贴的能力分步操作指南1.创建密码重置文件以管理员...
- 安卓手机基于python3搜索引擎_python调用安卓so库
-
环境:安卓手机手机品牌:vivox9s4G运行内存手机软件:utermux环境安装:1.java环境的安装2.redis环境的安装aptinstallredis3.elasticsearch环...
- Python 包管理 3 - poetry_python community包
-
Poetry是一款现代化的Python依赖管理和打包工具。它通过一个pyproject.toml文件来统一管理你的项目依赖、配置和元数据,并用一个poetry.lock文件来锁定所有依赖的精...
- Python web在线服务生产环境真实部署方案,可直接用
-
各位志同道合的朋友大家好,我是一个一直在一线互联网踩坑十余年的编码爱好者,现在将我们的各种经验以及架构实战分享出来,如果大家喜欢,就关注我,一起将技术学深学透,我会每一篇分享结束都会预告下一专题最近经...
- 官方玩梗:Python 3.14(πthon)稳定版发布,正式支持自由线程
-
IT之家10月7日消息,当地时间10月7日,Python软件基金会宣布Python3.14.0正式发布,也就是用户期待已久的圆周率(约3.14)版本,再加上谐音梗可戏称为π...
- 第一篇:如何使用 uv 创建 Python 虚拟环境
-
想象一下,你有一个使用Python3.10的后端应用程序,系统全局安装了a2.1、b2.2和c2.3这些包。一切运行正常,直到你开始一个新项目,它也使用Python3.10,但需要...
- 我用 Python 写了个自动整理下载目录的工具
-
经常用电脑的一定会遇到这种情况:每天我们都在从浏览器、微信、钉钉里下各种文件,什么截图、合同、安装包、临时文档,全都堆在下载文件夹里。起初还想着“过两天再整理”,结果一放就是好几年。结果某天想找一个发...
- 一周热门
- 最近发表
- 标签列表
-
- ps图案在哪里 (33)
- super().__init__ (33)
- python 获取日期 (34)
- 0xa (36)
- super().__init__()详解 (33)
- python安装包在哪里找 (33)
- linux查看python版本信息 (35)
- python怎么改成中文 (35)
- php文件怎么在浏览器运行 (33)
- eval在python中的意思 (33)
- python安装opencv库 (35)
- python div (34)
- sticky css (33)
- python中random.randint()函数 (34)
- python去掉字符串中的指定字符 (33)
- python入门经典100题 (34)
- anaconda安装路径 (34)
- yield和return的区别 (33)
- 1到10的阶乘之和是多少 (35)
- python安装sklearn库 (33)
- dom和bom区别 (33)
- js 替换指定位置的字符 (33)
- python判断元素是否存在 (33)
- sorted key (33)
- shutil.copy() (33)