CSS动画实例:SierPinski地毯
设页面中有<div class=”shape”></div>,若定义.shape的样式规则为:
.shape
{
width: 100px;
height: 100px;
background: conic-gradient(from 270deg at calc(100% / 3) calc(100% / 3),
#f00 90deg, transparent 0 );
border: 1px solid #000;
}
可在页面中显示如图1所示的图形,在边长为100px的正方形中有一个边长为33.33px的红色填充的正方形。

图1 一个红色填充正方形
其中,conic-gradient是圆锥渐变。和线性渐变(linear-gradient)、径向渐变(radial-gradient)不同的是,目前不是所有的主流浏览器都支持圆锥渐变。本实例中的效果在“360安全浏览器12”中会得到呈现,但IE 11和Microsoft Edge上会不呈现。其他的主流浏览器没有进行一一测试,请读者自行测试好了。
若定义.shape的样式规则为:
.shape
{
width: 100px;
height: 100px;
background: conic-gradient(from 270deg at calc(100% / 3) calc(100% / 3),
#f00 90deg, transparent 0 )
calc(100% / 6) calc(100% / 6) / calc(100% / 3) calc(100% / 3);
border: 1px solid #000;
}
可在页面中显示如图2所示的图形,在边长为100px的正方形中有9个红色填充的正方形,这是由于背景大小设置为calc(100% / 3) calc(100% / 3),分成了9等分的缘故。

图2 9个红色填充正方形
若定义.shape的样式规则为:
.shape
{
width: 100px;
height: 100px;
background: conic-gradient(from 270deg at calc(100% / 3) calc(100% / 3),
#f00 90deg, transparent 0 )
calc(100% / 6) calc(100% / 6) / calc(100% / 9) calc(100% / 9);
border: 1px solid #000;
}
可在页面中显示如图3所示的图形,在边长为100px的正方形中有81个大小相同的红色填充的正方形,这是由于背景大小设置为calc(100% / 9) calc(100% / 9),分成了81等分的缘故。

图3 大小相同的81个红色填充正方形
若定义.shape的样式规则为:
.shape
{
width: 100px;
height: 100px;
background: conic-gradient(from 270deg at calc(100% / 3) calc(100% / 3),
#f00 90deg, transparent 0 )
calc(100% / 6) calc(100% / 6) / calc(100% / 3) calc(100% / 3),
conic-gradient(from 270deg at calc(100% / 3) calc(100% / 3),
#f00 90deg, transparent 0 )
calc(100% / 6) calc(100% / 6) / calc(100% / 9) calc(100% / 9);
border: 1px solid #000;
}
可在页面中显示如图4所示的图形,在边长为100px的正方形中有81个大小不同的红色填充的正方形,这是图2和图3两个背景图像叠加的缘故。

图4 大小不同的81个红色填充正方形
若定义.shape的样式规则为:
.shape
{
width: 100px;
height: 100px;
background: conic-gradient(from 270deg at calc(100% / 3) calc(100% / 3),
#f00 90deg, transparent 0 )
calc(100px / 3) calc(100px / 3) / 100% 100% ,
conic-gradient(from 270deg at calc(100% / 3) calc(100% / 3),
#f00 90deg, transparent 0 )
calc(100% / 6) calc(100% / 6) / calc(100% / 3) calc(100% / 3),
conic-gradient(from 270deg at calc(100% / 3) calc(100% / 3),
#f00 90deg, transparent 0 )
calc(100% / 6) calc(100% / 6) / calc(100% / 9) calc(100% / 9);
border: 1px solid #000;
}
可在页面中显示如图5所示的图形。对这个图形熟悉吗?它就是SierPinski地毯。

图5 SierPinski地毯
定义关键帧展示SierPinski地毯的生成过程。编写的HTML文件内容如下。


<!DOCTYPE html>
<html>
<head>
<title>SierPinski地毯</title>
<style>
.container
{
margin: 0 auto;
width: 450px;
height:450px;
position: relative;
display:flex;
justify-content:center;
align-items:center;
background:#d8d8d8;
border: 4px solid rgba(255, 0, 0, 0.9);
border-radius: 10%;
}
.shape
{
position: absolute;
width: 243px;
height: 243px;
border: 1px solid rgba(255, 0, 255, 0.9);
--sq: conic-gradient(from 270deg at calc(100% / 3) calc(100% / 3),
#fff 90deg, transparent 0);
background: var(--sq) 81px 81px / 100% 100%,
var(--sq) calc(100% / 6) calc(100% / 6) / calc(100% / 3) calc(100% / 3),
var(--sq) calc(100% / 6) calc(100% / 6) / calc(100% / 9) calc(100% / 9),
var(--sq) calc(100% / 6) calc(100% / 6) / calc(100% / 27) calc(100% / 27);
background-color: #000;
animation: anim 8s linear infinite;
}
@keyframes anim
{
0%,24% { background: var(--sq) 81px 81px / 100% 100%; }
25%,49%
{
background: var(--sq) 81px 81px / 100% 100%,
var(--sq) calc(100% / 6) calc(100% / 6) / calc(100% / 3) calc(100% / 3);
}
50%,74%
{
background: var(--sq) 81px 81px / 100% 100%,
var(--sq) calc(100% / 6) calc(100% / 6) / calc(100% / 3) calc(100% / 3),
var(--sq) calc(100% / 6) calc(100% / 6) / calc(100% / 9) calc(100% / 9);
}
75%,100%
{
background: var(--sq) 81px 81px / 100% 100%,
var(--sq) calc(100% / 6) calc(100% / 6) / calc(100% / 3) calc(100% / 3),
var(--sq) calc(100% / 6) calc(100% / 6) / calc(100% / 9) calc(100% / 9),
var(--sq) calc(100% / 6) calc(100% / 6) / calc(100% / 27) calc(100% / 27);
}
}
</style>
</head>
<body>
<div class="container">
<div class="shape"></div>
</div>
</body>
</html>
View Code
在浏览器中打开包含这段HTML代码的html文件,可以呈现出如图6所示的动画效果。

图6 SierPinski地毯的生成(一)
若在上面代码里.shape的样式定义中加上一句“background-blend-mode: difference;”,则呈现出如图7所示的动画效果。

图7 SierPinski地毯的生成(二)
将SierPinski地毯作为一个立方体各面的图案,定义关键帧使得这个立方体旋转起来。编写如下的HTML文件。


<!DOCTYPE html>
<html>
<head>
<title>3D立方体</title>
<style>
.container
{
margin: 0 auto;
width: 450px;
height:450px;
position: relative;
display:flex;
justify-content:center;
align-items:center;
background:#d8d8d8;
border: 4px solid rgba(255, 0, 0, 0.9);
border-radius: 10%;
perspective: 1000px;
}
.cube
{
display: block;
width: 243px;
height: 243px;
transform-style: preserve-3d;
will-change: transform;
animation: rotate 10s linear infinite;
}
.side
{
position: absolute;
width: 100%;
height: 100%;
--sq: conic-gradient(from 270deg at calc(100% / 3) calc(100% / 3),
#f00 90deg, transparent 0);
background: var(--sq) 81px 81px / 100% 100%,
var(--sq) calc(100% / 6) calc(100% / 6) / calc(100% / 3) calc(100% / 3),
var(--sq) calc(100% / 6) calc(100% / 6) / calc(100% / 9) calc(100% / 9),
var(--sq) calc(100% / 6) calc(100% / 6) / calc(100% / 27) calc(100% / 27),
var(--sq) calc(100% / 6) calc(100% / 6) / calc(100% / 81) calc(100% / 81);
background-color: #fff;
}
.side:nth-child(1)
{
transform: translateZ(121.5px);
}
.side:nth-child(2)
{
transform: translateZ(-121.5px);
}
.side:nth-child(3)
{
transform: rotateY(90deg) translateZ(121.5px);
}
.side:nth-child(4)
{
transform: rotateY(-90deg) translateZ(121.5px);
}
.side:nth-child(5)
{
transform: rotateX(90deg) translateZ(121.5px);
}
.side:nth-child(6)
{
transform: rotateX(-90deg) translateZ(121.5px);
}
@keyframes rotate
{
100% { transform: rotateX(1turn) rotateY(1turn) rotateZ(1turn); }
}
</style>
</head>
<body>
<div class="container">
<div class="cube">
<div class="side"></div>
<div class="side"></div>
<div class="side"></div>
<div class="side"></div>
<div class="side"></div>
<div class="side"></div>
</div>
</div>
</body>
</html>
View Code
在浏览器中打开包含这段HTML代码的html文件,可以呈现出如图8所示的动画效果。

图8 SierPinski地毯图案立方体的旋转(一)
同样,若在上面代码里.side的样式定义中加上一句“background-blend-mode: difference;”,则呈现出如图9所示的动画效果。

图9 SierPinski地毯图案立方体的旋转(二)
