为什么这个 3d css 动画不能在移动设备上运行?
Why won't this 3d css animation work on mobile?
我有这个 3d 旋转文本 css 动画可以在 chrome 桌面上运行,但不能在移动设备上运行。我尝试添加 webkit 前缀,但它无法在 iphone 上运行。有什么明显的原因吗?
https://codepen.io/warpigs666/pen/bGqQbzL
@keyframes turn {
from { transform: rotate3d(0, 0, 0, 0); }
to { transform: rotate3d(1, 0, 0, 360deg); }
}
.container {
width: 2rem;
height: 2rem;
perspective: 1000px;
margin: 100px;
}
.cube {
position: relative;
width: 2rem;
height: 2rem;
transform-style: preserve-3d;
animation: turn 3s linear infinite;
}
.face {
height: 2rem;
background: white;
backface-visibility: hidden;
position: absolute;
display: flex;
align-items: center;
justify-content: center;
font-family: Arial, sans-serif;
font-size: 2rem;
transition: transform 500ms;
}
.top {
transform: translateY(-1rem) rotateX(90deg);
}
.front {
transform: translateZ(1rem);
}
.bottom {
transform: translateY(1rem) rotateX(-90deg);
}
.back {
transform: translateZ(-1rem) rotateX(180deg);
}
@media (prefers-reduced-motion: reduce) {
.cube {
animation: none;
transform: rotate3d(1, 1, 0, 45deg);
}
}
我能够在 iOS 上的移动版 Safari 和 Mac 上的桌面版 Safari 中重现您的错误,因此该错误似乎至少与一般的 Safari 相关,不一定特定于移动设备。 Safari 显然不喜欢只有 2 个关键帧的 rotate3d 变换动画。
修复归结为向 @keyframes
CSS 添加一个中间关键帧(参见 50%
):
@keyframes turn {
0% {
transform: rotate3d(1, 0, 0, 0deg);
}
50% {
transform: rotate3d(1, 0, 0, 180deg);
}
100% {
transform: rotate3d(1, 0, 0, 360deg);
}
}
这是一个更新的 Codepen,其中包含正在执行的修复程序:
https://codepen.io/maqam7/pen/OJpaypZ
请注意,我在调试时删除了大部分前缀规则,还因为它们在较新版本的 Safari 中是不必要的(显然 -webkit-backface-visibility
除外)。如果您想将它们添加回去,由您决定。请注意,我还删除了 .face
class 上的过渡样式,因为它们什么也没做。
我无法访问 android phone,所以我无法验证它在那里是否有效。但是,我可以验证上述修复在最新的(截至撰写本文时)桌面 Chrome (Mac)、桌面 Firefox (Mac)、桌面 Safari (Mac ) 以及 iOS.
上的 Mobile Safari
一旦我意识到问题出在 Safari 上就提供解决方案的这个 Stack Overflow 答案的支持:
我有这个 3d 旋转文本 css 动画可以在 chrome 桌面上运行,但不能在移动设备上运行。我尝试添加 webkit 前缀,但它无法在 iphone 上运行。有什么明显的原因吗?
https://codepen.io/warpigs666/pen/bGqQbzL
@keyframes turn {
from { transform: rotate3d(0, 0, 0, 0); }
to { transform: rotate3d(1, 0, 0, 360deg); }
}
.container {
width: 2rem;
height: 2rem;
perspective: 1000px;
margin: 100px;
}
.cube {
position: relative;
width: 2rem;
height: 2rem;
transform-style: preserve-3d;
animation: turn 3s linear infinite;
}
.face {
height: 2rem;
background: white;
backface-visibility: hidden;
position: absolute;
display: flex;
align-items: center;
justify-content: center;
font-family: Arial, sans-serif;
font-size: 2rem;
transition: transform 500ms;
}
.top {
transform: translateY(-1rem) rotateX(90deg);
}
.front {
transform: translateZ(1rem);
}
.bottom {
transform: translateY(1rem) rotateX(-90deg);
}
.back {
transform: translateZ(-1rem) rotateX(180deg);
}
@media (prefers-reduced-motion: reduce) {
.cube {
animation: none;
transform: rotate3d(1, 1, 0, 45deg);
}
}
我能够在 iOS 上的移动版 Safari 和 Mac 上的桌面版 Safari 中重现您的错误,因此该错误似乎至少与一般的 Safari 相关,不一定特定于移动设备。 Safari 显然不喜欢只有 2 个关键帧的 rotate3d 变换动画。
修复归结为向 @keyframes
CSS 添加一个中间关键帧(参见 50%
):
@keyframes turn {
0% {
transform: rotate3d(1, 0, 0, 0deg);
}
50% {
transform: rotate3d(1, 0, 0, 180deg);
}
100% {
transform: rotate3d(1, 0, 0, 360deg);
}
}
这是一个更新的 Codepen,其中包含正在执行的修复程序:
https://codepen.io/maqam7/pen/OJpaypZ
请注意,我在调试时删除了大部分前缀规则,还因为它们在较新版本的 Safari 中是不必要的(显然 -webkit-backface-visibility
除外)。如果您想将它们添加回去,由您决定。请注意,我还删除了 .face
class 上的过渡样式,因为它们什么也没做。
我无法访问 android phone,所以我无法验证它在那里是否有效。但是,我可以验证上述修复在最新的(截至撰写本文时)桌面 Chrome (Mac)、桌面 Firefox (Mac)、桌面 Safari (Mac ) 以及 iOS.
上的 Mobile Safari一旦我意识到问题出在 Safari 上就提供解决方案的这个 Stack Overflow 答案的支持: