代码地址如下:
http://www.demodashi.com/demo/11453.html

  一直想做一个立体的盒子,前段时间刚好看见掘金上有位朋友发了篇关于3d盒子的文章,看了决定自己做一下,再写一些和盒子互动的操作。

一、程序实现

  首先看下怎么做一个静止的盒子,用到了css3transform。将盒子六个面放在一个div里,将这个div定位好,用transform属性改变不同的面的朝向,再将其向前移动盒子宽度的一半,盒子就做好了。html结构如下:

    <div class="wraper">
<div class="cube">
<div class="front">Front</div>
<div class="end">End</div>
<div class="left">Left</div>
<div class="right">Right</div>
<div class="top">Top</div>
<div class="bottom">Bottom</div>
</div>
</div>

  设置css,不熟悉transform可以看下下边这张图,需要注意的是元素的轴是跟着元素转动而转动的,所以几个面的translateZ属性的值都是一样的,旋转到正确的朝向然后向前平移盒子一半的宽度。

body,
html {
height: 100%;
padding: 0;
margin: 0;
/*将border和padding绘制在设置宽高之内*/
box-sizing: border-box;
overflow: hidden;
}
.wraper {
width: 260px;
height: 260px;
margin: 128px auto;
/*景深,可以理解为视角到3D物体的距离,设置于舞台元素上*/
perspective: 1000px;
}
.cube {
height: 100%;
width: 100%;
position: relative;
/*子元素继承3D效果*/
transform-style: preserve-3d;
/*加上下边这句可以体现出立体感*/
/*transform: rotateX(-30deg) rotateY(-45deg);*/
}
.cube>div {
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
background-color: rgba(0, 0, 0, .8);
text-align: center;
line-height: 260px;
color: #fff;
font-size: 48px;
border: 2px solid #fff;
/*设置文本内容不可选*/
user-select: none;
}
.front {
/*正面不用旋转,直接向前平移半个盒子宽*/
transform: translateZ(130px);
}
.end {
/*向后旋转,以确保盒子上的文字朝向盒子外*/
transform: rotateY(180deg) translateZ(130px);
}
.top {
transform: rotateX(90deg) translateZ(130px);
}
.bottom {
transform: rotateX(-90deg) translateZ(130px);
}
.left {
transform: rotateY(-90deg) translateZ(130px);
}
.right {
transform: rotateY(90deg) translateZ(130px);
}

  下来就是鼠标拖动盒子的核心代码了,先理一下思路,鼠标拖动盒子,就是记录下盒子的角度,然后点击鼠标并拖动的时候根据鼠标移动方向和距离重新计算出盒子的旋转角度,鼠标松开时取消监听,记录盒子角度。这和我之前写的一个例子鼠标拖动div 有点相似:

var cube = document.querySelector(".cube"),
downX, downY, moveX, moveY, tempX, tempY, degX = 0, degY = 0; window.onmousedown = function (e) {
e = e || event;
downX = e.clientX; //获取鼠标点下去时的坐标
downY = e.clientY; window.onmousemove = function (e) {
e = e || event;
moveX = e.clientX - downX; //算出鼠标移动的距离
moveY = e.clientY - downY;
//根据一定比例将变化反应在盒子上,改变比例5可以调节拖动的速度
tempX = degX + moveX / 5;
tempY = degY - moveY / 5;
cube.style.transform = "rotatex(" + tempY + "deg) rotatey(" + tempX + "deg)";
}; }; window.onmouseup = function (e) {
e = e || event;
degX += moveX / 5; //鼠标松开时将拖动期间改变的最终结果保存
degY += - moveY / 5;
window.onmousemove = null; //取消监听
};

  再加一个使用滚轮改变景深的函数,因为景深太小视角会到盒子里边,并不是很好看,所以限制了一下,在景深小于300px时将不会减小。

!function () {
var n = 1000;
var wraper = document.querySelector('.wraper');
wraper.style.perspective = n + 'px';
window.onmousewheel = function (e) {
e = e || event;
if (e.wheelDelta) { //判断浏览器IE,谷歌滑轮事件
if (e.wheelDelta > 0) { //当滑轮向上滚动时减小景深
wraper.style.perspective = n - 50 + 'px';
if (n > 350) {
n = n - 50;
}
}
if (e.wheelDelta < 0) { //当滑轮向下滚动时增加景深
wraper.style.perspective = n + 50 + 'px';
n += 50;
}
} else if (e.detail) { //Firefox滑轮事件
if (e.detail > 0) {
wraper.style.perspective = n - 50 + 'px';
if (n > 350) {
n = n - 50;
}
}
if (e.detail < 0) {
wraper.style.perspective = n + 50 + 'px';
n += 50;
}
}
};
}();

二、最终效果图:

三、代码文件图

本例子只有一个文件如下:

四、补充

  好了,到这里这个盒子看起来已经很3D了,这里是我的博客,欢迎来访。

可拖拽的3D盒子

代码地址如下:
http://www.demodashi.com/demo/11453.html

注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权

