详解用CSS绘制3D旋转立方体

CSS3D旋转立方体绝对是能充分代表这些年CSS发展新高度的典型案例。从一种只是简单的颜色和尺寸渲染的标记符,CSS现在已经变成了一种能够创造出复杂的、具有艺术感染力的视觉效果的编程语言。动画效果的生成变得非常的简单易行。

遗憾的是,目前网上的关于CSS立方体的制作教程都有些复杂,在立方体的基础上混合了其它视觉效果,所以,我决定写这篇文章,只涉及如何创造出基本的CSS立方体的讲解。这篇文章中使用的例子来自于CodePen上Mircea Georgescu的漂亮杰作

观看演示

HTML

这个立方体首先是包裹在一个div里:

<div>
<div>
<div>前</div>
<div>后</div>
<div>上</div>
<div>下</div>
<div>左</div>
<div>右</div>
</div>
</div>

1

2

3

4

5

6

7

8

9

10

<div>

<div>

<div>前</div>

<div>后</div>

<div>上</div>

<div>下</div>

<div>左</div>

<div>右</div>

</div>

</div>

而立方体的每个面都用一个div元素表示。你可以想象出,我们将使用CSS将它们定位到正确的空间位置上。

CSS

我们一步一步的进行讲解。首先要注意的是包裹这个立方体的div元素,为了让它有立体效果,给它设置了CSS透视属性。

.wrap {
perspective: 800px;
perspective-origin: 50% 100px;
}

1

2

3

4

.wrap {

perspective: 800px;

perspective-origin: 50% 100px;

}

CSS透视是一个非常新颖的概念,MDN已经对其讲解的非常透彻,我就不再复述了。为了更好的理解透视,我建议你修改这个例子里的perspective属性,看看它是如何影响表现效果的。下面要说的是立方体div容器,立方体的所有面都放在里面:

.cube {
position: relative;
width: 200px;
transform-style: preserve-3d;
}

1

2

3

4

5

.cube {

position: relative;

width: 200px;

transform-style: preserve-3d;

}

立方体边长是200px,使用relative定位方式,这样它的那些使用绝对定位的各个面都被限制在它里面。我们使用preserve-3d属性值来让它表现出3D特征,而不是平面效果。在我们给各个特定面制定CSS规则前,先制定一个所有面都共用的CSS规则:

.cube div {
position: absolute;
width: 200px;
height: 200px;
}

1

2

3

4

5

.cube div {

position: absolute;

width: 200px;

height: 200px;

}

设置完所有面通用的定位方式和长宽值,我们现在开始编写让每个面发生变形的代码:

.back {
transform: translateZ(-100px) rotateY(180deg);
}
.right {
transform: rotateY(-270deg) translateX(100px);
transform-origin: top right;
}
.left {
transform: rotateY(270deg) translateX(-100px);
transform-origin: center left;
}
.top {
transform: rotateX(-90deg) translateY(-100px);
transform-origin: top center;
}
.bottom {
transform: rotateX(90deg) translateY(100px);
transform-origin: bottom center;
}
.front {
transform: translateZ(100px);
}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

.back {

transform: translateZ(-100px) rotateY(180deg);

}

.right {

transform: rotateY(-270deg) translateX(100px);

transform-origin: top right;

}

.left {

transform: rotateY(270deg) translateX(-100px);

transform-origin: center left;

}

.top {

transform: rotateX(-90deg) translateY(-100px);

transform-origin: top center;

}

.bottom {

transform: rotateX(90deg) translateY(100px);

transform-origin: bottom center;

}

.front {

transform: translateZ(100px);

}

设定rotateY值使各个面旋转形成适当的角度。translateZ值的作用是调整在三维空间中立方体的各个面与观众的距离。这个translateY属性可能让人有些困惑,它的作用是让立方体的各个面移动到相应的位置从而拼凑出一个立方盒子。每个面都有各自的移动方向和距离,你可以修改这些值来看看它们是如何从叠摞平躺移动到相应位置变成一个立方体的各个面的。

观看演示

水平转动立方体

当然,这个静止不动的立方体显然不够吸引人,缺少一点生气,我们要让它动起来。下面的步骤就是让我这个宝贵的立方盒子旋转起来:

@keyframes spin {
from { transform: rotateY(0); }
to { transform: rotateY(360deg); }
}

.cube {
animation: spin 5s infinite linear;
}

1

2

3

4

5

6

7

8

@keyframes spin {

from { transform: rotateY(0); }

to { transform: rotateY(360deg); }

}

.cube {

animation: spin 5s infinite linear;

}

你也许意外竟然会如此简单,不是吗?因为我们只需要让这个立方体容器div旋转,它就能带动起内部的各个面一起旋转。下面我们要让它垂直翻转和2D水平翻转。

垂直旋转立方体

让立方体垂直旋转只需要修改一下,让它沿着Y轴旋转就行了,不是吗?很不幸,不是这样的。因为这个立方体静止时是斜着对我们的,我们需要把它调整到直对着我们时才能旋转,所以要修改一下它的初始旋转角度:

@keyframes spin-vertical {
from { transform: rotateX(0); }
to { transform: rotateX(-360deg); }
}

.cube-wrap.vertical .cube {
margin: 0 auto; /* 居中 */

transform-origin: 0 100px;
animation: spin-vertical 5s infinite linear;
}

.cube-wrap.vertical .top {
transform: rotateX(-270deg) translateY(-100px);
}

