基于css3新属性transform及原生js实现鼠标拖动3d立方体旋转


Posted in Javascript onJune 12, 2016

通过原生JS,点击事件,鼠标按下、鼠标抬起和鼠标移动事件,实现3d立方体的拖动旋转,并将旋转角度实时的反应至界面上显示。

实现原理:通过获取鼠标点击屏幕时的坐标和鼠标移动时的坐标,来获得鼠标在X轴、Y轴移动的距离,将距离实时赋值给transform属性

从而通过改变transform:rotate属性值来达到3d立方体旋转的效果

HTML代码块:

<body>
<input type="button" class="open" value="点击散开"/>
<input type="text" class="xNum" value=""/>//X轴旋转角度
<input type="text" class="yNum" value=""/>//Y轴旋转角度
<input type="text" class="zNum"/>
<div class="big_box">
<div class="box">
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></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)",<br>"rotatex(-90deg) translatey(100px)","translatez(-100px)","translatez(100px)"];
//存储立方体合并时的transform参数
var arr1 = ["rotatey(-90deg) translatex(-100px)translatez(100px)","rotatey(90deg) translatex(100px)translatez(100px)",<br>"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>

以上所述是小编给大家介绍的基于css3新属性transform及原生js实现鼠标拖动3d立方体旋转 的相关知识,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
ExtJS 2.0实用简明教程 之Border区域布局
Apr 29 Javascript
Bootstrap实现响应式导航栏效果
Dec 28 Javascript
基于javascript实现文字无缝滚动效果
Mar 22 Javascript
如何检测JavaScript的各种类型
Jul 30 Javascript
利用jQuery.Validate异步验证用户名是否存在(推荐)
Dec 09 Javascript
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
Dec 14 Javascript
vue解决跨域路由冲突问题思路解析
Nov 03 Javascript
vue实现图片滚动的示例代码(类似走马灯效果)
Mar 03 Javascript
node中间层实现文件上传功能
Jun 11 Javascript
微信小程序HTTP接口请求封装的实现
Feb 21 Javascript
深入解析微信小程序开发中遇到的几个小问题
Jul 11 Javascript
JavaScript 判断浏览器是否是IE
Feb 19 Javascript
JS弹出窗口插件zDialog简单用法示例
Jun 12 #Javascript
jQuery实现拖拽页面元素并将其保存到cookie的方法
Jun 12 #Javascript
仅一个form表单 js实现注册信息依次填写提交功能
Jun 12 #Javascript
JS+HTML5手机开发之滚动和惯性缓动实现方法分析
Jun 12 #Javascript
浅谈如何实现easyui的datebox格式化
Jun 12 #Javascript
JQuery的attr 与 val区别
Jun 12 #Javascript
从重置input file标签中看jQuery的 .val() 和 .attr(“value”) 区别
Jun 12 #Javascript
You might like
php制作简单模版引擎
2016/04/07 PHP
php创建图像具体步骤
2017/03/13 PHP
PHP构造二叉树算法示例
2017/06/21 PHP
PHP实现实时生成并下载超大数据量的EXCEL文件详解
2017/10/23 PHP
thinkphp5 加载静态资源路径与常量的方法
2017/12/24 PHP
PHP中使用mpdf 导出PDF文件的实现方法
2018/10/22 PHP
JavaScript 三种创建对象的方法
2009/10/16 Javascript
ajax不执行success回调而是执行了error回调
2012/12/10 Javascript
Javascript 赋值机制详解
2014/11/23 Javascript
浅谈javascript原型链与继承
2015/07/13 Javascript
学习JavaScript设计模式之模板方法模式
2016/01/20 Javascript
详解JavaScript数组和字符串中去除重复值的方法
2016/03/07 Javascript
javascript模块化简单解析
2016/04/07 Javascript
AngularJS入门教程之ng-checked 指令详解
2016/08/01 Javascript
WebSocket+node.js创建即时通信的Web聊天服务器
2016/08/08 Javascript
JavaScript生成验证码并实现验证功能
2016/09/24 Javascript
Javascript 两种刷新方法以及区别和适用范围
2017/01/17 Javascript
nodejs+websocket实时聊天系统改进版
2017/05/18 NodeJs
zTree获取当前节点的下一级子节点数实例
2017/09/05 Javascript
jQuery实现table表格信息的展开和缩小功能示例
2018/07/21 jQuery
vue使用v-if v-show页面闪烁,div闪现的解决方法
2018/10/12 Javascript
Vue实现验证码功能
2019/12/03 Javascript
解决vue下载后台传过来的乱码流的问题
2020/12/05 Vue.js
python中print()函数的“,”与java中System.out.print()函数中的“+”功能详解
2017/11/24 Python
hmac模块生成加入了密钥的消息摘要详解
2018/01/11 Python
Python3字符串encode与decode的讲解
2019/04/02 Python
python GUI库图形界面开发之PyQt5表单布局控件QFormLayout详细使用方法与实例
2020/03/06 Python
Python tkinter之ComboBox(下拉框)的使用简介
2021/02/05 Python
预订旅游活动、景点和旅游:GetYourGuide
2019/09/29 全球购物
初中学习计划书范文
2014/09/15 职场文书
学校党的群众路线教育实践活动总结材料
2014/10/30 职场文书
数学考试作弊检讨书300字
2015/02/16 职场文书
简历中自我评价范文
2015/03/11 职场文书
2016民族团结先进个人事迹材料
2016/02/26 职场文书
Python中glob库实现文件名的匹配
2021/06/18 Python
C#连接ORACLE出现乱码问题的解决方法
2021/10/05 Oracle