可拖拽的3D盒子的更多相关文章

  1. (Demo分享)利用JavaScript(JS)实现一个九宫格拖拽功能

    利用JavaScript(JS)实现一个九宫格拖拽功能   Demo实现了对任意方格进行拖拽,可以交换位置,其中Demo-1利用了勾股定理判断距离! Demo-1整体思路: 1.首先div实现自由移动 ...

  2. day50—JavaScript鼠标拖拽事件

    转行学开发,代码100天——2018-05-05 今天通过鼠标拖拽事件复习巩固一下鼠标事件. 鼠标拖拽事件需要记住两点: 1.距离不变 2.鼠标事件(按下,移动,抬起) <div id=&quo ...

  3. 原生js实现拖拽效果

    面向对象 + 原生js拖拽 拖拽div等盒子模型,都是日常操作没有什么问题,如果是拖拽图片的话,会有一点小坑要踩...... 那么我们看代码: var Move_fn = {}; (function( ...

  4. jQuery可拖拽3D万花筒旋转特效

    这是一个使用了CSS3立体效果的强大特效,本特效使用jQuery跟CSS3 transform来实现在用户鼠标按下拖动时,环形图片墙可以跟随鼠标进行3D旋转动画. 效果体验:http://hovert ...

  5. HT for Web列表和3D拓扑组件的拖拽应用

    很多可视化编辑器都或多或少有一些拖拽功能,比如从一个List列表中拖拽一个节点到拓扑组件上进行建模,并且在拖拽的过程中鼠标位置下会附带一个被拖拽节点的缩略图,那么今天我们就来实现这样的拖拽效果. 首先 ...

  6. js拖拽3D立方体旋转

    这段时间有点闲,所以就自己找些小玩意来练习练习.今天做了一个可以拖拽页面内空白位置3D立方体就会跟着转动的小例子,布局方面用到css3 3D转换技术,通过transform控制旋转实现的. 上个图 代 ...

  7. JQ实现3D拖拽效果

    <!DOCTYPE HTML> <html onselectstart='return false'> <head> <meta http-equiv=&qu ...

  8. 快速开发 HTML5 WebGL 的 3D 斜面拖拽生成模型

    前言 3D 场景中的面不只有水平面这一个,空间是由无数个面组成的,所以我们有可能会在任意一个面上放置物体,而空间中的面如何确定呢?我们知道,空间中的面可以由一个点和一条法线组成.这个 Demo 左侧为 ...

  9. 前端笔记之JavaScript(十一)event&BOM&鼠标/盒子位置&拖拽/滚轮

    一.事件对象event 1.1 preventdefault()和returnValue阻止默认事件 通知浏览器不要执行与事件关联的默认动作. preventdefault()  支持Chrome等高 ...

随机推荐

  1. HDU 6041 I Curse Myself(二分+搜索)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6041 [题目大意] 给出一个仙人掌图,求第k小生成树 [题解] 首先找到仙人掌图上的环,现在的问题 ...

  2. 【后缀自动机】CDOJ1551 Hesty Str1ng

    可以发现,对于原串的每个长度>1的子串而言,将其除了最后一个字符之外反向接在其结尾,都是一个合法解.该解的长度一定是奇数. 对于原串的每个长度>2,且结尾两个字符相同的子串而言,将其除了最 ...

  3. 【左偏树+延迟标记+拓扑排序】BZOJ4003-城池攻占

    [题目大意] 有n个城市构成一棵树,除1号城市外每个城市均有防御值h和战斗变化参量a和v. 现在有m个骑士各自来刷副本,每个其实有一个战斗力s和起始位置c.如果一个骑士的战斗力s大于当前城市的防御值h ...

  4. k-近邻算法 简单例子

    from numpy import * import operator def create_data_set(): # 训练集与标签 group = array([[1.0, 1.1], [1.0, ...

  5. Kubernetes下的Redis主从配置架构

    文章看了一大堆,但都是直接从各种地方直接拉master,slave镜像,没有交代这些镜像如何构建出来的 好把,我这篇就讲讲这些master,slave镜像如何做成. 先得找到一个标准的redis镜像, ...

  6. 前端对比插件JS

    https://github.com/kpdecker/jsdiff demo http://kpdecker.github.io/jsdiff/ 缺点:文件大于10M的就比较不了了 用于比对两段HT ...

  7. war后缀的文件

    其实war文件就是Java中web应用程序的打包.借用一个老兄的话,"当你一个web应用程序很多的时候,如果你想把它部署到别的机器上,来回拷这些文件是件挺郁闷的事情,如果要是一个文件就好了. ...

  8. AMBA AHB总线

    Advanced Microcontroller Bus Architecture, 即AMBA,是ARM公司提出的总线规范,被很多SoC设计所采用,常用的实现有AHB(Advanced High-P ...

  9. Docker创建centos的LNMP镜像

    前段时间重装了系统,今天刚好有时间,就用docker安装一个lnmp开发环境,下面是我的安装笔记. 1. 安装docker 这个就不说了,不会的可以看下我之前的文章<Docker介绍及安装> ...

  10. [python爬虫] Selenium常见元素定位方法和操作的学习介绍(转载)

    转载地址:[python爬虫] Selenium常见元素定位方法和操作的学习介绍 一. 定位元素方法 官网地址:http://selenium-python.readthedocs.org/locat ...