[兔了个兔]——让兔子踩走烦恼

253 阅读2分钟

我正在参加「兔了个兔」创意投稿大赛,详情请看:「兔了个兔」创意投稿大赛

前言

新年要跟所有的烦恼说拜拜,今天我们利用CSS动画让兔子将我们的烦恼都踩走,兔子每跳一下,烦恼文字就少一个。

123.gif

实现

布局

我们分为上下两部分,上面是兔子图片,下面是烦恼容器,根据自己的喜好布下局即可:

     * {
        margin: 0 auto;
        padding: 0;
      }
      .wrapper {
        padding-top: 20px;
        width: 500px;
        height: 500px;
        background: gainsboro;
      }
   <div class="wrapper">
      <div class="rabbit">
        <img src="./images/cuteRabbit.jpeg" alt="" />
      </div>
        <div class="brood-wrapper">
          <div class="brood-item">
            <h4 id="content">单身</h4>
          </div>
        </div>
    </div>

跳动的兔子

首先我们找到一个自己喜欢的兔子图片,设置好大小,利用translateY()让兔子'跳起来'然后‘踩下来’,在跳起来的同时我们利用scale()将图片缩小点达到一个视觉效果。

    @keyframes jump {
        0% {
          transform: scale(1);
        }
        75% {
          transform: translateY(-20px) scale(0.9);
        }
        100% {
          transform: translateY(0px) scale(1);
        }
      }

然后在显示‘烦恼’的容器中设置animation属性,我们将动画运动曲线属性设置为ease-in,让落下来的部分快一点,贴近下现实。

    .rabbit {
        width: 50px;
        height: 50px;
        animation: jump 2s 2s ease-in infinite;
      }

摇曳的文字

接下来我们实现摇曳的文字,通过rotate3d()达到旋转效果,同时设置旋转中心为transform-origin: top left; 摇曳后文字掉落部件,这部分我们利用translateY()与opacity()属性实现。动画过程我们分为4部分,让其摇曳两回尽可能达到逼真效果:

    .brood-item {
        width: 50px;
        height: 50px;
        display: flex;
        justify-content: center;
        align-items: center;
        animation: hinge 2s 4s infinite;
        transform-origin: top left;
      }
    @keyframes hinge {
        0% {
          animation-timing-function: ease-in-out;
        }
        20%,
        60% {
          transform: rotate3d(0, 0, 1, 70deg);
          animation-timing-function: ease-in-out;
        }

        40%,
        80% {
          transform: rotate3d(0, 0, 1, 30deg);
          animation-timing-function: ease-in-out;
          opacity: 1;
        }
        100% {
          transform: translateY(50px);
          opacity: 0;
        }

最后利用setInterval去更换踩落的文字,写下一些烦恼,通过Math.random()随机显示一个。

    setInterval(()=>{
          const el = document.getElementById('content')
          el.innerText = ['单身','霉运','吃土','烦恼','人渣','生病','失眠','菜鸡','伤心','困难'][Math.floor(Math.random()*11)]
        },6000)

总结

在我们实现过程中要注意动画、定时器延迟秒数的设置,让动画之间关联起来,使整体效果更加真实。新一年,所有烦恼都会被我们甩掉。