Слава Україні!

Карусель объектов на JavaScript

Бесконечная карусель объектов на JavaScript
9-го січня 2024, 18:27

HTML

Разметка блока карусели.

    
<div class="scroller" data-direction="left" data-speed="middle">
    <div class="scroller__inner">
        <img src="https://i.pravatar.cc/150?img=1" alt="..." />
        <img src="https://i.pravatar.cc/150?img=2" alt="..." />
        <img src="https://i.pravatar.cc/150?img=3" alt="..." />
        <img src="https://i.pravatar.cc/150?img=4" alt="..." />
        <img src="https://i.pravatar.cc/150?img=5" alt="..." />
        <img src="https://i.pravatar.cc/150?img=6" alt="..." />
    </div>
</div>
    

Для управления каруселью используются data-атрибуты.

data-direction задает напрвление прокрутки. Допустимые значения: "left", "right"

data-speed задает скорость прокрутки. Допустимые значения: "fast", "middle", "slow"

Стили CSS

    
.scroller {
    max-width: 600px;
    margin: 0 auto
}

.scroller .scroller__inner {
    padding-block: 1rem;
    display: flex;
    flex-wrap: wrap;
    gap: 2rem
}

.scroller[data-animated=true] {
    overflow: hidden;
    -webkit-mask: linear-gradient(90deg, transparent, white 20%, white 80%, transparent);
    mask: linear-gradient(90deg, transparent, b 20%, white 80%, transparent)
}

.scroller[data-animated=true] .scroller__inner {
    width: max-content;
    flex-wrap: nowrap;
    animation: scroll var(--_animation-duration, 40s) var(--_animation-direction, forwards) linear infinite
}

.scroller[data-animated=true] .scroller__inner img {
    height: 10rem;
    filter: grayscale(100%)
}

.scroller[data-animated=true] .scroller__inner img:hover {
    filter: none;
    cursor: pointer
}

.scroller[data-animated=true]:hover .scroller__inner {
    animation-play-state: paused
}

.scroller[data-direction=left] {
    --_animation-direction: forwards
}

.scroller[data-direction=right] {
    --_animation-direction: reverse
}

.scroller[data-speed=fast] {
    --_animation-duration: 20s
}

.scroller[data-speed=slow] {
    --_animation-duration: 120s
}

.scroller[data-speed=middle] {
    --_animation-duration: 40s
}

@keyframes scroll {
    to {
        transform: translate(calc(-50% - .5rem))
    }
}
    

Код JavaScript

    
const scrollers = document.querySelectorAll(".scroller");
if (!window.matchMedia("(prefers-reduced-motion: reduce)").matches) {
    addAnimation();  
}

function addAnimation() {
    scrollers.forEach((scroller) => {
        scroller.setAttribute("data-animated", true);

        const scrollerInner = scroller.querySelector(".scroller__inner");
        const scrollerContent = Array.from(scrollerInner.children);

        scrollerContent.forEach((item) => {
            const duplicatedItem = item.cloneNode(true);
            duplicatedItem.setAttribute("aria-hidden", true);
            scrollerInner.appendChild(duplicatedItem);
        });
    });
}
    

Результат

Важлива інформація

Міністерство оборони
України
з 24.02 по 16.03
втрати противника
орієнтовно склали:
1279930 ( +760 ) особового складу
11781 ( +0 ) танків
24215 ( +2 ) бойових бронемашин
38457 ( +19 ) артилерійських систем
1687 ( +1 ) РСЗВ
1333 ( +1 ) засоби ППО
435 ( +0 ) літаків
349 ( +0 ) гелікоптерів
83624 ( +111 ) автомобільної техніки
33 ( +1 ) кораблі / катери
4468 ( +0 ) крилаті ракети
181153 ( +1883 ) БПЛА
4091 ( +2 ) спец. техніки
4 ( +0 ) установок ОТРК/ТРК
2 ( +0 ) підводні човни