Как анимировать остановку градиента CSS с плавным переходом в прозрачный?
У меня есть код ниже. Как сделать плавный переход градиентной остановки? Просто он резко меняется от одного к другому.
Большинство примеров градиентной анимации, которые у меня есть, похоже, используют положение градиента, но я считаю, что изменение остановки градиента также должно быть возможным.
.test {
display: inline-block;
width: 300px;
height: 300px;
border-radius: 100%;
background: conic-gradient(red, red);
background-repeat: no-repeat;
background-size: cover;
background-position: center center;
background-size: auto;
-webkit-mask:radial-gradient(circle, transparent 50%, white calc(50% + 1px));
animation:
rotate
4.5s
ease-out
0s
infinite
none
running;
}
@keyframes rotate {
0% {
background-image: conic-gradient(red, red);
}
30% {
background-image: conic-gradient(red 70%, transparent);
}
70% {
background-image: conic-gradient(red 30%, transparent, transparent, transparent);
}
100% {
background-image: conic-gradient(red, transparent);
}
}
<div class="test"></div>
2 ответа
Решение
По состоянию на 3 декабря 2020 года это работает только в Chrome или Edge 95+.
Можно анимировать градиент с помощью CSS
@property
.
@property --opacity {
syntax: '<percentage>';
initial-value: 100%;
inherits: false;
}
.test {
display: inline-block;
position: absolute;
border-radius: 100%;
background-image: conic-gradient(
red var(--opacity),
red 10%,
rgba(255, 0, 0, var(--opacity)),
transparent,
transparent
);
will-change: transform, background-image;
width: 200px;
height: 200px;
mask:radial-gradient(circle, transparent 47%, white calc(47% + 1px));
-webkit-mask:radial-gradient(circle, transparent 47%, white calc(47% + 1px));
animation:
conic-gradient
4.5s
ease-out
0s
infinite
none
running;
}
@keyframes conic-gradient {
50% {
--opacity: 0%;
}
85% {
--opacity: 100%;
}
}
<div class="test"></div>
В этом конкретном случае вы можете анимировать слой фонового цвета, как показано ниже:
.test {
display: inline-block;
width: 300px;
height: 300px;
border-radius: 100%;
background:
conic-gradient(red, transparent)
red;
-webkit-mask:radial-gradient(circle, transparent 50%, white calc(50% + 1px));
animation:
rotate
4.5s
ease-out
0s
infinite
none
running;
}
@keyframes rotate {
100% {
background-color:blue;
}
}
<div class="test"></div>
ОБНОВИТЬ
Вот еще одна идея, сочетающая непрозрачность и градиентную анимацию (немного глючная, но мы попытаемся ее оптимизировать)
.test {
display: inline-block;
width: 300px;
height: 300px;
border-radius: 100%;
background: conic-gradient(red 70%, transparent);
animation: grad1 3s linear infinite;
-webkit-mask: radial-gradient(circle, transparent 50%, white calc(50% + 1px));
position: relative;
}
.test::before {
content: "";
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
opacity: 1;
background: conic-gradient(red, red);
animation:
op 1s linear infinite,
grad 3s linear infinite;
}
@keyframes op {
100% {
opacity: 0;
}
}
@keyframes grad {
0%,
33.32% {
background: conic-gradient(red, red);
}
33.328%,
66.65% {
background: conic-gradient(red 70%, transparent);
}
66.658%,
100% {
background: conic-gradient(red 30%, transparent);
}
}
@keyframes grad1 {
0%,
33.32% {
background: conic-gradient(red 70%, transparent);
}
33.328%,
66.65% {
background: conic-gradient(red 30%, transparent);
}
66.658%,
100% {
background: conic-gradient(red, transparent);
}
}
<div class="test"></div>