Как исправить проблему с 3D анимацией CSS на iOS (Safari / Chrome)

#javascript #html #css #anime.js

#javascript #HTML #css — код #anime.js

Вопрос:

У меня есть что-то вроде браузерной игры. По щелчку пользователь бросает кубики. Кубики падают через тень, но есть разные блоки, и кубики имеют z-index : 3 и shadow z-index : 2; Эта проблема только на iOS. Для анимации используйте библиотеку anime.js . Может быть, у кого-то была такая же проблема.

Попробуйте добавить скриншот, чтобы показать проблему:

введите описание изображения здесь

 .dice {
  width: 144px;
  height: 144px;
  left: -200px;
  top: -450px;
  z-index: 3;
  transform-style: preserve-3d;
  backface-visibility: hidden;
  transform: translateZ(-72px) rotateX(313deg) rotateY(226deg) scale3d(0.35, 0.35, 0.35);
  z-index: 3;
  .cube_face {
    width: 144px;
    height: 143px;
    border: 1px solid #f5f3e6;
    border-radius: 15px;
  }
}
  
 <div class="diceShadow"></div>
<div class="dice">
  <div class="cube_face cube_face_front"></div>
  <div class="cube_face cube_face_back big-shadow"></div>
  <div class="cube_face cube_face_right"></div>
  <div class="cube_face cube_face_left shadow"></div>
  <div class="cube_face cube_face_top"></div>
  <div class="cube_face cube_face_bottom"></div>
</div>
  
 anime({
  targets: dices[count],
  left: [{
      value: '-200px',
      duration: 0
    },
    {
      value: dicePositions[count].x - 56,
      duration: duration / 2,
      easing: 'easeInCubic'
    },
    {
      value: dicePositions[count].x   15,
      duration: duration / 10,
      easing: 'easeOutQuad'
    },
    {
      value: dicePositions[count].x   30,
      duration: duration / 10,
      easing: 'easeInQuad'
    },
    {
      value: dicePositions[count].x   84,
      duration: duration / 5,
      easing: 'easeOutQuad'
    },
  ],
  top: [{
      value: '-850px',
      duration: 0
    },
    {
      value: dicePositions[count].y - 30,
      duration: duration / 2,
      easing: 'easeInCubic'
    },
    {
      value: dicePositions[count].y - 95,
      duration: duration / 10,
      easing: 'easeOutQuad'
    },
    {
      value: dicePositions[count].y   10,
      duration: duration / 10,
      easing: 'easeInQuad'
    },
    {
      value: dicePositions[count].y   50,
      duration: duration / 5,
      easing: 'easeOutQuad'
    },
  ],
  translateZ: [{
    value: '-72px',
    duration: 0
  }, ],
  rotateX: [{
      value: dicePositions[count].rotateX   132,
      duration: 0
    },
    {
      value: dicePositions[count].rotateX   32,
      duration: duration / 2,
      easing: 'easeInOutQuad'
    },
    {
      value: dicePositions[count].rotateX,
      duration: duration / 4,
      delay: duration / 10,
      easing: 'easeOutCubic',
    },
  ],
  rotateY: [{
      value: dicePositions[count].rotateY - 100,
      duration: 0
    },
    {
      value: dicePositions[count].rotateY - 39,
      duration: duration / 2,
      easing: 'easeInOutQuad'
    },
    {
      value: dicePositions[count].rotateY,
      duration: duration / 4,
      delay: duration / 10,
      easing: 'easeOutQuad',
    },
  ],
  rotateZ: [{
    value: dicePositions[count].rotateZ,
    duration: 0
  }, ],
  scaleX: [{
    value: 0.35,
    duration: 0
  }, ],
  scaleY: [{
    value: 0.35,
    duration: 0
  }, ],
  scaleZ: [{
    value: 0.35,
    duration: 0
  }, ],
});
  

Ответ №1:

Проблема решена! У меня были элементы DOM, которые находились за пределами родительского блока. Когда я поместил их в область родительского блока и добавил непрозрачность, чтобы скрыть их, мои кубики встали на свои места. Пример: были :

 #train {
                width: 158px;
                height: 146px;
                transition: all 0.4s ease-in;
                background: url('../img/train.png') no-repeat center;
                background-size: cover;

                amp;[data-show='false'] {
                    left: -100%;
                    top: -100%;
                }

                amp;[data-show='true'] {
                    left: 9%;
                    top: 14%;
                }
            }
  

сейчас:

 #train {
                width: 158px;
                height: 146px;
                transition: all 0.4s ease-in;
                background: url('../img/train.png') no-repeat center;
                background-size: cover;

                amp;[data-show='false'] {
                    left: 0%;
                    top: 17px;
                    opacity: 0;
                }

                amp;[data-show='true'] {
                    left: 9%;
                    top: 14%;
                    opacity: 1;
                }
            }