我试图放置一些元素,就好像它们被包裹在一个圆圈周围,我得到了一些意想不到的行为,应用translateZ到我的元素与帧运动。
如果我使用模板文字应用样式,而不是使用成帧器运动的转换简写,我会得到预期的效果,如下所示:
transform: `
rotateY(${
i * (360 / images.length) <= 180 ?
i * (360 / images.length) :
((i - (images.length)) * (360 / images.length))
}deg)
translateZ(300px)
`
但是如果我将它们与成帧器运动速记一起应用,我会得到不同的结果,像这样:
rotateY:
i * (360 / images.length) <= 180 ?
i * (360 / images.length) :
((i - (images.length)) * (360 / images.length)),
translateZ: '300px',
此外,如果我使用成帧器运动的简写应用rotateY,它也会添加translateZ(0px)。如果您尝试设置自己的translateZ,它将像这样内联渲染两种样式:
translateZ(300px) rotateY(-45deg) translateZ(0px);
Codesandbox here。您可以尝试在转换样式的2个块中的1个块中进行注解,以查看不同的结果。
1条答案
按热度按时间oxcyiej71#
首先,您必须将translateZ设置为z属性,如代码的此分支所示,在该示例中,它仅正确设置translateZ转换一次
https://codesandbox.io/s/framer-motion-unexpected-translate-z-behavior-forked-y44wps?file=/src/App.js
但要得到你的效果工作,首先必须应用旋转,然后变换,作为定义的顺序是很重要的transnform属性
https://developer.mozilla.org/en-US/docs/Web/CSS/transform#transform_order
我认为这是一个框架运动的问题,他们已经设定了具体的顺序转换:
https://github.com/framer/motion/blob/ea955e0f22971f6c6cb3784b47e8a709dc53bdd4/packages/framer-motion/src/render/html/utils/transform.ts#L11
所以,我认为你可以使用帧运动属性,但找出如何复制相同的效果,但使用帧运动变换顺序