CSS动画实例:3D立方体
CSS3支持3D转换,与3D转换有关的属性有:
transform:向元素应用 2D或3D 转换。
transform-origin:改变被转换元素的位置。
transform-style:规定被嵌套元素如何在3D空间中显示。
perspective:规定 3D 元素的透视效果。
perspective-origin:规定 3D 元素的底部位置。
backface-visibility 定义元素在不面对屏幕时是否可见。
在transform属性设置中,可使用的3D转换函数主要有:
matrix3d(n,n, n,n,n,n ,n,n,n ,n,n,n, n,n,n,n ):定义3D转换,使用16个值的 4x4 矩阵。
translate3d(x,y,z):定义3D平移动转换。
translateX(x):定义3D沿X轴平移转换。
translateY(y) :定义3D沿Y轴平移转换。
translateZ(z) :定义3D沿Z轴平移转换。
scale3d(x,y,z) :定义 3D 缩放转换。
rotate3d(x,y,z,angle):定义 3D 旋转。
rotateX(angle):定义沿 X 轴的 3D 旋转。
rotateY(angle) :定义沿 Y 轴的 3D 旋转。
rotateZ(angle) :定义沿 Z 轴的 3D 旋转。
perspective(n) 定义 3D 转换元素的透视视图。
学习和利用3D转换,可以绘制立体化的图形。
1.一个简单的立方体
一个立方体有前、后、左、右、上、下共六个面,可在页面中定义立方体如下:
<div class="cube">
<div class="front">front</div>
<div class="back">back</div>
<div class="top">top</div>
<div class="bottom">bottom</div>
<div class="left">left</div>
<div class="right">right</div>
</div>
为立方体cube及六个面定义样式规则,每个面进行适当的平移和旋转,可以绘制出一个3D立方体。编写的HTML文件如下。

<!DOCTYPE html>
<html>
<head>
<title>一个简单的3D立方体</title>
<style>
.container
{
margin: 0 auto;
width: 400px;
height:400px;
background:#d8d8d8;
border: 4px solid rgba(255, 0, 0, 0.9);
border-radius: 10%;
}
.cube
{
position: relative;
width: 200px;
top:80px;
left:80px;
transform-style:preserve-3d;
perspective: 800px;
perspective-origin: -50% -100px;
}
.cube div
{
position: absolute;
width: 200px;
height: 200px;
background: rgba(255,255,255,0.1);
box-shadow: inset 0 0 30px rgba(125,125,125,0.8);
text-align: center;
line-height: 200px;
font-weight:bold;
text-shadow:-1px 1px 5px #f60;
color:#fff;
font-family: sans-serif;
text-transform: uppercase;
font-size:30px;
}
.front
{
transform: translateZ(100px);
}
.back
{
transform: translateZ(-100px) rotateY(180deg);
}
.left
{
transform:rotateY(270deg) translateX(-100px);
transform-origin: center left;
}
.right
{
transform:rotateY(-270deg) translateX(100px);
transform-origin: top right;
}
.top
{
transform:rotateX(-90deg) translateY(-100px);
transform-origin: top center;
}
.bottom
{
transform:rotateX(90deg) translateY(100px);
transform-origin: bottom center;
}
</style>
</head>
<body>
<div class="container">
<div class="cube">
<div class="front">front</div>
<div class="back">back</div>
<div class="top">top</div>
<div class="bottom">bottom</div>
<div class="left">left</div>
<div class="right">right</div>
</div>
</div>
</body>
</html>
在浏览器中打开包含这段HTML代码的html文件,可以显示如图1所示的立方体。

图1 一个简单的3D立方体
去掉图1中立方体各面上的文字,分别以红色、橙色、黄色、绿色、青色和蓝色表示六个面,并且定义关键帧,使得立方体旋转起来。编写的HTML文件如下。

