blog

CSS only horizontal scrolling slider

Using CSS-Tricks for inspiration.

See the Pen css slider 5 by Teo Dragovic (@teodragovic) on CodePen.

My markup is a single wrapper element with .c-slides class.

<div class="c-slides">
<div>one</div>
<div>two</div>
<div>three</div>
<div>four</div>
<div>five</div>
<div>six</div>
</div>

Basic CSS (note that I’m using Sass here) for making horizontal scrolling slider is:

.c-slides {
display: flex;
scroll-snap-type: x mandatory;
scroll-behavior: smooth;
-webkit-overflow-scrolling: touch;
overflow-x: scroll;

& > * {
scroll-snap-align: start;
flex: 0 0 auto;
width: 100%;
}
}

See the Pen css slider 1 by Teo Dragovic (@teodragovic) on CodePen.

Number of visible slides

To change the number of visible slides depending on the viewport add some breakpoints.

.c-slides {
display: flex;
scroll-snap-type: x mandatory;
scroll-behavior: smooth;
-webkit-overflow-scrolling: touch;
overflow-x: scroll;

& > * {
scroll-snap-align: start;
flex: 0 0 auto;
width: 100%;

// show two slides at 900px
@media (min-width: 900px) {
width: 50%;
}

// show three slides at 1200px
@media (min-width: 1200px) {
width: percentage(1/3);
}
}
}

See the Pen css slider 2 by Teo Dragovic (@teodragovic) on CodePen.

CSS scrolling shadows

To produce left and right shadows we can add some linear gradients on the background. This is the trick I picked up from Lea Verou. $background needs to match the surrounding background while $shadow and $size can be tweaked for the best effect.

.c-slides {
display: flex;
scroll-snap-type: x mandatory;
scroll-behavior: smooth;
-webkit-overflow-scrolling: touch;
overflow-x: scroll;

$size: 8;
$shadow: black;
$background: #efefef;

background:
linear-gradient(to right, $background $size * 1%, transparent),
linear-gradient(to right, transparent, $background ((100 - $size) * 1%)) 0 100%,
linear-gradient(to right, $shadow, transparent $size * 1%),
linear-gradient(to left, $shadow, transparent $size * 1%);
background-attachment: local, local, scroll, scroll;
}

See the Pen css slider 3 by Teo Dragovic (@teodragovic) on CodePen.

Scrollbar

Make scrollbar look a bit nicer across browsers using -webkit-scrollbar-* properties. Again, the background value of webkit-scrollbar-track needs to match the surrouding background.

.c-slides {

// ...other styles...

&::-webkit-scrollbar {
height: 10px;
}

&::-webkit-scrollbar-thumb {
background: #ddd;
border-radius: 10px;
}

&::-webkit-scrollbar-track {
background: #efefef;
}
}

See the Pen css slider 4 by Teo Dragovic (@teodragovic) on CodePen.

Final

Here is final code snippet:

.c-slides {
$size: 8;
$shadow: black;
$scrollbar-color: #ddd;
$background: white;

display: flex;
scroll-snap-type: x mandatory;
scroll-behavior: smooth;
-webkit-overflow-scrolling: touch;
overflow-x: scroll;

background:
linear-gradient(to right, $background $size * 1%, transparent),
linear-gradient(to right, transparent, $background ((100 - $size) * 1%)) 0 100%,
linear-gradient(to right, $shadow, transparent $size * 1%),
linear-gradient(to left, $shadow, transparent $size * 1%);
background-attachment: local, local, scroll, scroll;

&::-webkit-scrollbar {
height: 10px;
}

&::-webkit-scrollbar-thumb {
background: $scrollbar-color;
border-radius: 10px;
}

&::-webkit-scrollbar-track {
background: $background;
}

& > * {
scroll-snap-align: start;
flex: 0 0 auto;
width: 100%;

// show two slides at 900px
@media (min-width: 900px) {
width: 50%;
}

// show three slides at 1200px
@media (min-width: 1200px) {
width: percentage(1/3);
}
}
}