作品紹介

CSSアニメーション。動物。

制作期間7時間
リンクデモページを見る
仕組み画像をillustrationで切りわけ、それぞれの画像にキーフレームアニメーションを設定します。
アピールポイント全てCSSアニメーションで実装している点。
工夫した点複数のtransformプロパティを組み合わせて自然な動きを再現している点

サイトマップ

HTML

<body>
  <div class="global-wrapper">
    <main class="l-main p-main">
      <ul class="c-bird ">
        <li class="c-bird-1"><img src="https://www.tsuruten-web123.com/portforio/wp-content/themes/tsuruten-web.com/img/bird-body.png" alt="羽ばたくことり"></li>
        <li class="c-bird-2"><img src="https://www.tsuruten-web123.com/portforio/wp-content/themes/tsuruten-web.com/img/flapping-up.png" alt="羽ばたくことり"></li>
        <li class="c-bird-3"><img src="https://www.tsuruten-web123.com/portforio/wp-content/themes/tsuruten-web.com/img/flapping-down.png" alt="羽ばたくことり"></li>
      </ul>
      <span class="c-bird__shadow"></span>
    </main>
  </div>
</body>

SASS

//レイアウトのためのCSS
main {
  height: 100%;
}

li {
  list-style: none;
}

.global-wrapper {
  height: 100vh;
}


//鳥の動き
.c-bird {
  margin-top: 50vh;
  display: block;
  width: 357px;
  animation: boundY 0.8s ease-in infinite alternate;

  //胴体の画像
  &-1 {
    position: relative;
    top: -20px;
    z-index: 100;
    opacity: 1;
    animation: boundX 16s infinite;
  }

  //羽が上を向いている画像
  &-2 {
    position: absolute; 
    top: -60px;
    left: 45px;
    opacity: 0;
    animation:flapping1 1.6s 0.8s infinite, boundX 16s infinite;
  }

  //羽が下を向いている画像
  &-3 {
    position: absolute; 
    top: 75px;
    left: 120px;
    opacity: 0;
    animation:flapping2 1.6s 0.8s infinite, boundX 16s infinite, opposite 16s infinite;
  }

  //影を作る
  &__shadow {
    position: absolute;
    left: 130px;
    top: 55rem;
    width: 60px;
    height: 10px;
    border-radius: 50%;
    background: #000;
    filter: blur(6px);
    opacity:0.9;
    animation: shadow 16s infinite, shadow-extend 0.8s ease-in-out infinite alternate, shadowY 0.8s ease-in-out infinite alternate;
  }
}

@keyframes flapping1 {
  5% {
    opacity: 1;
  }
  10% {
    opacity: 0;
  }
  15% {
    opacity: 1;
  }
  20% {
    opacity: 0;
  }
  25% {
    opacity: 1;
  }
  30% {
    opacity: 0;
  }
  35% {
    opacity: 1;
  }
  40% {
    opacity: 0;
  }
  45% {
    opacity: 1;
  }
  50% {
    opacity: 0;
  }
  100% {
    opacity: 0;
  }
}
@keyframes flapping2 {
  5% {
    opacity: 0;
  }
  10% {
    opacity: 1;
  }
  15% {
    opacity: 0;
  }
  20% {
    opacity: 1;
  }
  25% {
    opacity: 0;
  }
  30% {
    opacity: 1;
  }
  35% {
    opacity: 0;
  }
  40% {
    opacity: 1;
  }
  45% {
    opacity: 0;
  }
  50% {
    opacity: 1;
  }
  100% {
    opacity: 1;
  }
}

@keyframes boundY {
	from  { transform: translateY(0rem); }
	to { transform: translateY(20rem); }
}

@keyframes boundX {
	from  { transform: translateX(0vw) scale(1,1); }
	49%  { transform: translateX(80vw) scale(1,1); }
	50%  { transform: translateX(80vw) scale(-1,1); }
	to { transform: translateX(0vw) scale(-1,1); }
}

@keyframes opposite {
  from {left: 120px; top: 75px}
  49% {left: 120px; top: 75px;}
  50% {left: -50px; top: 25px;}
  to {left: -50px; top: 25px;}
}

@keyframes shadow {
	from  { transform: translateX(0vw) scale(1,1); filter: blur(4px); }
	49%  { transform: translateX(80vw) scale(1,1); filter: blur(4px); }
	50%  { transform: translateX(80vw)  scale(1,1); filter: blur(4px);}
	to { transform: translateX(0vw) scale(1,1); filter: blur(4px); }
}

@keyframes shadow-extend {
	from  { width: 100px; height: 50px; filter: blur(4px);}
	to { width: 150px; height: 50px; filter: blur(8px);}
}