サイトロゴ

Enjoy Creating
Web & Mobile Apps

MENU BOX
Webで
遊ぼ!
OPEN

ホーム

 > 

サンプルコード集

 > 

回転・フタが開閉する3Dボックス

回転・フタが開閉する3Dボックス

2021・05・29

*クリック(タップ)するとボックスが回転してフタが開閉します*

一見平面に見える「front」と書かれたボックスをクリックすると、回転して3Dであることがわかります。回転させるだけだと面白くないので、フタが開くようにしてみました。
フタが開いた状態のボックスをクリックすると、フタが閉じて元の状態に戻ります。

使用機能:CSS・JavaScript

front
back
right
left
top
bottom

*上のボックスをクリック(タップ)すると、回転&開閉します!*

上記のサンプルコードを掲載しています。学習用としてご自由にコピペしてお使い下さい。(※スクロールできます)

HTML・CSS・JavaScript

<!DOCTYPE html>
<html lang="ja" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title></title>
    <style>
    .samplet_box_in_box {
      font-family:"游ゴシック体 Medium","游ゴシック体","游ゴシック Medium","Yu Gothic","YuGothic",sans-serif;
      display: flex;
      flex-direction: column;
      height: 500px;
      align-items: center;
      justify-content: center;
    }
    .sample_threedbox {
      cursor: pointer;
      width: 100px;
      height: 100px;
      transform-style: preserve-3d;
    }
    .sample_threedbox_active {
      animation: sampleboxmove 4s linear 0s forwards 1 normal;
    }
    @keyframes sampleboxmove {
      20% {transform: rotate3d(-1, 1, -1, -0.2turn);}
      40% {transform: rotate3d(-1, 1, -1, -0.4turn);}
      60% {transform: rotate3d(-1, 1, -1, -0.6turn);}
      80% {transform: rotate3d(-1, 1, -1, -0.8turn);}
      100% {transform: rotate3d(-1, 1, -1, -0.8turn);}
    }

    .sample_threedbox_back {
      animation: sampleboxmove2 4s linear 0s forwards 1 normal;
    }
    @keyframes sampleboxmove2 {
      0% {transform: rotate3d(-1, 1, -1, -0.8turn);}
      20% {transform: rotate3d(-1, 1, -1, -0.8turn);}
      40% {transform: rotate3d(-1, 1, -1, -0.6turn);}
      60% {transform: rotate3d(-1, 1, -1, -0.4turn);}
      80% {transform: rotate3d(-1, 1, -1, -0.2turn);}
      100% {transform: rotate3d(0, 0, 0, 0turn);}
    }

    .sample_plate {
      display: flex;
      align-items: center;
      justify-content: center;
      width: 100%;
      height: 100%;
      position: absolute;
      backface-visibility: inherit;
      color: #fff;
    }
    .sample_onep {
      background: rgba(246, 127, 184, 0.71);
      transform: translateZ(50px);
    }
    .sample_twop{
      background: rgba(246, 127, 184, 0.56);
      transform: translateZ(-50px);
    }
    .sample_threep {
      background: rgba(252, 169, 209, 0.73);
      transform: rotateY(90deg) translateZ(50px);
    }
    .sample_fourp {
      background: rgba(246, 127, 184, 0.34);
      transform: rotateY(-90deg) translateZ(50px);
    }
    .sample_fivep {
      background: rgba(245, 173, 207, 0.63);
      transform: rotateX(90deg) translateZ(50px);
      transition: all .8s;
    }
    .sample_sixp {
        background: rgba(246, 127, 184, 0.77);
      transform: rotateX(-90deg) translateZ(50px);
    }
    </style>
  </head>
  <body>
    <div class="samplet_box_in_box">
      <div id="sample_threed_b" class="sample_threedbox">
        <div class="sample_onep sample_plate" style="font-size:.85rem;">front</div>
        <div class="sample_twop sample_plate">back</div>
        <div class="sample_threep sample_plate">right</div>
        <div class="sample_fourp sample_plate">left</div>
        <div id="sample_five_p" class="sample_fivep sample_plate">top</div>
        <div class="sample_sixp sample_plate">bottom</div>
      </div>
      <p style="color:tomato; font-size:.78rem; margin-top: 40px;">*上のボックスをクリック(タップ)すると、回転&開閉します!*</p>
    </div>
    <script type="text/javascript">
    {
      const sample_threed_b = document.getElementById('sample_threed_b');
      const sample_five_p = document.getElementById('sample_five_p')

      sample_threed_b.addEventListener('click',function () {
        if (sample_threed_b.classList.contains('sample_threedbox_active')) {
          sample_five_p.style.transform = 'rotateX(90deg) translateZ(50px)';
          sample_threed_b.classList.remove('sample_threedbox_active');
          sample_threed_b.classList.add('sample_threedbox_back');
        }
        else {
          sample_threed_b.classList.remove('sample_threedbox_back');
          sample_threed_b.classList.add('sample_threedbox_active');
          setTimeout(function () {
            sample_five_p.style.transform = 'rotateX(90deg) translateZ(100px)';
          },3500);
        }
      });
    }
    </script>
  </body>
</html>
« »