使用 CSS 绘制并制作 Bender 的脸部动画

2025-06-04

使用 CSS 绘制并制作 Bender 的脸部动画

飞出个未来 (Futurama) 中生动的角色和简单的动画可以通过 CSS 的基本形状轻松重现。Bender 几乎完全是用基本形状绘制的。本教程将演示如何使用 CSS 创建 Bender 的脸部,并为其眼睑添加动画效果,使其看起来像是在眯着眼睛。在 Codepen 上查看已完成的项目。

容器和颜色

首先,我们创建一个容器并定义背景。十六进制颜色与#a6b4c4Bender 的金属色非常匹配,但我们可以通过用十六进制颜色创建径向渐变来营造(某种)闪亮#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 绘图会变得容易得多。例如,本德的眼睛可以分解成三种基本形状:椭圆、圆形和正方形。

Bender Eye 分解

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__mouthjustify-content: space-aroundabsolutecalc()

弯曲的眼睛

<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;
}

Bender 眼睑动画

这个动画的一个问题是它突然结束,并将眼睑重置到初始位置,而不是将其动画回去。我们可以通过将动画关键帧分成更多部分来使这个动画更自然。

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);
  }
}

本德 Gif

现在我们有了更加自然的动画。

结论

使用 CSS 创建 Bender 可能有六种不同的方法,但我希望这个版本可以帮助您了解使用 CSS 绘图是多么简单。

文章来源:https://dev.to/codypearce/draw-and-animate-bender-s-face-with-css-e8p
PREV
CSS 中的 Luigi
NEXT
10 个使用 CSS Transforms 的下拉菜单动画