Safari 中的意外动画行为
Unexpected animation behaviour in safari
我在下面演示了一系列动画(参见 gif)。
有一种名为 fadeIn
的特定动画在 chrome 和 firefox 上运行良好,但在 safari 中却有这种奇怪的闪烁行为。
动画代码如下:
@keyframes fadeIn {
0% { opacity: 0; }
100% { opacity: 0.4; }
}
以下是它如何应用于元素:
animation:
.35s ease 1.35s forwards fadeIn,
.35s ease 2s reverse forwards fadeIn;
注意所有这些都是在构建过程中自动添加前缀的(在检查器中检查并确认)
示例 1(Chrome 和 Firefox)
示例 2(Safari)
关于为什么它在 safari 中表现如此奇怪的任何想法?
JSFiddle: https://jsfiddle.net/9jqjssyw
这证明了这个问题,如果您查看 chrome 它表现良好,即最初淡入所有文本,然后以不同的延迟逐行淡出。然而,在 safari 中,每一行都是闪烁的并且永远不会淡入。
我不是一个超级动画用户。但是,我稍微看了看您的fiddle,似乎 Safari 不支持链接动画。
您的第一个 "fadeIn" 动画被 safari 忽略,直接进入第二个动画。
当我们简单地删除第一行动画时,查看重现的 Safari 行为:
.example {
opacity: 0;
text-transform: uppercase;
text-align: center;
font-family: sans-serif;
margin: 10px 0;
}
.one {
animation: .35s ease 2s reverse forwards fadeIn;
}
.two {
animation: .35s ease 4s reverse forwards fadeIn;
}
.three {
animation: .35s ease 6s reverse forwards fadeIn;
}
@keyframes fadeIn {
0% {
opacity: 0;
}
100% {
opacity: 0.7;
}
}
<div class="example one">Text 1</div>
<div class="example two">Text 3</div>
<div class="example three">Text 4</div>
Edit: Tested on IE11 and Edge, your animation process acts exactly as
Safari. I guess animation chaining as you tried is not fully supported.
建议是重新考虑您的动画过程并可能利用 javascript。
像这样应用时,如果有 2 个动画,您需要有 2 个关键帧,否则它将无法工作,因为您不能为相同的关键帧计时两次。 (好吧,Chrome 倾向于使各种 none 标准的东西起作用 :)
以下示例在 Chrome/Firefox/IE11/Edge 上测试成功。
此外,您也许还可以使用 timing-function with steps 将动画放在一起,尽管这个具有 2 个关键帧的动画要简单得多。
堆栈片段
.example {
opacity: 0;
text-transform: uppercase;
text-align: center;
font-family: sans-serif;
margin: 10px 0;
}
.one {
animation:
.35s ease 0.5s forwards fadeIn,
.35s ease 2s forwards fadeOut;
}
.two {
animation:
.35s ease 0.5s forwards fadeIn,
.35s ease 4s forwards fadeOut;
}
.three {
animation:
.35s ease 0.5s forwards fadeIn,
.35s ease 6s forwards fadeOut;
}
@keyframes fadeIn {
0% { opacity: 0; }
100% { opacity: 0.7; }
}
@keyframes fadeOut {
0% { opacity: 0.7; }
100% { opacity: 0; }
}
<div class="example one">Text 1</div>
<div class="example two">Text 3</div>
<div class="example three">Text 4</div>
我在下面演示了一系列动画(参见 gif)。
有一种名为 fadeIn
的特定动画在 chrome 和 firefox 上运行良好,但在 safari 中却有这种奇怪的闪烁行为。
动画代码如下:
@keyframes fadeIn {
0% { opacity: 0; }
100% { opacity: 0.4; }
}
以下是它如何应用于元素:
animation:
.35s ease 1.35s forwards fadeIn,
.35s ease 2s reverse forwards fadeIn;
注意所有这些都是在构建过程中自动添加前缀的(在检查器中检查并确认)
示例 1(Chrome 和 Firefox)
示例 2(Safari)
关于为什么它在 safari 中表现如此奇怪的任何想法?
JSFiddle: https://jsfiddle.net/9jqjssyw 这证明了这个问题,如果您查看 chrome 它表现良好,即最初淡入所有文本,然后以不同的延迟逐行淡出。然而,在 safari 中,每一行都是闪烁的并且永远不会淡入。
我不是一个超级动画用户。但是,我稍微看了看您的fiddle,似乎 Safari 不支持链接动画。
您的第一个 "fadeIn" 动画被 safari 忽略,直接进入第二个动画。
当我们简单地删除第一行动画时,查看重现的 Safari 行为:
.example {
opacity: 0;
text-transform: uppercase;
text-align: center;
font-family: sans-serif;
margin: 10px 0;
}
.one {
animation: .35s ease 2s reverse forwards fadeIn;
}
.two {
animation: .35s ease 4s reverse forwards fadeIn;
}
.three {
animation: .35s ease 6s reverse forwards fadeIn;
}
@keyframes fadeIn {
0% {
opacity: 0;
}
100% {
opacity: 0.7;
}
}
<div class="example one">Text 1</div>
<div class="example two">Text 3</div>
<div class="example three">Text 4</div>
Edit: Tested on IE11 and Edge, your animation process acts exactly as Safari. I guess animation chaining as you tried is not fully supported.
建议是重新考虑您的动画过程并可能利用 javascript。
像这样应用时,如果有 2 个动画,您需要有 2 个关键帧,否则它将无法工作,因为您不能为相同的关键帧计时两次。 (好吧,Chrome 倾向于使各种 none 标准的东西起作用 :)
以下示例在 Chrome/Firefox/IE11/Edge 上测试成功。
此外,您也许还可以使用 timing-function with steps 将动画放在一起,尽管这个具有 2 个关键帧的动画要简单得多。
堆栈片段
.example {
opacity: 0;
text-transform: uppercase;
text-align: center;
font-family: sans-serif;
margin: 10px 0;
}
.one {
animation:
.35s ease 0.5s forwards fadeIn,
.35s ease 2s forwards fadeOut;
}
.two {
animation:
.35s ease 0.5s forwards fadeIn,
.35s ease 4s forwards fadeOut;
}
.three {
animation:
.35s ease 0.5s forwards fadeIn,
.35s ease 6s forwards fadeOut;
}
@keyframes fadeIn {
0% { opacity: 0; }
100% { opacity: 0.7; }
}
@keyframes fadeOut {
0% { opacity: 0.7; }
100% { opacity: 0; }
}
<div class="example one">Text 1</div>
<div class="example two">Text 3</div>
<div class="example three">Text 4</div>