我试图为圆形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相比,并且调用单个动画而不是不断添加和删除类会更有效吗?
答案 0 :(得分:0)
webkit bug与动画填充有关(如你所知)。在这个例子中,我已经用宽度和高度替换了paddings角色。
动画是在单击一个类时添加的,然后删除该类。这样一来就可以重复使用动画。
我更改了关键帧,以便在动画结束时,白色慢慢变为透明。
animation
属性is very well supported,您可能需要的唯一前缀是-webkit-
transition
属性is more or less 100% supported
transform
属性为very well supported,您可能需要的唯一前缀是-webkit-
根据自己的喜好调整,边框与背景位于同一元素上,因此它们会同时移动。
$("#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>
在此示例中,边框设置在不同的元素上。 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>