隐藏第二个元素,直到第一个元素完成动画 - CSS 个关键帧

Hide Second Element Until First Element is Finished Animating - CSS Keyframes

我试图让第二个元素在第一个元素完成动画之前完全不显示在屏幕上。到目前为止我试过这个:

@keyframes slideInFromRight {
    0% {
      transform: translateX(100%);
    }
    100% {
      transform: translateX(0);
    }
}

.announcements-container {
    position: fixed;
    top: 80px;
    right: 20px;
    z-index: 1001;
    display: flex;
    flex-direction: column;
    width: 300px;
}

.announcements-1 {
    animation: 0.4s ease-out 0s 1 slideInFromRight;
  }
  
.announcements-2 {
    margin-top: 15px;
    /* opacity: 0; */
    /* display: none; */
    /* animation-fill-mode: both; */
    animation: 0.4s ease-out 0s 1 slideInFromRight;
    animation-delay: 0.4s;
}

.annoucements-header {
    background-color: #1481C3;
    color: #ffffff;
    font-family: "Proxima Nova Bold";
    padding: 7px 10px;
}

.annoucements-close {
    position: absolute;
    right: 5px;
    width: 24px;
    height: 36px;
    cursor: pointer;
    opacity: .85;
}
.annoucements-close:hover {
    opacity: 1;
}
.annoucements-close::before,
.annoucements-close::after {
    content: '';
    width: 24px;
    height: 2px;
    background: white;
    position: absolute;
    top: 7px;
    left: 0;
}
.annoucements-close::before {
    transform: rotate(-45deg);
}
.annoucements-close::after {
    transform: rotate(45deg);
}
<body>
<div class="announcements-container">
    <div class="announcements-1">
      <div class="annoucements-header">
        <span class="annoucement-type-quantity">2 School Announcements</span>
        <i class="annoucements-close"></i>
      </div>
    </div>
    <div class="announcements-2">
      <div class="annoucements-header">
        <span class="annoucement-type-quantity">1 Admin Annoucement</span>
        <i class="annoucements-close"></i>
      </div>
    </div>
  </div>
</body>

但是如您所见,第二个 div 仍然显示,而第一个 div 从右侧滑入。我试过添加 animation-delaytransition-delay,在行 animation: 0.4s ease-out 0.4s 1 slideInFromRight; 中将延迟值更改为 0.4,或者完全添加一个新的 keframe:

@keyframes slideInFromRight {
    0% {
      transform: translateX(100%);
    }
    100% {
      transform: translateX(0);
    }
}

@keyframes slideInFromRight2 {
    0% {
        transform: translateX(100%);
    }
    100% {
        transform: translateX(0);
    }
}

.announcements-container {
    position: fixed;
    top: 80px;
    right: 20px;
    z-index: 1001;
    display: flex;
    flex-direction: column;
    width: 300px;
}

.announcements-1 {
    animation: 0.4s ease-out 0s 1 slideInFromRight;
  }
  
.announcements-2 {
    margin-top: 15px;
    /* opacity: 0; */
    /* display: none; */
    /* animation-fill-mode: both; */
    -webkit-animation: slideInFromRight2 0.4s ease-out 1s 1 normal;
    -moz-animation: slideInFromRight2 0.4ss ease-out 1s 1 normal;
    -o-animation: slideInFromRight2 0.4s ease-out 1s 1 normal;
    animation: slideInFromRight2 0.4s ease-out 1s 1 normal;
}

.annoucements-header {
    background-color: #1481C3;
    color: #ffffff;
    font-family: "Proxima Nova Bold";
    padding: 7px 10px;
}

.annoucements-close {
    position: absolute;
    right: 5px;
    width: 24px;
    height: 36px;
    cursor: pointer;
    opacity: .85;
}
.annoucements-close:hover {
    opacity: 1;
}
.annoucements-close::before,
.annoucements-close::after {
    content: '';
    width: 24px;
    height: 2px;
    background: white;
    position: absolute;
    top: 7px;
    left: 0;
}
.annoucements-close::before {
    transform: rotate(-45deg);
}
.annoucements-close::after {
    transform: rotate(45deg);
}
<body>
<div class="announcements-container">
    <div class="announcements-1">
      <div class="annoucements-header">
        <span class="annoucement-type-quantity">2 School Announcements</span>
        <i class="annoucements-close"></i>
      </div>
    </div>
    <div class="announcements-2">
      <div class="annoucements-header">
        <span class="annoucement-type-quantity">1 Admin Annoucement</span>
        <i class="annoucements-close"></i>
      </div>
    </div>
  </div>
</body>

但它仍然出现在第一个动画中。有没有办法让元素消失,直到 'turn' 消失?可以用 CSS 完全做到这一点,还是需要 JavaScript?

Link to JSFiddle

这个问题有一个纯粹的 CSS 方法,这个方法是最初对每个你想要动画的元素,给一个 opacity: 0 然后在 @keyframes 动画中,设置它的动画开始后,不透明度立即设置为 1。然后动画看起来像:

@keyframes slideInFromRight {
  0% {
    transform: translateX(100%);
  }
  .1%{
    opacity: 1;
  }
  100% {
    transform: translateX(0);
    opacity: 1;
  }
}

然后在 css 中为每个要设置动画的元素添加 opacity: 0 也不要忘记使用 animation-fill-mode: forwards