Skip to content

Instantly share code, notes, and snippets.

@stanwmusic
Created January 22, 2026 03:42
Show Gist options
  • Select an option

  • Save stanwmusic/5dcd5b18bc05305064c4d5da4a3a4eb5 to your computer and use it in GitHub Desktop.

Select an option

Save stanwmusic/5dcd5b18bc05305064c4d5da4a3a4eb5 to your computer and use it in GitHub Desktop.
Flexible Carousel
<div class="carousel-wrapper" id="products">
<ul class="carousel-inner clearfix">
<li class="item">
<p class="item-info">Lorem ipsum dolor sit amet, sit boy! Good dog! 🐶. Pellentesque dictum nulla vehicula hendrerit eleifend. Proin in metus sed enim sagittis tristique.</p>
</li>
<li class="item">
<p class="item-info">Lorem ipsum dolor sit amet, sit boy! Good Dog! ! 🐶 See Spot run! adipiscing elit. Pellentesque dictum nulla vehicula hendrerit eleifend. Proin in metus sed enim sagittis tristique.</p>
</li>
<li class="item">
<p class="item-info">Lorem ipsum Moose names mipsun! amet, consectetur adipiscing elit. Pellentesque dictum nulla vehicula hendrerit eleifend. Proin in metus sed enim sagittis tristique.</p>
</li>
<li class="item">
<p class="item-info">Lorem ipsum Car named kitsum, consectetur adipiscing elit. Pellentesque dictum nulla vehicula hendrerit eleifend. Proin in metus sed enim sagittis tristique.</p>
</li>
<li class="item">
<p class="item-info">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque dictum nulla vehicula hendrerit eleifend. Proin in metus sed enim sagittis tristique.</p>
</li>
<li class="item">
<p class="item-info">Lorem ipsum dollar sit amet, sit boy! consectetur adipiscing elit. Pellentesque dictum nulla vehicula hendrerit eleifend. Proin in metus sed enim sagittis tristique.</p>
</li>
<li class="item">
<p class="item-info">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque dictum nulla vehicula hendrerit eleifend. Proin in metus sed enim sagittis Mcmoose</p>
</li>
<li class="item">
<p class="item-info">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque dictum nulla vehicula hendrerit eleifend. Proin in metus sed enim sagittis tristique.</p>
</li>
<li class="item">
<p class="item-info">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque dictum nulla vehicula hendrerit eleifend. Proin in metus sed enim sagittis tristique.</p>
</li>
<li class="item">
<p class="item-info">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque dictum nulla vehicula hendrerit eleifend. Proin in metus sed enim sagittis tristique.</p>
</li>
<li class="item">
<p class="item-info">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque dictum nulla vehicula hendrerit eleifend. Proin in metus sed enim sagittis tristique.</p>
</li>
<li class="item">
<p class="item-info">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque dictum nulla vehicula hendrerit eleifend. Proin in metus sed enim sagittis tristique.</p>
</li>
</ul>
<a href="#" class="carousel-left"></a>
<a href="#" class="carousel-right"></a>
</div>
<div class="carousel-wrapper" id="products2">
<ul class="carousel-inner clearfix">
<li class="item">
<p class="item-info">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque dictum nulla vehicula hendrerit eleifend. Proin in metus sed enim sagittis tristique.</p>
</li>
<li class="item">
<p class="item-info">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque dictum nulla vehicula hendrerit eleifend. Proin in metus sed enim sagittis tristique.</p>
</li>
<li class="item">
<p class="item-info">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque dictum nulla vehicula hendrerit eleifend. Proin in metus sed enim sagittis tristique.</p>
</li>
<li class="item">
<p class="item-info">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque dictum nulla vehicula hendrerit eleifend. Proin in metus sed enim sagittis tristique.</p>
</li>
<li class="item">
<p class="item-info">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque dictum nulla vehicula hendrerit eleifend. Proin in metus sed enim sagittis tristique.</p>
</li>
<li class="item">
<p class="item-info">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque dictum nulla vehicula hendrerit eleifend. Proin in metus sed enim sagittis tristique.</p>
</li>
<li class="item">
<p class="item-info">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque dictum nulla vehicula hendrerit eleifend. Proin in metus sed enim sagittis tristique.</p>
</li>
<li class="item">
<p class="item-info">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque dictum nulla vehicula hendrerit eleifend. Proin in metus sed enim sagittis tristique.</p>
</li>
<li class="item">
<p class="item-info">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque dictum nulla vehicula hendrerit eleifend. Proin in metus sed enim sagittis tristique.</p>
</li>
<li class="item">
<p class="item-info">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque dictum nulla vehicula hendrerit eleifend. Proin in metus sed enim sagittis tristique.</p>
</li>
<li class="item">
<p class="item-info">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque dictum nulla vehicula hendrerit eleifend. Proin in metus sed enim sagittis tristique.</p>
</li>
<li class="item">
<p class="item-info">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque dictum nulla vehicula hendrerit eleifend. Proin in metus sed enim sagittis tristique.</p>
</li>
</ul>
<a href="#" class="carousel-left"></a>
<a href="#" class="carousel-right"></a>
</div>
<div class="carousel-wrapper" id="products3">
<ul class="carousel-inner clearfix">
<li class="item">
<p class="item-info">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque dictum nulla vehicula hendrerit eleifend. Proin in metus sed enim sagittis tristique.</p>
</li>
<li class="item">
<p class="item-info">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque dictum nulla vehicula hendrerit eleifend. Proin in metus sed enim sagittis tristique.</p>
</li>
<li class="item">
<p class="item-info">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque dictum nulla vehicula hendrerit eleifend. Proin in metus sed enim sagittis tristique.</p>
</li>
<li class="item">
<p class="item-info">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque dictum nulla vehicula hendrerit eleifend. Proin in metus sed enim sagittis tristique.</p>
</li>
<li class="item">
<p class="item-info">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque dictum nulla vehicula hendrerit eleifend. Proin in metus sed enim sagittis tristique.</p>
</li>
<li class="item">
<p class="item-info">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque dictum nulla vehicula hendrerit eleifend. Proin in metus sed enim sagittis tristique.</p>
</li>
<li class="item">
<p class="item-info">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque dictum nulla vehicula hendrerit eleifend. Proin in metus sed enim sagittis tristique.</p>
</li>
<li class="item">
<p class="item-info">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque dictum nulla vehicula hendrerit eleifend. Proin in metus sed enim sagittis tristique.</p>
</li>
<li class="item">
<p class="item-info">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque dictum nulla vehicula hendrerit eleifend. Proin in metus sed enim sagittis tristique.</p>
</li>
<li class="item">
<p class="item-info">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque dictum nulla vehicula hendrerit eleifend. Proin in metus sed enim sagittis tristique.</p>
</li>
<li class="item">
<p class="item-info">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque dictum nulla vehicula hendrerit eleifend. Proin in metus sed enim sagittis tristique.</p>
</li>
<li class="item">
<p class="item-info">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque dictum nulla vehicula hendrerit eleifend. Proin in metus sed enim sagittis tristique.</p>
</li>
</ul>
<a href="#" class="carousel-left"></a>
<a href="#" class="carousel-right"></a>
</div>
/*****
* Carousel control
*/
var Carousel = function (elId, mode) {
var wrapper = document.getElementById(elId);
var innerEl = wrapper.getElementsByClassName('carousel-inner')[0];
var leftButton = wrapper.getElementsByClassName('carousel-left')[0];
var rightButton = wrapper.getElementsByClassName('carousel-right')[0];
var items = wrapper.getElementsByClassName('item');
this.carouselSize = items.length;
this.itemWidth = null;
this.itemOuterWidth = null;
this.currentStep = 0;
this.itemsAtOnce = 3;
this.minItemWidth = 200;
this.position = innerEl.style;
this.mode = mode;
this.init = function (mode) {
this.itemsAtOnce = mode;
this.calcWidth(wrapper, innerEl, items);
cb_addEventListener(leftButton, 'click', this.goLeft.bind(this));
cb_addEventListener(rightButton, 'click', this.goRight.bind(this));
cb_addEventListener(window, 'resize', this.calcWidth.bind(this, wrapper, innerEl, items));
};
return this.init(mode);
};
Carousel.prototype = {
goLeft: function(e) {
e.preventDefault();
if (this.currentStep) {
--this.currentStep;
} else {
this.currentStep = this.carouselSize - this.itemsAtOnce;
}
this.makeStep(this.currentStep);
return false;
},
goRight: function(e) {
e.preventDefault();
if (this.currentStep < (this.carouselSize - this.itemsAtOnce)) {
++this.currentStep;
} else {
this.currentStep = 0;
}
this.makeStep(this.currentStep);
return false;
},
makeStep: function(step) {
this.position.left = -(this.itemOuterWidth * step) + 'px';
},
calcWidth: function(wrapper, innerEl, items) {
this.beResponsive();
var itemStyle = window.getComputedStyle(items[0]);
var innerElStyle = innerEl.style;
var carouselLength = this.carouselSize;
var wrapWidth = wrapper.offsetWidth - parseInt(itemStyle.marginRight, 10) * (this.itemsAtOnce + 1);
innerElStyle.display = 'none';
this.itemWidth = wrapWidth / this.itemsAtOnce;
this.itemOuterWidth = this.itemWidth + parseInt(itemStyle.marginRight, 10);
for (i = 0; i < carouselLength; i++) {
items[i].style.width = this.itemWidth + 'px';
}
innerElStyle.width = this.itemOuterWidth * this.carouselSize + 'px';
innerElStyle.display = 'block';
},
beResponsive: function() {
var winWidth = window.innerWidth;
if (winWidth >= 650 && winWidth < 950 && this.itemsAtOnce >= 2) {
this.itemsAtOnce = 2;
}
else if (winWidth < 650) {
this.itemsAtOnce = 1;
}
else {
this.itemsAtOnce = this.mode;
}
}
}
/**
* Cross-browser Event Listener
**/
function cb_addEventListener(obj, evt, fnc) {
if (obj && obj.addEventListener) {
obj.addEventListener(evt, fnc, false);
return true;
} else if (obj && obj.attachEvent) {
return obj.attachEvent('on' + evt, fnc);
}
return false;
}
//Initializing carousel
if (document.getElementById('products')) {
var productsCarousel = new Carousel('products', 3);
}
if (document.getElementById('products2')) {
var productsCarousel = new Carousel('products2', 2);
}
if (document.getElementById('products3')) {
var productsCarousel = new Carousel('products3', 1);
}
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
body {
counter-reset: item;
}
.carousel-wrapper {
width: 100%;
height: 250px;
overflow: hidden;
position: relative;
}
.carousel-inner {
height: 100%;
position: relative;
padding: 0 0 0 50px;
left: 0;
margin: 0;
transition: all 1s;
}
.carousel-inner .item {
height: 100%;
float: left;
list-style: none;
padding: 0;
margin: 0 50px 0 0;
}
.carousel-inner .item:before {
counter-increment: item;
content: counter(item);
}
.carousel-left, .carousel-right {
width: 30px;
height: 100%;
position: absolute;
top: 0;
}
.carousel-left:before, .carousel-right:before {
content: "";
background: #666;
width: 30px;
height: 100%;
position: absolute;
top: 0;
opacity: 0.5;
}
.carousel-left:hover:before, .carousel-right:hover:before {
opacity: 0.8;
}
.carousel-left {
left: 0;
}
.carousel-right {
right: 0;
}
/*Demo styles*/
.carousel-wrapper {
background: #055252;
padding: 30px 0;
}
.carousel-inner .item {
background: #eee;
padding: 1em 2em;
font-size: 1.2em;
box-sizing: border-box;
box-shadow: 1px 1px 3px 0 #333;
}
.carousel-inner .item:hover {
background: #fff;
box-shadow: 1px 1px 3px 2px #333;
}
.carousel-left:before, .carousel-right:before {
background: url(https://i.imgur.com/Ej5hS07.png) no-repeat;
width: 50px;
}
.carousel-left:before {
left: 0;
background-position: -20% center;
}
.carousel-right:before {
right: 0;
background-position: -40px center;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment