サイトロゴ

Enjoy Creating
Web & Mobile Apps

MENU BOX
Webで
遊ぼ!
OPEN

ホーム

 > 

サンプルコード集

 > 

色が自動で変化する3Dボックス(アニメーション付)

色が自動で変化する3Dボックス(アニメーション付)

2021・08・26

*JavaScriptで背景色が自動的に変化するプログラム&アニメーションも取り入れた3Dボックスです*

3Dボックス自体は、rotateX/YtranslateZプロパティを使うことで比較的簡単にできますが、アニメーションやJavaScriptと組み合わせることで、さらに複雑な動きを実装することも可能です。

アニメーションはCSSでもJavaScriptでも実装することが可能ですが、今回はCSSのanimationプロパティで3Dの箱が角度をつけながら動くアニメーションをつけてみました。

また、JavaScriptのSetInterval( )メソッドで、1000ミリ秒ごとに3Dボックスの背景色が変わるようにプログラムを設定。
定期的に同じ色を繰り返すように指定しても良いのですが、今回はランダムな色になるようにMath.floor(Math.random() * 100)で、1~100までの数値をランダムに取得し、それを足し合わせてRGBA値に代入することで、ランダムな色になるようにしています。(透明度は.5で固定)。
このプログラム自体はclass名で要素を取得した上で、styleでbackground-colorプロパティの値が書き換えられるようにするだけなので、そこまで複雑なものではありません。

【 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 {
      width: 100px;
      height: 100px;
      transform-style: preserve-3d;
      animation: sampleboxmove 4s linear 0s backwards infinite alternate;
    }
    @keyframes sampleboxmove {
      0% {transform: rotate3d(0, 0, 0, 0deg);}
      50% {transform: rotate3d(1, 1, -1, 45deg);}
      100% {transform: rotate3d(1, -1, -1, 45deg);}
    }
    .sample_plate {
      display: flex;
      align-items: center;
      justify-content: center;
      width: 100%;
      height: 100%;
      position: absolute;
      backface-visibility: inherit;
      color: #fff;
      transition: .5s;
    }
    .sample_onep {
      background: rgba(127, 142, 246, 0.49);
      transform: translateZ(50px);
    }
    .sample_twop{
      background: rgba(127, 207, 246, 0.56);
      transform: translateZ(-50px);
    }
    .sample_threep {
      background: rgba(252, 252, 169, 0.48);
      transform: rotateY(90deg) translateZ(50px);
    }
    .sample_fourp {
      background: rgba(246, 127, 184, 0.34);
      transform: rotateY(-90deg) translateZ(50px);
    }
    .sample_fivep {
      background: rgba(173, 245, 214, 0.52);
      transform: rotateX(90deg) translateZ(50px);
      transition: all .8s;
    }
    .sample_sixp {
        background: rgba(127, 246, 171, 0.49);
      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>
    </div>
    <script type="text/javascript">
    {
      const sample_onep = document.querySelector('.sample_onep');
      const sample_twop = document.querySelector('.sample_twop');
      const sample_threep = document.querySelector('.sample_threep');
      const sample_fourp = document.querySelector('.sample_fourp');
      const sample_fivep = document.querySelector('.sample_fivep');
      const sample_sixp = document.querySelector('.sample_sixp');

      setInterval( () => {
         const sample_randomNum1 = 50 + Math.floor(Math.random() * 100) + Math.floor(Math.random() * 100);
         const sample_randomNum2 = 50 + Math.floor(Math.random() * 100) + Math.floor(Math.random() * 100);
         const sample_randomNum3 = 50 + Math.floor(Math.random() * 100) + Math.floor(Math.random() * 100);

         sample_onep.style.backgroundColor = `rgba(${sample_randomNum1}, ${sample_randomNum2}, ${sample_randomNum3},0.5)`;

       },1000);

       setInterval( () => {
          const sample_randomNum1 = 50 + Math.floor(Math.random() * 100) + Math.floor(Math.random() * 100);
          const sample_randomNum2 = 50 + Math.floor(Math.random() * 100) + Math.floor(Math.random() * 100);
          const sample_randomNum3 = 50 + Math.floor(Math.random() * 100) + Math.floor(Math.random() * 100);

          sample_twop.style.backgroundColor = `rgba(${sample_randomNum1}, ${sample_randomNum2}, ${sample_randomNum3},0.5)`;

        },1000);

        setInterval( () => {
           const sample_randomNum1 = 50 + Math.floor(Math.random() * 100) + Math.floor(Math.random() * 100);
           const sample_randomNum2 = 50 + Math.floor(Math.random() * 100) + Math.floor(Math.random() * 100);
           const sample_randomNum3 = 50 + Math.floor(Math.random() * 100) + Math.floor(Math.random() * 100);

           sample_threep.style.backgroundColor = `rgba(${sample_randomNum1}, ${sample_randomNum2}, ${sample_randomNum3},0.5)`;

         },1000);

         setInterval( () => {
            const sample_randomNum1 = 50 + Math.floor(Math.random() * 100) + Math.floor(Math.random() * 100);
            const sample_randomNum2 = 50 + Math.floor(Math.random() * 100) + Math.floor(Math.random() * 100);
            const sample_randomNum3 = 50 + Math.floor(Math.random() * 100) + Math.floor(Math.random() * 100);

            sample_fourp.style.backgroundColor = `rgba(${sample_randomNum1}, ${sample_randomNum2}, ${sample_randomNum3},0.5)`;

          },1000);

          setInterval( () => {
             const sample_randomNum1 = 50 + Math.floor(Math.random() * 100) + Math.floor(Math.random() * 100);
             const sample_randomNum2 = 50 + Math.floor(Math.random() * 100) + Math.floor(Math.random() * 100);
             const sample_randomNum3 = 50 + Math.floor(Math.random() * 100) + Math.floor(Math.random() * 100);

             sample_five_p.style.backgroundColor = `rgba(${sample_randomNum1}, ${sample_randomNum2}, ${sample_randomNum3},0.5)`;

           },1000);

           setInterval( () => {
              const sample_randomNum1 = 50 + Math.floor(Math.random() * 100) + Math.floor(Math.random() * 100);
              const sample_randomNum2 = 50 + Math.floor(Math.random() * 100) + Math.floor(Math.random() * 100);
              const sample_randomNum3 = 50 + Math.floor(Math.random() * 100) + Math.floor(Math.random() * 100);

              sample_sixp.style.backgroundColor = `rgba(${sample_randomNum1}, ${sample_randomNum2}, ${sample_randomNum3},0.5)`;

            },1000);

    }
    </script>
  </body>
</html>

« »