我下面有一个click me
呼吸按钮,这里我使用@keyframes
来为按钮呼吸设置动画-到目前为止一切都很好!
但是正如您所知,click me
文字在呼吸动画期间发抖。
有办法避免这种情况发生吗?
.centered {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%)
}
button.circle {
--startSize: 65vh;
--endSize: 85vh;
width: var(--startSize);
height: var(--startSize);
background: teal;
border-radius: 100%;
animation-name: breathe;
animation-play-state: running;
animation-duration: 4.5s;
animation-iteration-count: infinite;
animation-direction: alternate;
border: none;
}
@keyframes breathe {
0% {
width: var(--startSize);
height: var(--startSize);
}
25% {
width: var(--startSize);
height: var(--startSize);
}
75% {
width: var(--endSize);
height: var(--endSize);
}
100% {
width: var(--endSize);
height: var(--endSize);
}
}
<a href="https://www.w3schools.com"><button class="circle centered">Click me</button></a>
答案 0 :(得分:5)
也许对此进行动画处理的更好方法是在transform: scale(...)
伪元素上使用::after
。使用这种方法,我们可以获得以下好处:
transform
and opacity
over properties like width
or height
。后者将影响其周围的元素(文档流)。转换纯粹是视觉上的-就放置而言,它们对其他元素没有影响,这意味着improved performance。
.centered {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%)
}
button.circle {
width: 65vh;
height: 65vh;
border: 0;
background-color: transparent;
}
button.circle::after {
z-index: -1;
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
content: '';
display: block;
background: teal;
border-radius: 100%;
animation: breathe 4.5s ease infinite alternate running;
}
@keyframes breathe {
from { transform: scale(1); }
to { transform: scale(1.4); }
}
<a href="https://www.w3schools.com"><button class="circle centered">Click me</button></a>
注意:Browser support for this method
1。我知道按钮居中并位于absolute
的位置,这意味着它不会影响文档的开始。也就是说,这种用于转换的动画方法对于任何一种情况都更加灵活。
答案 1 :(得分:0)
问题与您用于使按钮居中的transform属性有关。我已经使用grid属性将JSFiddle放在一起,以使按钮在水平和垂直方向上居中,从而停止了文本晃动。
body,
html {
height: 100%;
display: grid;
}
.circle-outer {
margin: auto;
text-align: center;
}
button.circle {
--startSize: 65vh;
--endSize: 85vh;
width: var(--startSize);
height: var(--startSize);
background: teal;
border-radius: 100%;
animation-name: breathe;
animation-play-state: running;
animation-duration: 4.5s;
animation-iteration-count: infinite;
animation-direction: alternate;
border: none;
}
@keyframes breathe {
0% {
width: var(--startSize);
height: var(--startSize);
}
25% {
width: var(--startSize);
height: var(--startSize);
}
75% {
width: var(--endSize);
height: var(--endSize);
}
100% {
width: var(--endSize);
height: var(--endSize);
}
}
<div class="circle-outer">
<a href="https://www.w3schools.com"><button class="circle">Click me</button></a>
</div>
还有一个可行的示例: