はじめに

「ボタンにリッチ感を出したいな」ってことでくるっと回転するホバーアニメーションです。

DEMO

まずはどんな動きになるかデモをご覧ください。
DEMO

実装していく

DEMO 1

▼HTML
<div class="flip">
  <div class="flip-in">
    <div class="flip-in-front">
      <button class="btn">Button<button>
    <div>
    <div class="flip-in-back">
      <button class="btn btn-hover">Click!<button>
    <div>
  <div>
<div>
▼SCSS
.flip {
  width: 200px;
  height: 80px;
  margin: {
    right: auto;
    left: auto;
  }
  &:hover, &:focus {
    .flip-in {
      transform: rotateY(180deg);
    }
  }
  &-in {
    transform-style: preserve-3d;
    transition: transform .8s ease;
    height: 100%;
    width: 100%;
    &-front, &-back {
      position: absolute;
      top: 0;
      left: 0;
      width: 100%;
      height: 100%;
      backface-visibility: hidden;
      overflow: hidden;
    }
    &-front {
      transform: translateZ(1px);
    }
    &-back {
      transform: rotateY(180deg);
    }
    .btn {
      background: linear-gradient(-180deg,#5f69c5 0,#07119e 100%);
      font-weight: bold;
      color: #fff;
      font-size: 1.5em;
      width: 100%;
      height: 100%;
      border-radius: 50px;
    }
  }
}

DEMO 2

▼HTML
<div class="rotate">
  <div class="rotate-in">
    <button class="btn default-side">Button<button>
    <button class="btn hover-side">Click!<button>
  <div>
<div>
▼SCSS
.rotate {
  &-in {
    height: 80px;
    width: 200px;
    transform-style: preserve-3d;
    transition: transform 300ms ease-in-out;
    transform: translateZ(-40px);
    margin: {
      right: auto;
      left: auto;
    }
    &:hover {
      transform: rotateX(-90deg) translateY(40px);
    }
    .btn {
      position: absolute;
      backface-visibility: hidden;
      width: 100%;
      height: 100%;
      display: flex;
      justify-content: center;
      align-items: center;
      font-weight: bold;
      font-size: 1.5em;
      &.default-side {
        background-color: white;
        border: 3px solid #09b317;
        color: #09b317;
        transform: translateZ(40px);
      }
      &.hover-side {
        color: white;
        background-color: #09b317;
        transform: rotateX(90deg) translateZ(40px);
      }
    }
  }
}

どちらのDEMOもボタンの大枠の要素へtransform-style: preserve-3d;を付与することで3Dの概念を適用しているところがポイントです。

さいごに

どうでしょうか?ボタンホバー時に何かアニメーションがあるとクリックしたくなっちゃいますよね。
ボタン以外にも使えそうなアニメーションなのでどこかで使えればと。

参考ページ

https://liginc.co.jp/484008
https://frontend-diary.com/css-3dbutton/