CSS:悬停时,关键帧动画消失

时间:2018-08-02 11:47:06

标签: css css3 css-animations keyframe

悬停时,我的div的边框上有动画。

body {
  padding: 50px;
  background-color: #000;
  text-align: center;
}

div {
  width: 50px;
  height: 50px;
  border: 1px solid rgba(255,255,255,0.1);
  display: inline-block;
  margin: 0 10px;
}

div:hover {
   animation: blink 750ms forwards;
}


@keyframes blink {
  0% {
    border-left-color: rgba(255,255,255,0.1);
    border-right-color: rgba(255,255,255,0.1);
  }

  33% {
    border-left-color: rgba(255,255,255,1);
    border-right-color: rgba(255,255,255,1);
  }

  66% {
    border-left-color: rgba(255,255,255,0.1);
    border-right-color: rgba(255,255,255,0.1);
  }

  100% {
    border-left-color: rgba(255,255,255,1);
    border-right-color: rgba(255,255,255,1);
  }
}
<div></div>
<div></div>
<div></div>

动画按预期工作正常,但是当我将鼠标悬停在div上时,动画突然刹车。我想使动画保持完整,即使光标不在。

我尝试在div上添加transition: border-color 300ms;,但其行为仍然相同。

1 个答案:

答案 0 :(得分:0)

您可以尝试以下方法:

body {
  padding: 50px;
  background-color: #000;
  text-align: center;
}

div {
  width: 50px;
  height: 50px;
  border: 1px solid rgba(255,255,255,0.1);
  display: inline-block;
  margin: 0 10px;
  transition:1000s; /*block the change*/
}

div:hover {
   animation: blink 750ms; /*remove forwards*/
   /*Add the last state of the animation*/
   border-left: 1px solid rgba(255,255,255,1);
   border-right: 1px solid rgba(255,255,255,1);
   /*---*/
   transition:.5s; /*make the change fast on hover*/
}


@keyframes blink {
  0% {
    border-left-color: rgba(255,255,255,0.1);
    border-right-color: rgba(255,255,255,0.1);
  }

  33% {
    border-left-color: rgba(255,255,255,1);
    border-right-color: rgba(255,255,255,1);
  }

  66% {
    border-left-color: rgba(255,255,255,0.1);
    border-right-color: rgba(255,255,255,0.1);
  }

  100% {
    border-left-color: rgba(255,255,255,1);
    border-right-color: rgba(255,255,255,1);
  }
}
<div></div>
<div></div>
<div></div>

更新

要确保动画结束,您需要保持悬停状态。一个想法是考虑一个将覆盖所有屏幕的伪元素,以确保您将鼠标悬停到最后:

body {
  padding: 50px;
  background-color: #000;
  text-align: center;
}

div.box {
  width: 50px;
  height: 50px;
  border: 1px solid rgba(255,255,255,0.1);
  display: inline-block;
  margin: 0 10px;
  transition:1000s; /*block the change*/
  position:relative;
}

div.box:hover {
   animation: blink 750ms; /*remove forwards*/
   /*Add the last state of the animation*/
   border-left: 1px solid rgba(255,255,255,1);
   border-right: 1px solid rgba(255,255,255,1);
   /*---*/
   transition:.5s; /*make the change fast on hover*/
}
div.box:hover:before {
  content:"";
  position:fixed;
  top:0;
  left:0;
  right:0;
  bottom:0;
  z-index:1;
  animation:disappear 0.1s 0.75s forwards;
}

@keyframes disappear {
  to {bottom:100%;}
}

@keyframes blink {
  0% {
    border-left-color: rgba(255,255,255,0.1);
    border-right-color: rgba(255,255,255,0.1);
  }

  33% {
    border-left-color: rgba(255,255,255,1);
    border-right-color: rgba(255,255,255,1);
  }

  66% {
    border-left-color: rgba(255,255,255,0.1);
    border-right-color: rgba(255,255,255,0.1);
  }

  100% {
    border-left-color: rgba(255,255,255,1);
    border-right-color: rgba(255,255,255,1);
  }
}
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>