Как реализовать такое в Swiper.js?

слайдер Swiper.js Суть такая: работает слайдер, картинка меняется каждые 5 секунд В это время, на стрелочке видна анимация, по кругу, идет закрашивание border в другой цвет, когда цвет полностью меняется соответственно идет смена слайда, т.е это по сути отображение этих 5 сек в красивой и понятной анимации, думаю вы видели такое В доках Swiper готового решения не нашел, мб как то можно через svg и самописный скрипт сделать, но максимально постараться не нагружать DOM, есть идеи куда копать?

слайдер стрелка


Ответы (1 шт):

Автор решения: Meth0d

const chart = document.querySelector('.arrow__chart'),
    start = Date.now()

let timer = setInterval(() => {
    let timePassed = Date.now() - start;

    if (timePassed >= 5000) {
        clearInterval(timer)
        return;
    }

    circle(timePassed)
}, 50)

function circle(timePassed) {
    chart.style.setProperty('--p', `${timePassed / 50}`)
}
.arrow {
    --s: 100px;
    width: var(--s);
    height: var(--s);
    border-radius: 50%;
}
.arrow__inner {
    --s: 92px;
    width: var(--s);
    height: var(--s);
    border-radius: 50%;
    background-color: darkorange;
    z-index: 2;
}
.arrow__chart {
    --s: 100px;
    --b: 4px;
    --c: #2154CF;
    --p: 0;
    width: var(--s);
    height: var(--s);
    position: relative;
    -webkit-transition: all 5s;
    -o-transition: all 5s;
    transition: all 5s;
    display: -webkit-box;
    display: -ms-flexbox;
    display: flex;
    -webkit-box-pack: center;
        -ms-flex-pack: center;
            justify-content: center;
    -webkit-box-align: center;
        -ms-flex-align: center;
            align-items: center;
}
.arrow__chart:before {
    content: "";
    position: absolute;
    border-radius: 50%;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
    background: -o-radial-gradient(farthest-side, var(--c) 98%, rgba(0, 0, 0, 0)) top/var(--b) var(--b) no-repeat, conic-gradient(var(--c) calc(var(--p) * 1%), #f7f8fa 0);
    background: radial-gradient(farthest-side, var(--c) 98%, rgba(0, 0, 0, 0)) top/var(--b) var(--b) no-repeat, conic-gradient(var(--c) calc(var(--p) * 1%), #f7f8fa 0);
}
.arrow__chart:after {
    content: "";
    position: absolute;
    border-radius: 50%;
    top: calc(50% - var(--b) / 2);
    right: calc(50% - var(--b) / 2);
    bottom: calc(50% - var(--b) / 2);
    left: calc(50% - var(--b) / 2);
    background: var(--c);
    -webkit-transform: rotate(calc(var(--p) * 3.6deg)) translateY(calc(50% - var(--s) / 2));
        -ms-transform: rotate(calc(var(--p) * 3.6deg)) translateY(calc(50% - var(--s) / 2));
            transform: rotate(calc(var(--p) * 3.6deg)) translateY(calc(50% - var(--s) / 2));
}
<div class="arrow">
    <div class="arrow__chart">
        <div class="arrow__inner">
            <div class="arrow__icon"></div>
        </div>
    </div>
</div>

→ Ссылка