Как сделать анимированный 3D-куб с меню, которое будет перемещаться к нужной стенке куба? - PullRequest
0 голосов
/ 08 сентября 2018

Сайт должен содержать четыре раздела: О, Навыки, Проекты и Контакты. Я придумал сделать анимированное меню на 3D кубе. Каждая стена куба отвечает за один из разделов. Когда я нажму «О», куб вырастет, повернется к стене и покажет содержимое в квадрате. Он должен иметь кнопку, которая позволит вернуться к главной стене куба.

enter image description here

Какую технологию использовать для создания куба и анимации?

Я нашел что-то вроде:

var cube = document.querySelector('.cube');
var radioGroup = document.querySelector('.radio-group');
var currentClass = '';

function changeSide() {
  var checkedRadio = radioGroup.querySelector(':checked');
  var showClass = 'show-' + checkedRadio.value;
  if ( currentClass ) {
    cube.classList.remove( currentClass );
  }
  cube.classList.add( showClass );
  currentClass = showClass;
}
// set initial side
changeSide();

radioGroup.addEventListener( 'change', changeSide );
* {
    box-sizing: border-box;
    margin: 0;
    padding: 0;
    font-size: 24px;
    font-family: 'Signika', sans-serif;
  }

  * { box-sizing: border-box; }


.scene {
  width: 200px;
  height: 200px;
  border: 1px solid #CCC;
  margin: 80px;
  perspective: 400px;
}

.cube {
  width: 200px;
  height: 200px;
  position: relative;
  transform-style: preserve-3d;
  transform: translateZ(-100px);
  transition: transform 1s;
}

.cube.show-front  { transform: translateZ(-100px) rotateY(   0deg); }
.cube.show-right  { transform: translateZ(-100px) rotateY( -90deg); }
.cube.show-back   { transform: translateZ(-100px) rotateY(-180deg); }
.cube.show-left   { transform: translateZ(-100px) rotateY(  90deg); }
.cube.show-top    { transform: translateZ(-100px) rotateX( -90deg); }
.cube.show-bottom { transform: translateZ(-100px) rotateX(  90deg); }

.cube__face {
  position: absolute;
  width: 200px;
  height: 200px;
  border: 2px solid black;
  line-height: 200px;
  font-size: 40px;
  font-weight: bold;
  color: white;
  text-align: center;
}

.cube__face--front  { background: hsla(  0, 100%, 50%, 0.7); }
.cube__face--right  { background: hsla( 60, 100%, 50%, 0.7); }
.cube__face--back   { background: hsla(120, 100%, 50%, 0.7); }
.cube__face--left   { background: hsla(180, 100%, 50%, 0.7); }
.cube__face--top    { background: hsla(240, 100%, 50%, 0.7); }
.cube__face--bottom { background: hsla(300, 100%, 50%, 0.7); }

.cube__face--front  { transform: rotateY(  0deg) translateZ(100px); }
.cube__face--right  { transform: rotateY( 90deg) translateZ(100px); }
.cube__face--back   { transform: rotateY(180deg) translateZ(100px); }
.cube__face--left   { transform: rotateY(-90deg) translateZ(100px); }
.cube__face--top    { transform: rotateX( 90deg) translateZ(100px); }
.cube__face--bottom { transform: rotateX(-90deg) translateZ(100px); }

label { margin-right: 10px; }
        <div class="scene">
            <div class="cube">
              <div class="cube__face cube__face--front">front</div>
              <div class="cube__face cube__face--back">back</div>
              <div class="cube__face cube__face--right">right</div>
              <div class="cube__face cube__face--left">left</div>
              <div class="cube__face cube__face--top">top</div>
              <div class="cube__face cube__face--bottom">bottom</div>
            </div>
          </div>



          
          <p class="radio-group">
            <label>
              <input type="radio" name="rotate-cube-side" value="front" checked /> front
            </label>
            <label>
              <input type="radio" name="rotate-cube-side" value="right" /> right
            </label>
            <label>
              <input type="radio" name="rotate-cube-side" value="back" /> back
            </label>
            <label>
              <input type="radio" name="rotate-cube-side" value="left" /> left
            </label>
            <label>
              <input type="radio" name="rotate-cube-side" value="top" /> top
            </label>
            <label>
              <input type="radio" name="rotate-cube-side" value="bottom" /> bottom
            </label>
          </p>

Как изменить ввод метки, находящейся в нижней части куба, на кнопки в кубе? И как это сделать - когда я нажимаю кнопку, стена становится полноэкранной и создает новую кнопку X, которая позволит вернуться к главной стене куба.

...