<!DOCTYPE html>
<html>
<head>
<title>旋转的3D立方体</title>
<style>
.container
{
margin: 0 auto;
width: 400px;
height:400px;
background:#d8d8d8;
border: 4px solid rgba(255, 0, 0, 0.9);
border-radius: 10%;
}
.cube
{
width: 200px;
height: 200px;
margin: 100px auto;
position: relative;
transform-style: preserve-3d;
animation: anim 8s linear infinite;
}
.cube div
{
width: 100%;
height: 100%;
position: absolute;
}
.front
{
background: rgba(255, 0, 0, 0.3);
transform: translateZ(100px);
}
.back
{
background: rgba(255, 0, 255, 0.3);
transform: translateZ(-100px);
}
.left
{
background-color: rgba(255, 255, 0, 0.3);
transform-origin: left;
transform: rotateY(90deg) translateX(-100px);
}
.right
{
background: rgba(0, 255, 0, 0.3);
transform-origin: right;
transform: rotateY(90deg) translateX(100px);
}
.top
{
background: rgba(255, 0, 255, 0.3);
transform: rotateX(90deg) translateZ(100px);
}
.bottom
{
background: rgba(0, 0, 255, 0.3);
transform: rotateX(-90deg) translateZ(100px);
}
@keyframes anim
{
0% { transform: rotateX(0deg) rotateY(0deg); }
100% { transform: rotateX(360deg) rotateY(360deg);}
}
</style>
</head>
<body>
<div class="container">
<div class="cube">
<div class="front"></div>
<div class="back"></div>
<div class="top"></div>
<div class="bottom"></div>
<div class="left"></div>
<div class="right"></div>
</div>
</div>
</body>
</html>
在浏览器中打开包含这段HTML代码的html文件,可以呈现出如图2所示的动画效果。

图2 旋转的立方体
2.3D魔方
在立方体的每个面上用线性渐变(Linear Gradients)给背景加上3*3的方格图形,构成一个3D魔方。
一个对象背景用线性渐变填充的调用格式为:
background: linear-gradient(direction, color-stop1, color-stop2, ...);
设页面中有<div class="box"></div>,若为.box定义样式规则如下:
.box
{
position: relative;
height:200px;
width: 200px;
background: linear-gradient(to right, red , blue);
}
可在页面中显示如图3所示的图形。

图3 红蓝色线性渐变
若修改background属性的设置为:
background: linear-gradient(to right, red,orange,yellow,green,blue,indigo,violet);
可在页面中显示如图4所示的图形。

