使用 CSS 绘制并制作 Bender 的脸部动画
飞出个未来 (Futurama) 中生动的角色和简单的动画可以通过 CSS 的基本形状轻松重现。Bender 几乎完全是用基本形状绘制的。本教程将演示如何使用 CSS 创建 Bender 的脸部,并为其眼睑添加动画效果,使其看起来像是在眯着眼睛。在 Codepen 上查看已完成的项目。
容器和颜色
首先,我们创建一个容器并定义背景。十六进制颜色与#a6b4c4
Bender 的金属色非常匹配,但我们可以通过用十六进制颜色创建径向渐变来营造(某种)闪亮#59798e
的效果。
<div class="Bender"></div>
body {
overflow: hidden;
padding: 0;
margin: 0;
}
.Bender {
height: 100vh;
width: 100vw;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
background: #a6b4c4;
background-image: radial-gradient(#a6b4c4, #59798e);
}
眼睛
当我们可以将图像分解成易于用 CSS 创建的简单形状时,使用 CSS 绘图会变得容易得多。例如,本德的眼睛可以分解成三种基本形状:椭圆、圆形和正方形。
Beneder_eyes
外缘由边框和元素之间的空间组成Bender__socket
。眼睛元素的Bender_eye
高度大于Bender_socket
元素本身,因此我们可以裁剪眼睛的顶部和底部,营造出眼睛嵌套在眼窝内的视觉效果。添加以下 HTML 元素和 CSS 来创建眼睛。
<div class="Bender">
<div class="Bender__eyes">
<div class="Bender__socket">
<div class="Bender__eye">
<div class="Bender__pupil"></div>
</div>
<div class="Bender__eye">
<div class="Bender__pupil"></div>
</div>
</div>
</div>
</div>
.Bender__eyes {
width: 400px;
height: 150px;
border: 3px solid black;
border-radius: 200px;
position: relative;
display: flex;
justify-content: center;
align-items: center;
}
.Bender__socket {
width: 375px;
height: 125px;
border: 3px solid black;
border-radius: 200px;
background: black;
display: flex;
justify-content: center;
overflow: hidden;
}
.Bender__eye {
height: 145px;
width: 145px;
background: #fefbb8;
border-radius: 100%;
margin: -10px 10px 0px 10px;
display: flex;
align-items: center;
justify-content: center;
position: relative;
}
.Bender__pupil {
width: 20px;
height: 20px;
background: black;
}
嘴
本德的嘴巴本质上是一个椭圆形,由两条水平线和几条垂直线组成。我们可以使用弹性框和4px
,在椭圆上间隔七条垂直线。这两条水平线的放置稍微困难一些,因为它们与顶部和中间的间距并不均匀。但我们可以使用位置和函数将它们精确地放置在我们想要的位置。Bender__mouth
justify-content: space-around
absolute
calc()
<div class="Bender">
...
<div class="Bender__mouth">
<div class="Bender__tooth"></div>
<div class="Bender__tooth"></div>
<div class="Bender__tooth"></div>
<div class="Bender__tooth"></div>
<div class="Bender__tooth"></div>
<div class="Bender__tooth"></div>
<div class="Bender__tooth"></div>
<div class="Bender__lip"></div>
<div class="Bender__lip"></div>
</div>
</div>
.Bender__mouth {
width: 275px;
height: 100px;
background: #fefbb8;
margin-top: 80px;
border-radius: 50px;
border: 4px solid black;
display: flex;
align-items: center;
justify-content: space-around;
overflow: hidden;
position: relative;
}
.Bender__tooth {
height: 100px;
width: 4px;
background: black;
}
.Bender__lip {
position: absolute;
width: 275px;
height: 4px;
background: black;
top: calc(33% - 2px);
}
.Bender__lip:last-of-type {
top: calc(66% - 2px);
}
让眼睛动起来
我们可以通过控制 Bender 眼睑的上下运动来制作他眯起眼睛的动画,就像他表示怀疑或愤怒一样。我们可以为他的眼睑创建单独的组件,但在本例中,我们将分别使用::before
和::after
伪元素来创建上下眼睑。使用 将position: absolute
眼睑设置在眼睛正上方,如下图所示。
Bender__socket
然而,这些将被具有的元素隐藏overflow: hidden
。
.Bender__eye::before {
content: "";
position: absolute;
width: 145px;
height: 50px;
top: -50px;
background: black;
}
.Bender__eye::after {
content: "";
position: absolute;
width: 145px;
height: 50px;
bottom: -50px;
background: black;
}
我们的目标是让上眼睑向下,下眼睑向上移动,从而营造出眼睑闭合的视觉效果。我们可以通过添加一个transform
沿轴平移眼睑的 来实现Y
,例如transform: translateY(-50px)
。由于我们将上眼睑定义为位于-50px
眼睛上方,因此我们需要从该位置 开始,translateY(0px)
然后向下移动回到瞳孔附近的translateY(50px)
。下眼睑需要朝相反的方向移动translateY(-50px)
。定义两个@keyframes
从 到 的 ,0%
分别100%
用于上眼睑和下眼睑。
@keyframes topEyelid {
0% {
transform: translateY(0px);
}
100% {
transform: translateY(50px);
}
}
@keyframes bottomEyelid {
0% {
transform: translateY(0px);
}
100% {
transform: translateY(-50px);
}
}
接下来,为每个眼睑添加animation
属性,并在末尾添加适当的关键帧名称。
.Bender__eye::before {
animation: 5s ease-in-out 1s infinite topEyelid;
}
.Bender__eye::after {
animation: 5s ease-in-out 1s infinite bottomEyelid;
}
这个动画的一个问题是它突然结束,并将眼睑重置到初始位置,而不是将其动画回去。我们可以通过将动画关键帧分成更多部分来使这个动画更自然。
0%
首先,我们通过从到 的动画更快地到达结束动画20%
。然后,我们可以通过定义相同的transform
直到 来保持该位置80%
。最后,我们可以回到 的起始位置100%
。这意味着动画的开始0%
和结束100%
位于同一位置,因此眼睑将从起始位置移开并返回起始位置。
@keyframes topEyelid {
0% {
transform: translateY(0);
}
20% {
transform: translateY(50px);
}
80% {
transform: translateY(50px);
}
100% {
transform: translateY(0px);
}
}
@keyframes bottomEyelid {
0% {
transform: translateY(0px);
}
20% {
transform: translateY(-50px);
}
80% {
transform: translateY(-50px);
}
100% {
transform: translateY(0px);
}
}
现在我们有了更加自然的动画。
结论
使用 CSS 创建 Bender 可能有六种不同的方法,但我希望这个版本可以帮助您了解使用 CSS 绘图是多么简单。
文章来源:https://dev.to/codypearce/draw-and-animate-bender-s-face-with-css-e8p