Grab-n-Drag Infinite Scrolling Carousel

A lightweight, dependency-free infinite scrolling carousel with grab-and-drag interaction

Example 1: Simple Text Items

Default settings.

Item 1
Item 2
Item 3
Item 4
Item 5
<div class="infinite-scroll-wrapper">
    <div class="infinite-scroll-container" id="carousel1">
        <div class="infinite-scroll-item">Item 1</div>
        <div class="infinite-scroll-item">Item 2</div>
        <div class="infinite-scroll-item">Item 3</div>
    </div>
</div>
#carousel1 .infinite-scroll-item {
    padding: 15px 30px;
    margin-right: 20px;
    border-radius: 8px;
    font-size: 1.2rem;
    font-weight: 500;
    color: #333;
    white-space: nowrap;
}
const carousel1 = new InfiniteScrollCarousel('#carousel1'); // Default settings

Example 2: Image Gallery

Individual hover effect; Transparent fade color.

Mountain Landscape
Ocean View
Desert Sunset
Mountain Lake
<div class="infinite-scroll-wrapper">
    <div class="infinite-scroll-container" id="carousel5">
        <div class="infinite-scroll-item image-item">
            <img src="path/to/image1.jpg" alt="Description">
        </div>
        <div class="infinite-scroll-item image-item">
            <img src="path/to/image2.jpg" alt="Description">
        </div>
        <!-- More items... -->
    </div>
</div>
.image-item {
    width: 300px;
    height: 200px;
    margin-right: 20px;
    border-radius: 12px;
    overflow: hidden;
    box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2);
    transition: transform 0.3s;
}

.image-item:hover {
    transform: scale(1.05);
}

.image-item img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    display: block;
}
const carousel5 = new InfiniteScrollCarousel('#carousel5', {
    speed: 40,
    pauseOnHover: true,
    fadeColor: 'transparent'
});

Example 3: Numbered Boxes

Large number of items; Slow momentum decay.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
<div class="infinite-scroll-wrapper">
    <div class="infinite-scroll-container" id="carousel3">
        <div class="infinite-scroll-item box">1</div>
        <div class="infinite-scroll-item box">2</div>
        <div class="infinite-scroll-item box">3</div>
        <!-- More items... -->
    </div>
</div>
.box {
    width: 80px;
    height: 80px;
    margin-right: 15px;
    border: 1px solid #ff6b6b;
    border-radius: 12px;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 2rem;
    font-weight: bold;
    color: #ff6b6b;
    box-shadow: 0 4px 10px rgba(255, 107, 107, 0.3);
}
const carousel3 = new InfiniteScrollCarousel('#carousel3', {
    speed: 30,
    reverseDirection: true,
    pauseOnHover: false,
    maxMomentumSpeed: 25,
    momentumDecay: 0.98
});

Example 4: Technology Skills

Dual carousel; Custom fade color/width.

Python
Java
C#
HTML
CSS
JavaScript
SQL
React Native
Android
Unity
TensorFlow
PyTorch
Kaggle
<div class="skills-list">
    <div class="icon-container-wrapper">
        <div class="infinite-scroll-wrapper">
            <div class="infinite-scroll-container" id="carousel4a">
                <div class="infinite-scroll-item icon-item"><i class="fa-brands fa-python"></i> Python</div>
                <div class="infinite-scroll-item icon-item"><i class="fa-brands fa-java"></i> Java</div>
                <div class="infinite-scroll-item icon-item"><i class="fa-solid fa-code"></i> C#</div>
                <!-- More items... -->
            </div>
        </div>
        <div class="infinite-scroll-wrapper">
            <div class="infinite-scroll-container" id="carousel4b">
                <div class="infinite-scroll-item icon-item"><i class="fa-brands fa-react"></i> React Native</div>
                <div class="infinite-scroll-item icon-item"><i class="fa-brands fa-android"></i> Android</div>
                <!-- More items... -->
            </div>
        </div>
    </div>
</div>
.skills-list {
    padding: 20px 0;
    background: #000;
}

.icon-container-wrapper {
    display: flex;
    flex-direction: column;
    gap: 20px;
}

.icon-item {
    padding: 12px 20px;
    margin-right: 15px;
    background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
    border-radius: 8px;
    color: white;
    font-weight: 500;
    white-space: nowrap;
    display: flex;
    align-items: center;
    gap: 8px;
    box-shadow: 0 2px 8px rgba(102, 126, 234, 0.3);
}

.icon-item i {
    font-size: 1.2rem;
}
const carousel4a = new InfiniteScrollCarousel('#carousel4a', {
    speed: 40,
    reverseDirection: true,
    fadeColor: '#000',
    fadeWidth: 150
});

const carousel4b = new InfiniteScrollCarousel('#carousel4b', {
    speed: 40,
    fadeColor: '#000',
    fadeWidth: 250
});