手把手教你用CSS实现【平底锅炒蛋】

746 阅读5分钟

前言

不知各位JYM平时有没有做饭的习惯,像我,一到周末就会给自己一个大展厨艺的机会,因此今天要实现的效果也将会是和厨艺有关。没错,这次给大家带来的是一个生动的平底锅翻炒鸡蛋。该效果可以分为两部分,一是平底锅,二是鸡蛋,如果还要细分的话可以再加上翻炒这样一个动作动画

效果预览

以上就是整个效果的预览状态,接下来将带大家来逐一实现它们。

HTML

首先我们看到HTML部分,相关代码如下。这里总共包括了五到六个部分。

<div class="pan-loader">
      <div class="loader"></div>
      <div class="pan-container">
        <div class="pan"></div>
        <div class="handle"></div>
      </div>
      <div class="shadow"></div>
    </div>

.pan-loader 是最外层容器的样式,设置了宽度、高度、背景颜色等属性,使其成为一个矩形容器。.loader 是旋转圆圈的样式,设置了宽度、高度、边框、边框圆角、动画等属性,使其成为一个旋转的圆圈。.pan-container 是容器的样式,设置了宽度、高度、背景颜色等属性,使其成为一个矩形容器。.pan 是平底锅的样式,设置了宽度、高度、边框、边框圆角等属性,使其成为一个平底锅的形状。.handle 是手柄的样式,设置了宽度、高度、背景颜色等属性,使其成为一个手柄。.shadow 是阴影的样式,设置了宽度、高度、背景颜色等属性,使其成为一个阴影效果。

综上所述,通过旋转的荷包蛋、平底锅和手柄的组合,以及阴影效果,形成了一个平底锅炒蛋动画。

CSS

接下来便是CSS部分了,前面我们也提到过这里应用到了很多旋转动画,这些都是在CSS中实现的。

下面是loader类的动画实现,loader类其实代表的就是荷包蛋,因为看起来像加载过程,因此命名为loader,相关代码如下。

.loader {
  position: relative;
  top: 10%;
  left: 0;
  width: 45%;
  height: 45%;
  border: 10px solid transparent;
  border-bottom: 10px solid #fdd835;
  border-radius: 50%;
  animation: loader 2s linear infinite;
  z-index: -1;
}
@keyframes loader {
  0% {
    width: 10%;
    transform: rotate(0deg);
  }
  10% {
    left: 0%;
    transform: rotate(0);
  }
  20% {
    width: 0;
    left: 20%;
  }
  30% {
    width: 25%;
  }
  50% {
    left: 10%;
    width: 35%;
  }
  70% {
    width: 30%;
    left: 18%;
    transform: rotate(240deg);
  }
  90% {
    width: 30%;
    left: 10%;
  }
  100% {
    width: 2%;
    left: 25%;
    transform: rotate(360deg);
  }
}

在荷包蛋中定义了名为loader的动画。该动画是一个线性的、无限循环的动画,持续时间为2秒。动画的关键帧定义了加载器在不同时间点的样式。在 0% 关键帧指定了加载器的宽度为10%、旋转角度为0度;在 10% 关键帧指定了加载器的左侧位置为0%、旋转角度为0度;以此类推,直到 100% 关键帧指定了加载器的宽度为2%、左侧位置为25%、旋转角度为360度。

下面是pan类的动画实现,相关代码如下。

@keyframes pan {
  0% {
    transform: rotate(0deg);
    transform-origin: top right;
  }
  10% {
    transform: rotate(-2deg);
    transform-origin: top right;
  }
  50% {
    transform: rotate(15deg);
  }
  100% {
    transform: rotate(0deg);
  }
}

这里定义了一个名为pan的动画。动画中定义了四个关键帧 (0%,10%,50%,100%),每个关键帧对应不同的动画状态。

在第一个关键帧 0%,元素的初始位置为绕右上角顺时针旋转0度,即不进行旋转。同时,transform-origin属性被设置为top right,表示旋转的中心点位于元素的右上角。

在第二个关键帧 10%,元素开始逐渐向逆时针方向旋转,旋转角度为 -2度。transform-origin属性的值保持不变。

在第三个关键帧 50%,元素已经旋转到了15度的角度。transform-origin属性的值保持不变。

在最后一个关键帧 100%,元素恢复到初始状态,即旋转角度为0度。

接下来是shadow类中的动画实现,相关代码如下。

.shadow {
  position: relative;
  background: lightgray;
  width: 30%;
  height: 8px;
  top: 15%;
  left: 15%;
  border-radius: 20px;
  animation: shadow 2s infinite;
}
@keyframes shadow {
  0% {
    width: 30%;
  }
  50% {
    width: 40%;
    left: 20px;
  }
  100% {
    width: 30%;
  }
}

@keyframes shadow 中。它定义了元素的宽度和左侧位置在不同关键帧(百分比)的变化。具体来说,在 0% 关键帧,元素的宽度为30%;在 50% 关键帧,元素的宽度变为40%,左侧位置变为20像素;在 100% 关键帧,元素的宽度恢复为30%。由于动画属性设置为infinite,所以动画将无限循环播放。

这里主要介绍的是相关动画的实现,关于其他样式大家可以去码上掘金查看完整代码。

总结

以上就是整个翻炒鸡蛋效果的实现过程了,代码比较简单,不涉及复杂的JS逻辑,只有纯CSS部分。通过CSS动画来控制翻炒的动作,让平底锅和鸡蛋结合在一起不显得生硬,另外,如果有其他想法的话大家也可以在此效果上进行二次创作,也欢迎各位在评论区分享自己的想法。最后,该效果的完整代码在码上掘金里可以查看,如果有什么问题大家在评论区里讨论~