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

基于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>

  

时间: 2024-10-11 17:14:17

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

css3新属性transform 3D的基础笔记.

研究了下css3中的 transform变换属性中的3D属性效果和看到的一篇好文章了解到了3D的学习;好文章地址:http://www.zhangxinxu.com/wordpress/2012/09/css3-3d-transform-perspective-animate-transition/ 下面只是自己能读懂自己写的代码例子: <style> #box{ -webkit-perspective:800px;//定义3D场景大小 -webkit-transform-origin:50%

基于CSS3新属性Animation及transform实现类似翻书效果

注:本实例JS部分均以原生JS编写,不善用原生JS的,可用jQuery等对三方框架改写 先上效果图:(样式有点丑,可以忽略一下下,效果出来了就好,后期加到其他项目中方便更改0.0) 类似翻书效果,原本的意思是使用JS来控制的,点击一次之后使用setInterval去控制书页翻过去的动画,当书页翻转180°之后,清除掉setInterval,但当我连续点击,那之前没有翻转180°的书页将无法继续完成之前的动作,可以用清除setInterval的方式,但总感觉动画效果不好,当然还有其他解决办法,但突

两点补充——CSS3新属性以及弹性布局

CSS3 新属性 一.[ CSS3新增属性前缀 ] 1.-webkit-:chrome/safari 2.-moz-:火狐 3.-mo-:IE 4.-o-: Opera 欧朋 二 .[CSS 长度单位] 1.px:像素.长度固定,表示分辨率占几个像素点: 2.%:表示相对于默认值的百分比: 3.em:长度与元素的字号挂钩. rem:长度与根元素的字号挂钩. 即与html 的 font-size 挂钩,若不设置,默认16px . [ em与rem区别 ] em与当前元素自身的font-size挂钩

CSS3新属性:在网站中使用访客电脑里没有安装的字体

CSS的font-family属性使网页可以使用客户电脑里的字体,从而得到多姿多彩的WEB页面,但当客户端没有你想要使用的字体时怎么办呢?我们总不能让每个访问者都去安装一个字体吧?事实上,这是可以的!不过不是访客主动下载的,而是网站开发者帮访客下载安装的,具体怎么实现的,我们还要从字体文件的格式说起.字体格式类型主要有几个大分类:TrueType.Embedded Open Type .OpenType.WOFF .SVG.  TrueType Windows和Mac系统最常用的字体格式,其最大

原生js获取鼠标坐标方法全面讲解-zmq

原生js获取鼠标坐标方法全面讲解:clientX/Y,pageX/Y,offsetX/Y,layerX/Y,screenX/Y 一.关于js鼠标事件综合各大浏览器能获取到坐标的属性总共以下五种:event.clientX/Yevent.pageX/Yevent.offsetX/Yevent.layerX/Yevent.screenX/Y 二.分别讲解如下: clientX/Y: clientX/Y获取到的是触发点相对浏览器可视区域左上角距离,不随页面滚动而改变 兼容性:所有浏览器均支持 page

基于css3的3D立方体旋转特效

今天给大家分享一款基于css3的3D立方体旋转特效.这款特效适用浏览器:360.FireFox.Chrome.Safari.Opera.傲游.搜狗.世界之窗. 不支持IE8及以下浏览器.效果图如下 : 在线预览   源码下载 实现的代码. html代码: <div class="wrap"> <div class="box1 box"> 1</div> <div class="box2 box">

HTML5 CSS3 诱人的实例: 3D立方体旋转动画DEMO

创意来自:http://www.html5tricks.com/demo/html5-3d-cube/index.html , 同学给我发的例子,感觉很不错,不过实在想不出来实际的用处,但是效果很炫~ 效果图: 知识点: 1.perspective ,transform 的复习 2.css3 backgroud实现格格背景,即面上的小格格 3. @-webkit-keyframes 实现动画 HTML: <body> <div class="stage"> &l

纯CSS3炫酷全屏3D立方体旋转展示幻灯片特效

这是一款效果非常酷的纯CSS3全屏3D立方体旋转展示幻灯片特效.该幻灯片使用全屏的3D立方体作为slide的载体,通过上下导航按钮,可以垂直旋转立方体,将立方体各个面上的幻灯片图片展示出来,效果非常炫酷. 在线预览   源码下载 使用方法 HTML结构 该幻灯片的立方体结构使用的是一个无序列表来制作,每一个<li>元素是一个立方体的面.幻灯片的上下导航按钮使用的是radio单选按钮和label来制作.整个3D立方体幻灯片被包裹在一个div容器中. 1 2 3 4 5 6 7 8 9 10 11

CSS3动画属性Transform解读

无论你是前端还是设计师,相信你在网页二维空间上的操作早已经得心应手,JS处理时间线的动画也早已经 烂熟于胸.从今天开始,我跟大家分享一些“新”的东西,网页的第三个维度,以及纯CSS实现的动画.限于篇幅,从初级到比较复杂的3D动画大概会说个三四 个回合,我们就从最初级的东西开始说,由于这些知识大部分都是我个人根据文档所理解的,主要是当笔记.所以,也许会跟不少同学所理解的不太一样,甚至相 悖,我希望大家可以在文章下面指出不对的地方,我们共同来学习. 在我们以前使用绝对定位的时候就已经初步接触过Z轴,