CSS动画创建闪烁的边界框"动画填充时

时间:2015-09-01 03:16:25

标签: jquery css css3 webkit css-animations

我试图为圆形div设置动画,以产生类似波纹的效果,填充它的容器。应该有一个初始波纹(边框),然后是主要形状扩展以填充容器。

我通过动画圆形div的边框宽度和填充来完成波纹,从而向外推动边框。

问题是,当填充是动画时,圆div的边界框闪烁白色。如果我删除动画的填充部分,只是为边框宽度设置动画,则没有闪烁,所以我知道它是导致问题的填充。

@keyframes circle {
0% {
    width:0.001px;
    border-width:0px;
    padding:0px;
}
50% {
    width:0.001px;
    border-width:100px;
    padding:400px;
}
100% {
    width:125%;
    border-width:100px;
    padding:400px;
}
}

Here's a fiddle来证明。单击灰色框将其激活。

编辑:在Firefox中测试后,它按预期工作。可能是特定于webkit的吗?

编辑2:我见过的常见解决方案,用于修复动画期间的通用"闪烁"错误是添加样式

-webkit-transform-style: preserve-3d;

-webkit-backface-visibility: hidden;

违规元素。我试过这些,但都没有修好它。

最初,我使用多个循环div和一系列具有过渡(表示各种动画状态)的类来完成此动画,然后使用setInterval延迟触发这些类。现在我对CSS动画更加熟悉了,我试图将它重新编码为更加CPU友好,因为旧方法在旧款笔记本电脑上ch。。我假设单个圆形div与多个圆形div相比,并且调用单个动画而不是不断添加和删除类会更有效吗?

1 个答案:

答案 0 :(得分:0)

错误导致

webkit bug与动画填充有关(如你所知)。在这个例子中,我已经用宽度和高度替换了paddings角色。

其他变更

  • 动画是在单击一个类时添加的,然后删除该类。这样一来就可以重复使用动画。

  • 我更改了关键帧,以便在动画结束时,白色慢慢变为透明。

关于前缀的说明

示例1

根据自己的喜好调整,边框与背景位于同一元素上,因此它们会同时移动。

$("#circleCont").click(function() {
  $(".circle").addClass('animated');
  setTimeout(function() {
    $(".circle").removeClass('animated');
  }, 4000);
});
.circle {
  position: absolute;
  top: 50%;
  left: 50%;
  margin: auto;
  border: 0 solid #FFF;
  display: block;
  border-radius: 50%;
  background-color: white;
  background-clip: content-box;
  transform: translate(-50%, -50%);
  z-index: 2;
}
#circleCont {
  display: inline-block;
  position: absolute;
  width: 100%;
  top: 50%;
  transform: translateY(-50%);
  z-index: 2;
  box-shadow: inset 0px 0px 0px 0px rgba(0, 0, 0, 0);
  transition: box-shadow 0.1s;
}
#circleCont:after {
  content: '';
  display: block;
  margin-top: 100%;
}
#hero {
  width: 600px;
  height: 400px;
  background-color: #ddd;
  position: absolute;
  overflow: hidden;
}
.animated {
  animation: circle 4s forwards
}
@keyframes circle {
  0% {
    width: 0;
    border-width: 0px;
    height: 0;
  }
  25% {
    border-width: 100px;
    width: 400px;
    height: 400px;
  }
  50% {
    height: 800px;
    width: 800px;
    border-width: 100px;
    padding: 400px;
    background: #FFF;
  }
  100% {
    height: 800px;
    width: 800px;
    border-width: 100px;
    padding: 400px;
    background: transparent;
  }
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<div id="hero">
  <div id="circleCont">
    <div class="circle"></div>
  </div>
</div>

示例2

在此示例中,边框设置在不同的元素上。 background元素被赋予animation-delay,因此它在边框动画后稍微开始。

$("#circleCont").click(function() {
  $('.circle').addClass('animated');
  $('.border').addClass('animated');
  setTimeout(function() {
    $('.circle').removeClass('animated');
    $('.border').removeClass('animated');
  }, 4500);
});
.circle {
  position: absolute;
  top: 50%;
  left: 50%;
  margin: auto;
  overflow: hidden;
  display: block;
  border-radius: 50%;
  background-color: white;
  transform: translate(-50%, -50%);
  z-index: 2;
}
.border {
  position: absolute;
  top: 50%;
  left: 50%;
  margin: auto;
  overflow: hidden;
  display: block;
  border-radius: 50%;
  background-color: transparent;
  transform: translate(-50%, -50%);
  z-index: 2;
  border: solid 100px transparent;
}
#circleCont {
  display: inline-block;
  position: absolute;
  width: 100%;
  top: 50%;
  transform: translateY(-50%);
  z-index: 2;
  box-shadow: inset 0px 0px 0px 0px rgba(0, 0, 0, 0);
  transition: box-shadow 0.1s;
}
#circleCont:after {
  content: '';
  display: block;
  margin-top: 100%;
}
#hero {
  width: 600px;
  height: 400px;
  background-color: #ddd;
  position: absolute;
  overflow: hidden;
}
.circle.animated {
  animation: circle 4s forwards;
  animation-delay: .5s;
}
.border.animated {
  animation: circle 4s forwards;
  animation-delay: 0;
}
@keyframes circle {
  0% {
    width: 0;
    height: 0;
    border-color: #FFF;
  }
  50% {
    height: 800px;
    width: 800px;
    background: #FFF;
    border-color: #FFF;
  }
  100% {
    height: 800px;
    width: 800px;
    border-color: #FFF;
    background: transparent;
  }
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<div id="hero">
  <div id="circleCont">
    <div class="circle"></div>
    <div class="border"></div>
  </div>
</div>