动画:shorthand 属性 vs 动画名称:

animation: shorthand property vs animation-name:

我到处寻找这个问题的答案,但找不到

我的问题是关于 shorthand 动画 属性 与长途跋涉。

当您想将两个动画链接在一起时,您不能执行以下操作

animation-name: keyframename1 1s, keyframename2 3s;

那是行不通的, 但如果您通过删除 -name 来执行以下操作,它会起作用。

animation: keyframename1 1s, keyframename2 3s;

我无法在任何地方在线找到任何信息,说明为什么您需要从选择器中删除名称部分才能使其正常工作。我知道这是一个 shorthand 属性,但包含 2 个关键帧一个接一个地工作似乎并不是一个冗长的方法。

因为一旦你声明了 animation-name: 它将只获取第一个关键帧名称而忽略第二个。但是 animation: 应该是为一个关键帧组合各种选择器。不适用于组合多个关键帧名称。

如果不按 shorthand 方式,您将如何包含两个关键帧名称以一个接一个地工作?是否可以使用 animation-name: 的选择器?为什么 W3C 网站不解释您实际上可以在 shorthand 属性 中链接关键帧名称,而不仅仅是过渡选择器等

我认为 MDN article 很有见地。

问题是,当您仅指定 animation-name 时,您无法同时指定持续时间。因此,您建议的规则

animation-name: keyframename1 1s, keyframename2 3s; /* this won't work! */

语法无效。您的浏览器可能会将其解释为 "let's only apply animation keyframename1",但至少在 Firefox 中该规则会被完全忽略。实际上,我会期待这种行为。

你的第二条规则有效的并且确实会应用两种动画。这是因为animation directive will take a list of animations, each one including a name and duration. You can specify even more, like the animation-timing-function, animation-iteration-count and animation-fill-mode。您未指定的值设置为默认值。

最后这句话很重要!当你写下以下内容时

animation-duration: 10s; /* this will be overwritten by the next line */
animation: keyframename1;

持续时间将为 0s,因为这是 animation 的默认值,如您在链接文章中所见。

前面提到的具体指令也各有一个列表。因此,如果您想应用多个动画,您可以在一个 animation 规则中完全指定它们,或者使用其他指令分别设置它们的所有属性。

以下代码段说明了这两种方法。可以看到结果完全一样

@keyframes fly-down {
  from { top: 0; }
  to { top: 100px; }
}

@keyframes fly-right {
  from { left: 0; }
  to { left: 100px; }
}

div {
  display: inline-block;
  position: relative;
  padding: 20px;
  border: 1px solid #000;
}

div.method1 {
  animation-duration: 1s, 3s;
  animation-fill-mode: both;
  animation-name: fly-right, fly-down;
}

div.method2 {
  animation: fly-right 1s both,
             fly-down 3s both;
}
<div class="method1">Hi!</div>
<div class="method2">Hi!</div>