当父级从 display:none 切换到 block 时停止重播动画

Dus*_*tin 6 css css-animations

我有一组选项卡,每个选项卡都包含一个动画子元素。当我单击每个选项卡时,会发生该选项卡内子元素的动画运行。我不想让它运行。我希望动画第一次运行,然后在父级从 切换display:none到时不再重播display:block

在下面我制作的示例中,我有 2 个父 div,每个都有一个向右移动的子 div。当每个父母都设置为阻止动画重播时,我不希望发生这种情况。我希望每个孩子都保持在右侧。我怎样才能做到这一点?

$(".toggler").on("click", function() {
  $(".parent").toggleClass("active");
});
Run Code Online (Sandbox Code Playgroud)
.parent {
  display: none;
  cursor: pointer;
}
.child {
  width: 100px;
  height: 100px;
  background-color: red;
  position: relative;
  animation: move 200ms cubic-bezier(.91, .8, .54, 1.39);
}
.active {
  display: block;
}
.child.red {
  background-color: red;
}
.child.blue {
  background-color: blue;
}
@keyframes move {
  from {
    left: 0;
  }
  to {
    left: 180px;
  }
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<a class="toggler">Click this</a>

<div class="parent active">
  <div class="child red"></div>
</div>

<div class="parent">
  <div class="child blue"></div>
</div>
Run Code Online (Sandbox Code Playgroud)

小提琴演示

Har*_*rry 3

是的,每次将display值更改为none其他值时,动画都会重新启动。

\n\n

根据W3C 规范:(重点是我的)

\n\n
\n

将显示属性设置为 \xe2\x80\x98none\xe2\x80\x99 将终止应用于该元素及其后代的任何正在运行的动画。如果元素的显示为 \xe2\x80\x98none\xe2\x80\x99,则将显示更新为 \xe2\x80\x98none\xe2\x80\x99 以外的值将启动由 \ 应用于该元素的所有动画。 xe2\x80\x98animation-name\xe2\x80\x99 property,以及应用于除 \xe2\x80\x98none\xe2\x80\x99 之外的后代的所有动画。

\n
\n\n

没有直接的方法可以防止这种情况发生,因为这预期的行为。您可以通过使用其他方法来隐藏元素而不是使用 来解决这种情况display: none

\n\n

以下是关于如何在没有display: none. 并不强制只使用以下解决方法之一,也可以使用其他方法,只要它不涉及更改display元素的属性即可。

\n\n
    \n
  • 使用height: 0, width: 0,overflow: hidden隐藏元素。

    \n\n

    \r\n
    \r\n
    $(".toggler").on("click", function() {\r\n  $(".parent").toggleClass("active");\r\n});
    Run Code Online (Sandbox Code Playgroud)\r\n
    .parent {\r\n  height: 0;\r\n  width: 0;\r\n  overflow: hidden;\r\n  cursor: pointer;\r\n}\r\n.child {\r\n  width: 100px;\r\n  height: 100px;\r\n  background-color: red;\r\n  position: relative;\r\n  animation: move 200ms cubic-bezier(.91, .8, .54, 1.39) forwards;\r\n}\r\n.active {\r\n  height: auto;\r\n  width: auto;\r\n  overflow: visible;\r\n}\r\n.child.red {\r\n  background-color: red;\r\n}\r\n.child.blue {\r\n  background-color: blue;\r\n}\r\n@keyframes move {\r\n  from {\r\n    left: 0;\r\n  }\r\n  to {\r\n    left: 180px;\r\n  }\r\n}
    Run Code Online (Sandbox Code Playgroud)\r\n
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>\r\n<a class="toggler">Click this</a>\r\n\r\n<div class="parent active">\r\n  <div class="child red"></div>\r\n</div>\r\n\r\n<div class="parent">\r\n  <div class="child blue"></div>\r\n</div>
    Run Code Online (Sandbox Code Playgroud)\r\n
    \r\n
    \r\n

  • \n
  • 添加容器,使用position: absoluteopacity: 0隐藏元素。

    \n\n

    \r\n
    \r\n
    $(".toggler").on("click", function() {\r\n  $(".parent").toggleClass("active");\r\n});
    Run Code Online (Sandbox Code Playgroud)\r\n
    .container {\r\n  position: relative;\r\n}\r\n.parent {\r\n  position: absolute;\r\n  opacity: 0;\r\n  cursor: pointer;\r\n}\r\n.child {\r\n  width: 100px;\r\n  height: 100px;\r\n  background-color: red;\r\n  position: relative;\r\n  animation: move 200ms cubic-bezier(.91, .8, .54, 1.39) forwards;\r\n}\r\n.active {\r\n  opacity: 1;\r\n}\r\n.child.red {\r\n  background-color: red;\r\n}\r\n.child.blue {\r\n  background-color: blue;\r\n}\r\n@keyframes move {\r\n  from {\r\n    left: 0;\r\n  }\r\n  to {\r\n    left: 180px;\r\n  }\r\n}
    Run Code Online (Sandbox Code Playgroud)\r\n
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>\r\n<a class="toggler">Click this</a>\r\n\r\n<div class=\'container\'>\r\n  <div class="parent active">\r\n    <div class="child red"></div>\r\n  </div>\r\n\r\n  <div class="parent">\r\n    <div class="child blue"></div>\r\n  </div>\r\n</div>
    Run Code Online (Sandbox Code Playgroud)\r\n
    \r\n
    \r\n

  • \n
  • 添加容器,使用position: absolutevisibility: hidden隐藏元素。

    \n\n

    \r\n
    \r\n
    $(".toggler").on("click", function() {\r\n  $(".parent").toggleClass("active");\r\n});
    Run Code Online (Sandbox Code Playgroud)\r\n
    .container {\r\n  position: relative;\r\n}\r\n.parent {\r\n  position: absolute;\r\n  visibility: hidden;\r\n  cursor: pointer;\r\n}\r\n.child {\r\n  width: 100px;\r\n  height: 100px;\r\n  background-color: red;\r\n  position: relative;\r\n  animation: move 200ms cubic-bezier(.91, .8, .54, 1.39) forwards;\r\n}\r\n.active {\r\n  visibility: visible;\r\n}\r\n.child.red {\r\n  background-color: red;\r\n}\r\n.child.blue {\r\n  background-color: blue;\r\n}\r\n@keyframes move {\r\n  from {\r\n    left: 0;\r\n  }\r\n  to {\r\n    left: 180px;\r\n  }\r\n}
    Run Code Online (Sandbox Code Playgroud)\r\n
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>\r\n<a class="toggler">Click this</a>\r\n\r\n<div class=\'container\'>\r\n  <div class="parent active">\r\n    <div class="child red"></div>\r\n  </div>\r\n\r\n  <div class="parent">\r\n    <div class="child blue"></div>\r\n  </div>\r\n</div>
    Run Code Online (Sandbox Code Playgroud)\r\n
    \r\n
    \r\n

  • \n
  • 添加容器,使用position: absolutez-index隐藏元素。

    \n\n

    \r\n
    \r\n
    $(".toggler").on("click", function() {\r\n  $(".parent").toggleClass("active");\r\n});
    Run Code Online (Sandbox Code Playgroud)\r\n
    .container {\r\n  position: relative;\r\n}\r\n.parent {\r\n  position: absolute;\r\n  z-index: -1;\r\n  cursor: pointer;\r\n}\r\n.child {\r\n  width: 100px;\r\n  height: 100px;\r\n  background-color: red;\r\n  position: relative;\r\n  animation: move 200ms cubic-bezier(.91, .8, .54, 1.39) forwards;\r\n}\r\n.active {\r\n  z-index: 1;\r\n}\r\n.child.red {\r\n  background-color: red;\r\n}\r\n.child.blue {\r\n  background-color: blue;\r\n}\r\n@keyframes move {\r\n  from {\r\n    left: 0;\r\n  }\r\n  to {\r\n    left: 180px;\r\n  }\r\n}
    Run Code Online (Sandbox Code Playgroud)\r\n
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>\r\n<a class="toggler">Click this</a>\r\n\r\n<div class=\'container\'>\r\n  <div class="parent active">\r\n    <div class="child red"></div>\r\n  </div>\r\n\r\n  <div class="parent">\r\n    <div class="child blue"></div>\r\n  </div>\r\n</div>
    Run Code Online (Sandbox Code Playgroud)\r\n
    \r\n
    \r\n

  • \n
\n