clip-path
<style>
.raz {
width: 7em; /* диаметр */
aspect-ratio: 1; /* ширина = высота */
border-radius: 50%; /* закругление углов */
background: darkturquoise; /* цвет */
animation: progress 10s cubic-bezier(.25, .4, .75, .6) infinite; /* скорость анимации */
}
@keyframes progress {
0% { clip-path: polygon(50% 50%, 50% -21%, 50% -21%, 50% -21%, 50% -21%, 50% -21%); }
25% { clip-path: polygon(50% 50%, 50% -21%, 121% 50%, 121% 50%, 121% 50%, 121% 50%); }
50% { clip-path: polygon(50% 50%, 50% -21%, 121% 50%, 50% 121%, 50% 121%, 50% 121%); }
75% { clip-path: polygon(50% 50%, 50% -21%, 121% 50%, 50% 121%, -21% 50%, -21% 50%); }
100% { clip-path: polygon(50% 50%, 50% -21%, 121% 50%, 50% 121%, -21% 50%, 50% -21%); }
}
</style>
<div class="raz"></div>
Плавное уменьшение рамки круглого элемента по щелчку
<style>
.raz {
display: inline-block;
width: 7em;
aspect-ratio: 1;
border-radius: 50%;
border: 1em solid darkturquoise;
}
.raz:focus {
animation: progress 10s cubic-bezier(.25, .4, .75, .6) forwards;
}
@keyframes progress {
0% { clip-path: polygon(50% 50%, 50% -21%, -21% 50%, 50% 121%, 121% 50%, 50% -21%); }
25% { clip-path: polygon(50% 50%, 50% -21%, -21% 50%, 50% 121%, 121% 50%, 121% 50%); }
50% { clip-path: polygon(50% 50%, 50% -21%, -21% 50%, 50% 121%, 50% 121%, 50% 121%); }
75% { clip-path: polygon(50% 50%, 50% -21%, -21% 50%, -21% 50%, -21% 50%, -21% 50%); }
100% { clip-path: polygon(50% 50%, 50% -21%, 50% -21%, 50% -21%, 50% -21%, 50% -21%); }
}
</style>
<a href="#on" tabindex="0" class="raz"></a>
Постепенное увеличение рамки круга при наведении курсора мышки
Кнопка
<style>
.raz {
--borderW: 6px;
position: relative;
display: inline-grid;
place-content: center;
width: 5em;
aspect-ratio: 1;
border-radius: 50%;
border: var(--borderW) dotted gainsboro;
}
.raz::before {
content: "";
position: absolute;
inset: calc(-1*var(--borderW));
border: var(--borderW) dotted darkturquoise;
border-radius: 50%;
animation: progress 3s cubic-bezier(.25, .4, .75, .6) paused forwards;
}
.raz:hover::before {
animation-play-state: running;
}
@keyframes progress {
0% { clip-path: polygon(50% 50%, 50% -21%, 50% -21%, 50% -21%, 50% -21%, 50% -21%); }
25% { clip-path: polygon(50% 50%, 50% -21%, 121% 50%, 121% 50%, 121% 50%, 121% 50%); }
50% { clip-path: polygon(50% 50%, 50% -21%, 121% 50%, 50% 121%, 50% 121%, 50% 121%); }
75% { clip-path: polygon(50% 50%, 50% -21%, 121% 50%, 50% 121%, -21% 50%, -21% 50%); }
100% { clip-path: polygon(50% 50%, 50% -21%, 121% 50%, 50% 121%, -21% 50%, 50% -21%); }
}
</style>
<div class="raz">Кнопка</div>
Заполнение обводки по кругу
Кнопка
<style>
.raz {
--borderW: 3px;
position: relative;
/* текст по центру */
display: inline-grid;
place-content: center;
aspect-ratio: 11 / 5; /* соотношение ширины / высоты */
height: 3em; /* высота кнопки */
border: var(--borderW) solid gainsboro;
border-radius: 15px;
user-select: none; /* запретить выделение текста */
box-sizing: border-box; /* рамка входит в ширину/высоту */
}
.raz::before {
content: "";
position: absolute;
inset: calc(-1*var(--borderW));
border: var(--borderW) solid darkturquoise;
border-radius: 15px;
animation: polygon 10s linear infinite;
}
@keyframes polygon {
0% { clip-path: polygon(50% 50%, 50% 0%, 0% 0%, 0% 100%, 100% 100%, 100% 0%, 50% 0%);}
17.1875% { clip-path: polygon(50% 50%, 50% 0%, 0% 0%, 0% 100%, 100% 100%, 100% 0%, 100% 0%); }
32.8125% { clip-path: polygon(50% 50%, 50% 0%, 0% 0%, 0% 100%, 100% 100%, 100% 100%, 100% 100%); }
67.1875% { clip-path: polygon(50% 50%, 50% 0%, 0% 0%, 0% 100%, 0% 100%, 0% 100%, 0% 100%); }
82.8125% { clip-path: polygon(50% 50%, 50% 0%, 0% 0%, 0% 0%, 0% 0%, 0% 0%, 0% 0%); }
100% { clip-path: polygon(50% 50%, 50% 0%, 50% 0%, 50% 0%, 50% 0%, 50% 0%, 50% 0%); }
}
</style>
<div class="raz">Кнопка</div>
conical-gradient() и @property
Круглый прогресс бар
<style>
.raz { /* пример из «Круговая диаграмма с одним значением» */
width: 7em;
aspect-ratio: 1;
border-radius: 50%;
background: conic-gradient(aqua, darkturquoise var(--pie-p, 0%), whitesmoke 0);
--pie-b: 1em;
mask: radial-gradient(farthest-side,#0000 calc(99% - var(--pie-b)),#000 calc(100% - var(--pie-b)));
}
<style>
<div class="raz" style="--pie-p:30%;"></div>
<input type="range" min="0" max="100" value="30" id="raz"/>
<script>
document.querySelector('#raz').addEventListener('input', progress);
function progress(e) {
e.currentTarget.previousElementSibling.style.setProperty('--pie-p', e.currentTarget.value + '%')
}
</script>
Изменение цвета индикатора в зависимости от значения, как у meter
<style>
.raz {
--pie-c: pink, deeppink;
width: 7em;
aspect-ratio: 1;
border-radius: 50%;
background: conic-gradient(var(--pie-c) var(--pie-p, 0%), whitesmoke 0);
--pie-b: 1em;
mask: radial-gradient(farthest-side,#0000 calc(99% - var(--pie-b)),#000 calc(100% - var(--pie-b)));
}
.raz:is([style*="4"]:not([style*="4%"]),
[style*="5"]:not([style*="5%"]),
[style*="6"]:not([style*="6%"]),
[style*="44"],
[style*="55"],
[style*="66"]) {
--pie-c: yellow, orange;
}
.raz:is([style*="7"]:not([style*="7%"]),
[style*="8"]:not([style*="8%"]),
[style*="9"]:not([style*="9%"]),
[style*="77"],
[style*="88"],
[style*="99"],
[style*="100"]) {
--pie-c: lime, green;
}
<style>
<div class="raz" style="--pie-p:30%;"></div>
<input type="range" min="0" max="100" value="30" id="raz"/>
<script>
document.querySelector('#raz').addEventListener('input', progress);
function progress(e) {
e.currentTarget.previousElementSibling.style.setProperty('--pie-p', e.currentTarget.value + '%')
}
</script>
@property не имеет поддержки Firefox и Safari, без которого не получится настроить анимацию conical-gradient().
<style>
.raz {
width: 7em;
aspect-ratio: 1;
border-radius: 50%;
background: conic-gradient(darkturquoise var(--angle, 0deg), whitesmoke 0);
animation: progress 10s linear infinite;
}
@property --angle { /* создать пользовательское свойство */
syntax: "<angle>";
inherits: false;
initial-value: 0deg;
}
@keyframes progress {
to {
--angle: 360deg;
}
}
</style>
<div class="raz"></div>
overflow
<style>
.raz {
position: relative;
display: inline-block;
width: 50px; /* 100px (height) : 2 */
height: 100px;
border: solid transparent;
border-width: 0 0 0 50px; /* 100px (height) : 2 */
border-radius: 50%;
overflow: hidden;
animation: background 10s linear infinite;
}
.raz:before {
content: "";
position: absolute;
left: -100%;
height: 100%;
border-right: 50px solid transparent;
border-left: 50px solid darkturquoise;
border-radius: 50%;
animation: rotate 10s linear infinite;
}
@keyframes background {
49.999% {border-width: 0 0 0 50px; border-color: transparent;}
50%, 100% {border-width: 0 50px 0 0; border-color: darkturquoise;}
}
@keyframes rotate {
49.999% {left: -100%;}
50% {left: 0;}
100% {transform: rotate(360deg); left: 0;}
}
</style>
<div class="raz"></div>