.cube-wrap.vertical .back {
transform: translateZ(-100px) rotateX(180deg);
}

.cube-wrap.vertical .bottom {
transform: rotateX(-90deg) translateY(100px);
}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

@keyframes spin-vertical {

from { transform: rotateX(0); }

to { transform: rotateX(-360deg); }

}

.cube-wrap.vertical .cube {

margin: 0 auto; /* 居中 */

transform-origin: 0 100px;

animation: spin-vertical 5s infinite linear;

}

.cube-wrap.vertical .top {

transform: rotateX(-270deg) translateY(-100px);

}

.cube-wrap.vertical .back {

transform: translateZ(-100px) rotateX(180deg);

}

.cube-wrap.vertical .bottom {

transform: rotateX(-90deg) translateY(100px);

}

… 这就修改完了。

2D水平旋转

去掉立方体的3D视觉效果,让我们以水平角度观看这个立方体(没有上下两面的视觉辅助),只需要去掉最外层的div上的透视属性和透视原点值:

.wrap {
/* 去掉透视效果 */
perspective: none;
perspective-origin: 0 0;
}

1

2

3

4

5

.wrap {

/* 去掉透视效果 */

perspective: none;

perspective-origin: 0 0;

}

现在我们就只能看到它的水平面了。

观看演示

CSS3D旋转立方体已经在网络上流行有一阵子了,但我希望这篇文章能让你更容易的学会制作它,给自己一个惊喜。如果在尝试自己制作是遇到困难,不要气馁——我也是费力很大牛劲才做出来的!我期望看到你做出的效果!

转自 http://www.seejs.com/archives/352

时间: 2024-10-14 22:13:32

详解用CSS绘制3D旋转立方体的相关文章

纯CSS3超酷3D旋转立方体动画特效

这是一款效果非常炫酷的纯CSS3 3D旋转立方体动画特效.该3D立方体使用CSS3 perspective制作,可以在水平方向.垂直方向和平面视角方向旋转,效果相当震撼.使用CSS3来制作动画效果已经成为WEB前端开发的一种时尚,从简单的颜色和尺寸动画,到复杂的旋转.翻转动画, CSS3展现了它无穷的魅力.使用CSS来制作立方体动画,代码简洁易懂,效果更是令人惊叹! 在线演示:http://www.htmleaf.com/Demo/201501251274.html 下载地址:http://ww

3D旋转立方体

<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>3D旋转立方体</title> <meta name="viewport" content="wi

荔枝派Licheepi nano裸机移植ZLG_GUI和3D旋转立方体

一:前言 以前申请到了荔枝派zero,在发了两个开箱贴后就放在一边吃灰了.后来又购买了荔枝派nano,刷了几个教程中的系统之后又放到一边吃灰了.虽然有屯板子的习惯,却没有使用板子的能力. 后来,经过断断续续的摸索和群里面的新手教程,终于搭建好了Licheepi Nano的交叉编译环境,自己GCC了一个hellowworld传输到了开发板并运行了起来.可是......对,于是又继续吃灰. 再后来,在大神 @晕哥 的 填坑网 (https://debugdump.com/index.html)看到了

详解HTML&amp;CSS&amp;JavaScript语法辞典-(专业版) (半场方人) PDF扫描版

这是一本详细讲解htmt+css+javascript语法词典,是读者学习网页编程技术的必备参考书.书中详细讲解了超文本标记语言(hypertext markup language 4.01)中各种标记的使用方法.层叠样式表(cascading style sheets,level 2)的各种属性特征,以及javascrip脚本语言(javascript1.5)中的对象和函数. 书中的所有代码均适用于当今各种平台上最流行的浏览器,包括:internet explorer,firefox,mozi

Android自定义View【实战教程】5??---Canvas详解及代码绘制安卓机器人

友情链接: Canvas API Android自定义View[实战教程]3??--Paint类.Path类以及PathEffect类详解 神马是Canvas 基本概念 Canvas:可以理解为是一个为我们提供了各种工具的画布,我们可以在上面尽情的绘制(旋转,平移,缩放等等).可以理解为系统分配给我们一个一个内存空间,然后提供了一些对这个内存空间操作的方法(API), 实际存储是在下面的bitmap. 两种画布 这里canvas可以绘制两种类型的画图,分别是view和surfaceView. V

3D旋转立方体案例

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>CSS 3D转换</title> <style> body { margin: 0; padding: 0; background-color: #F7F7F7; } .box { width: 100px; height: 100px; tex

html+css实现3D旋转图片展示

<strong><span style="font-size:12px;"><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>MyHtml.html</title> <meta http-equiv="keywords" content=&

css网页中设置背景图片的方法详解

css网页中设置背景图片的方法详解 在css代码中设置背景图片的方法,包括背景图片.背景重复.背景固定.背景定位等 用css设置网页中的背景图片,主要有如下几个属性: 1,背景颜色 {background-color:数值}2,背景图片 {background-image: url(URL)|none}3,背景重复 {background-repeat:inherit|no-repeat|repeat|repeat-x|repeat-y}4,背景固定 {background-attachment

CSS背景属性Background详解

本文详解了CSS的背景属性Background,包括CSS3中新增的背景属性.如果你是个CSS初学者,还可以查看之前介绍的CSS浮动属性和CSS透明属性详解. css2 中的背景(background) CSS2 中有5个主要的背景(background)属性,它们是: background-color: 指定填充背景的颜色. background-image: 引用图片作为背景. background-position: 指定元素背景图片的位置. background-repeat: 决定是否