Вот решение с использованием Popmotion Pure, использующее встроенные параметры преобразования, а не строку преобразования: https://codepen.io/JeremyRoundill/pen/xxwYpdJ
Вы правы, что проблема основана на математике. Вам нужно установить размеры вашего прямоугольника в CSS, чтобы они были такими, какими вы хотите в конце анимации.
Проблема в том, что Popmotion Pure будет применяться rotateZ
, прежде чем применить scaleX
.
Решение:
CSS использует ширину, чтобы установить желаемые размеры в конце анимации, и преобразование, чтобы установить желаемые размеры в начале. Если вы установите width: 1px
, тогда ваш rotateZ
будет применен до scaleX
, что оставляет вас с ромбом (то есть с перекошенным прямоугольником) вместо повернутого прямоугольника по желанию.
.portal-b {
background: blue;
width: 300px; /* set the width to what you want at the end */
height: 100px;
transform: scaleX(0.001); /* transform the width to what you want at the start */
}
Javascript тогда нужно только снять наш transform: scaleX(0.001)
сверху. Второй ключевой кадр будет анимировать прямоугольник с ширины = 0.3px до width = 300px. Затем последний ключевой кадр поворачивается на -35 градусов вокруг оси Z.
values: [
{ translateX: 0, scaleX: 0.001, rotateZ: 0, transformOrigin: 'left center' },
{ translateX: 200, scaleX: 1, rotateZ: 0, transformOrigin: 'left center' },
{ translateX: 200, rotateZ: -35, transformOrigin: 'center' },
],