基于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 相关文章推荐
javascript IE中的DOM ready应用技巧
Jul 23 Javascript
基于jQuery实现放大镜特效
Oct 19 Javascript
详解Angular2中的编程对象Observable
Sep 17 Javascript
bootstrap模态框消失问题的解决方法
Dec 02 Javascript
javascript实现秒表计时器的制作方法
Feb 16 Javascript
详解vue 模拟后台数据(加载本地json文件)调试
Aug 25 Javascript
JS实现简单获取最近7天和最近3天日期的方法
Apr 18 Javascript
详解js 创建对象的几种方法
Mar 08 Javascript
使用jQuery如何写一个含验证码的登录界面
May 13 jQuery
解决layui轮播图有数据不显示的情况
Sep 16 Javascript
微信小程序实现翻牌抽奖动画
Sep 21 Javascript
代码解析React中setState同步和异步问题
Jun 03 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
玩家交还《星际争霸》原始码光盘 暴雪报以厚礼
2017/05/05 星际争霸
PHP提取字符串中的图片地址[正则表达式]
2011/11/12 PHP
PHP中最容易忘记的一些知识点总结
2013/04/28 PHP
一段利用WSH修改和查看IP配置的代码
2008/05/11 Javascript
基于JQuery的日期联动实现代码
2011/02/24 Javascript
判断是否安装flash player及当前版本的JS代码
2013/08/08 Javascript
JQuery中对Select的option项的添加、删除、取值
2013/08/25 Javascript
javascript操作html控件实例(javascript添加html)
2013/12/02 Javascript
Angularjs自定义指令Directive详解
2017/05/27 Javascript
在vue中动态修改css其中一个属性值操作
2020/12/07 Vue.js
Python及PyCharm下载与安装教程
2017/11/18 Python
Python实现按特定格式对文件进行读写的方法示例
2017/11/30 Python
Python进阶之递归函数的用法及其示例
2018/01/31 Python
Python输出各行命令详解
2018/02/01 Python
django解决跨域请求的问题
2018/11/11 Python
Django时区详解
2019/07/24 Python
详解numpy.meshgrid()方法使用
2019/08/01 Python
Python 3.6 中使用pdfminer解析pdf文件的实现
2019/09/25 Python
详解Open Folder as PyCharm Project怎么添加的方法
2020/12/29 Python
python中四舍五入的正确打开方式
2021/01/18 Python
pandas统计重复值次数的方法实现
2021/02/20 Python
使用HTML5加载音频和视频的实现代码
2020/11/30 HTML / CSS
暑期实习鉴定
2013/12/16 职场文书
综合办公室主任职责
2013/12/16 职场文书
体育专业个人求职信范文
2013/12/27 职场文书
给朋友的道歉信
2014/01/09 职场文书
接受捐赠答谢词
2014/01/27 职场文书
社团活动总结怎么写
2014/06/30 职场文书
医院领导班子整改方案
2014/10/01 职场文书
四风问题自我剖析材料
2014/10/07 职场文书
2014年实习班主任工作总结
2014/11/08 职场文书
继续教育个人总结
2015/03/03 职场文书
2015民办小学年度工作总结
2015/05/26 职场文书
房屋买卖定金协议书
2016/03/21 职场文书
Redis三种集群模式详解
2021/10/05 Redis
python周期任务调度工具Schedule使用详解
2021/11/23 Python