图4 七彩渐变图
若定义.box定义样式规则如下:
.box
{
position: relative;
height:200px;
width: 200px;
background: repeating-linear-gradient(to right,
#BC8F8F 0, #BC8F8F 2px,
#FF1493 2px, #FF1493 66px,
#BC8F8F 66px );
}
.box:before
{
content: "";
position: absolute;
width: 200px;
height: 200px;
transform: rotate(90deg);
background: repeating-linear-gradient(to right,
#BC8F8F 0,#BC8F8F 2px,
transparent 2px, transparent 66px,
#BC8F8F 66px );
}
可在页面中显示如图5所示的图形。

图5 3*3方格图
将图5所示的方格绘制到立方体的六个面上,形成一个魔方。定义关键帧,使得魔方旋转起来。
编写的HTML文件如下。

<!DOCTYPE html>
<html>
<head>
<title>3D魔方</title>
<style>
.container
{
margin: 0 auto;
width: 400px;
height:400px;
background:#d8d8d8;
border: 4px solid rgba(255, 0, 0, 0.9);
border-radius: 10%;
}
.cube
{
position: relative;
margin: 100px auto;
width: 200px;
height: 200px;
transform-style: preserve-3d;
animation: rotateCube 8s linear infinite;
}
@keyframes rotateCube
{
0% { transform: rotateX(0) rotateY(0); }
100% { transform: rotateX(360deg) rotateY(360deg); }
}
.side
{
position: absolute;
width: 200px;
height: 200px;
}
.side:before
{
content: "";
position: absolute;
width: 200px;
height: 200px;
transform: rotate(90deg);
background: repeating-linear-gradient(to right,
#BC8F8F 0,#BC8F8F 2px,
transparent 2px, transparent 66px,
#BC8F8F 66px );
}
.front
{
transform: translateZ(100px);
background: repeating-linear-gradient(to right,
#BC8F8F 0, #BC8F8F 2px,
#8B008B 2px, #8B008B 66px,
#BC8F8F 66px );
}
.back
{
transform: translateZ(-100px);
background: repeating-linear-gradient(to right,
#BC8F8F 0, #BC8F8F 2px,
#6495ED 2px, #6495ED 66px,
#BC8F8F 66px );
}
.left
{
transform: translateX(-100px) rotateY(90deg);
background: repeating-linear-gradient(to right,
#BC8F8F 0, #BC8F8F 2px,
#FFD700 2px, #FFD700 66px,
#BC8F8F 66px );
}
.right
{
transform: translateX(100px) rotateY(90deg);
background: repeating-linear-gradient(to right,
#BC8F8F 0, #BC8F8F 2px,
#FF1493 2px, #FF1493 66px,
#BC8F8F 66px );
}
.top
{
transform: translateY(-100px) rotateX(90deg);
background: repeating-linear-gradient(to right,
#BC8F8F 0, #BC8F8F 2px,
#00FF7F 2px, #00FF7F 66px,
#BC8F8F 66px);
}
.bottom
{
transform: translateY(100px) rotateX(90deg);
background: repeating-linear-gradient(to right,
#BC8F8F 0, #BC8F8F 2px,
#FFFAFA 2px, #FFFAFA 66px,
#BC8F8F 66px);
}
</style>
</head>
<body>
<div class="container">
<div class="cube">
<div class="side front"></div>
<div class="side back"></div>
<div class="side left"></div>
<div class="side right"></div>
<div class="side top"></div>
<div class="side bottom"></div>
</div>
</div>
</body>
</html>
在浏览器中打开包含这段HTML代码的html文件,可以呈现出如图6所示的动画效果。

图6 旋转的魔方
3.3D小木箱
有了从简单立方体到3D魔方的制作经验,下面我们再来制作一个3D木箱。主要是制作出形象的木箱面板。
设页面中有<div class='side'></div>,为.side定义样式规则如下:
.side
{
width: 160px;
height: 160px;
position: relative;
margin: 100px auto;
padding: 16px;
background-color: #d07f2c;
outline: 1px solid #a66523;
box-sizing: border-box;
}
.side:before, .side:after
{
content: '';
display: block;
width: 16px;
height: 100%;
position: absolute;
outline: 1px solid #a66523;
top: 0;
}
.side:before
{
left: 0;
}
.side:after
{
right: 0;
}
可在页面中显示如图7所示的图形。

图7 面板(1)
若修改.side的样式规则为:
.side
{
display: block;
width: 160px;
height: 160px;
overflow: hidden;
position: relative;
border: 1px solid #a66523;
box-sizing: border-box;
}
.side:before, .side:after
{
content: '';
display: block;
width: 150%;
height: 20%;
top: 50%;
left: 50%;
transform-origin: 0% 0%;
position: absolute;
outline: 1px solid #a66523;
background-color: #c87a2a;
}
.side:before
{
transform: rotate(45deg) translate(-50%, -50%);
}
.side:after
{
transform: rotate(-45deg) translate(-50%, -50%);
}
可在页面中显示如图8所示的图形。

图8 面板(2)
把图8的图形放入图7中,二者组合起来可以得到如图9所示的面板。

图9 木箱面板
制作好了面板,我们就可以制作出3D木箱,并让它旋转起来。编写的HTML文件如下。

<!DOCTYPE html>
<html>
<head>
<title>旋转的3D小木箱</title>
<style>
.container
{
margin: 0 auto;
width: 400px;
height: 400px;
border: 4px solid rgba(255, 0, 0, 0.9);
background:#d8d8d8;
border-radius: 10%;
}
.crate
{
width: 160px;
height: 160px;
position: relative;
margin: 100px auto;
transform-style: preserve-3d;
animation: crate-spin 10s linear infinite;
}
.side
{
width: 100%;
height: 100%;
position: absolute;
transform-style: preserve-3d;
padding: 16px;
background-color: #d07f2c;
outline: 1px solid #a66523;
box-sizing: border-box;
}
.side:before, .side:after
{
content: '';
display: block;
width: 16px;
height: 100%;
position: absolute;
outline: 1px solid #a66523;
top: 0;
}
.side:before
{
left: 0;
}
.side:after
{
right: 0;
}
.side-inner
{
display: block;
width: 100%;
height: 100%;
overflow: hidden;
position: relative;
border: 1px solid #a66523;
box-sizing: border-box;
}
.side-inner:before, .side-inner:after
{
content: '';
display: block;
width: 150%;
height: 20%;
top: 50%;
left: 50%;
transform-origin: 0% 0%;
position: absolute;
outline: 1px solid #a66523;
background-color: #c87a2a;
}
.side-inner:before
{
transform: rotate(45deg) translate(-50%, -50%);
}
.side-inner:after
{
transform: rotate(-45deg) translate(-50%, -50%);
}
.crate .side .side-inner span
{
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
z-index: 10;
font-size: 80px;
font-family: "Cooper Black", serif;
color: #f6f632;
}
.top
{
transform: translateY(-80px) rotateX(90deg);
}
.bottom
{
transform: translateY(80px) rotateX(90deg);
}
.left
{
transform: translateX(-80px) rotateY(-90deg);
}
.right
{
transform: translateX(80px) rotateY(90deg);
}
.front
{
transform: translateZ(80px);
}
.back
{
transform: translateZ(-80px) rotateY(180deg);
}
@keyframes crate-spin
{
from { transform: rotateX(-20deg) rotateY(0deg); }
to { transform: rotateX(-20deg) rotateY(-360deg); }
}
</style>
</head>
<body>
<div class="container">
<div class='crate'>
<div class='side top'>
<div class='side-inner'></div>
</div>
<div class='side bottom'>
<div class='side-inner'></div>
</div>
<div class='side left'>
<div class='side-inner'>
<span>A</span>
</div>
</div>
<div class='side right'>
<div class='side-inner'>
<span>C</span>
</div>
</div>
<div class='side front'>
<div class='side-inner'>
<span>B</span>
</div>
</div>
<div class='side back'>
<div class='side-inner'>
<span>D</span>
</div>
</div>
</div>
</div>
</body>
</html>
在浏览器中打开包含这段HTML代码的html文件,可以呈现出如图10所示的动画效果。

图10 旋转的小木箱
CSS动画实例:3D立方体的更多相关文章
- CSS动画实例
上一篇讲过css动画transform transition的语法,这一节展示自己做的几个小例子加深印象 1. 线条动画效果 代码:最外层div包含2个小的div : a和b. a有左右边框(高度 ...
- CSS动画实例:太极图在旋转
利用CSS可以构造出图形,然后可以对构造的图形添加动画效果.下面我们通过旋转的太极图.放大的五角星.跳“双人舞”的弯月等实例来体会纯CSS实现动画的方法. 1.旋转的太极图 设页面中有<div ...
- CSS动画实例:移动的眼珠子
适当地利用CSS的box-shadow可以构造图形,然后可以对构造的图形添加动画效果.下面我们通过移动的眼珠子.圆珠一二三.一分为四.四小圆旋转扩散等实例来体会box-shadow属性在动画制作中的使 ...
- CSS动画实例:小圆球的海洋
CSS背景属性用于定义HTML元素的背景,在CSS提供的背景属性中, background-image:指定要使用的一个或多个背景图像: background-color:指定要使用的背景颜色: ba ...
- CSS动画实例:旋转的圆角正方形
在页面中放置一个类名为container的层作为效果呈现容器,在该层中再定义十个名为shape的层层嵌套的子层,HTML代码描述如下: <div class="container&qu ...
- CSS动画实例:一颗躁动的心
在页面中放置一个类名为container的层作为盛放心心的容器,在该层中再定义一个名为heart的子层,HTML代码描述如下: <div class="container"& ...
- CSS动画实例:跳跃的字符
1.翻转的字符 在页面中放置一个类名为container的层作为容器,在该层中放置5个字符区域,HTML代码描述如下: <div class="container"> ...
- CSS动画实例:Loading加载动画效果(三)
3.小圆型Loading 这类Loading动画的基本思想是:在呈现容器中定义1个或多个子层,再对每个子层进行样式定义,使得其均显示为一个实心圆形,最后编写关键帧动画控制,使得各个实心圆或者大小发生改 ...
- CSS动画实例:升空的气球
1.制作一个气球 设页面中有<div class="balloon"></div>,为. balloon设置样式规则如下: .balloon { heigh ...
随机推荐
- 死磕abstractqueuedsynchronizer源码
第一次写博客,先练练手. 1.AQS是什么? 在Lock中,用到了一个同步队列AQS,全称为AbstractQueuedSynchronizer,它是一个同步工具也是lock用来实现线程同步的核心组件 ...
- 解Bug之路-Nginx 502 Bad Gateway
解Bug之路-Nginx 502 Bad Gateway 前言 事实证明,读过Linux内核源码确实有很大的好处,尤其在处理问题的时刻.当你看到报错的那一瞬间,就能把现象/原因/以及解决方案一股脑的在 ...
- react ts redux-saga | 谷歌Chrome浏览器风格的标签组件 | 中台
谷歌Chrome浏览器风格的标签组件 选用技术 react typescript redux-saga存储本地标签数据 umi 实现 [x] 支持全部关闭,当前关闭,关闭其他Tab [x] 支持Tab ...
- 【SCOI2008】奖励关 题解(状压DP+期望)
题目链接 题目大意:给定$n$个宝物,每次随机抛出一个宝物,奖励分数为$p_i$.但如果选这个宝物必须选过它的前置宝物集合.共进行$K$轮问最优策略下的期望. $n\leq 15,-10^6\leq ...
- 如何设置远程MongoDB!
默认情况下V服务连接着本地mongoDB服务,如果想连接到其他mongoDB服务,请按如下设置: 方法一:通过控制台修改 进入控制台 http://x.x.x.x:xxxx/system/consol ...
- 用 Python 下载抖音无水印视频
说起抖音,大家或多或少应该都接触过,如果大家在上面下载过视频,一定知道我们下载的视频是带有水印的,那么我们有什么方式下载不带水印的视频呢?其实用 Python 就可以做到,下面我们来看一下. 很多人学 ...
- LDAP 使用记录
LDAP 命令记录 工作中用到了 LDAP,做一个简单记录. 概念性的东西不做阐述,只是记录常用命令,以便将来回顾. 想多做了解可以参考这个系列文章: https://blog.csdn.net/li ...
- 线程安全&Java内存模型
目录 Java内存模型 关于线程安全 Volatile关键字 Synchronized锁 重入锁 Lock锁 死锁 乐观锁与悲观锁 乐观锁(适合多读场景) 悲观锁(适合多写场景) Java内存模型 J ...
- SSM框架整合Demo
目前项目大都开始采用SSM结构进行搭建,因为涉及项目比较多,新来的需求都是从现有项目中迁移一份出来进行修改,有的时候两个项目差别还是比较大,并不完全需要原有项目的东西,进行删减也是一项费神费时的事情, ...
- RIPS源码阅读记录(二)
Author: tr1ple 这部分主要分析scanner.php的逻辑,在token流重构完成后,此时ini_get是否包含auto_prepend_file或者auto_append_file 取 ...