Falling Slider
Slider using random numbers for sliding into and out of place instead of side-to-side.
by Travis Almand
HTML
<div id="container">
<div id="next"></div>
<div id="prev"></div>
<div id="slides_container">
<img class="slide-base" src="http://lorempixel.com/400/200/abstract/1" />
<img class="slide" src="http://lorempixel.com/400/200/animals/2" />
<img class="slide" src="http://lorempixel.com/400/200/business/3" />
<img class="slide" src="http://lorempixel.com/400/200/cats/4" />
<img class="slide" src="http://lorempixel.com/400/200/food/5" />
<img class="slide" src="http://lorempixel.com/400/200/animals/6" />
<img class="slide" src="http://lorempixel.com/400/200/business/7" />
<img class="slide" src="http://lorempixel.com/400/200/cats/8" />
<img class="slide" src="http://lorempixel.com/400/200/food/9" />
<img class="slide" src="http://lorempixel.com/400/200/animals/10" />
</div>
</div>
CSS
:root {
--angle: 45deg;
}
#container {
border: 1px solid black;
height: 200px;
margin: auto;
position: relative;
text-align: center;
width: 400px;
}
#container:hover #next,
#container:hover #prev {
opacity: 1;
}
#next,
#prev {
background-color: rgba(255, 255, 255, 0.25);
cursor: pointer;
height: 100%;
left: 0;
opacity: 0;
position: absolute;
top: 0;
transition: opacity 0.5s;
width: 30px;
z-index: 2;
}
#next {
left: auto;
right: 0;
}
#next:before,
#prev:before {
color: white;
content: '\276D';
font-size: 40px;
left: 50%;
position: absolute;
top: 50%;
transform: translate3d(-50%, -50%, 0);
}
#prev:before {
content: '\276C';
}
#slides_container {
overflow: hidden;
position: relative;
}
#slides_container .slide {
left: 0;
position: absolute;
top: 0;
}
#slides_container .next {
animation: 1.5s fall_out forwards;
}
#slides_container .prev {
animation: 1s fall_in forwards;
}
@keyframes fall_out {
from {
opacity: 1;
transform: translate3d(0, 0, 0) rotate(0);
}
to {
opacity: 0;
transform: translate3d(0, 200%, 0) rotate(var(--angle));
}
}
@keyframes fall_in {
from {
opacity: 0;
transform: translate3d(0, -150%, 0) rotate(var(--angle));
}
to {
opacity: 1;
transform: translate3d(0, 0, 0) rotate(0);
}
}
JavaScript
var $next = document.querySelector('#next');
var $prev = document.querySelector('#prev');
var $slidesContainer = document.querySelector('#slides_container');
var $slides = Array.from(document.querySelectorAll('#slides_container .slide'));
var currentSlide = $slides.length - 1;
$next.addEventListener('click', function () {
if (($slides.length - 1) - document.querySelectorAll('.next').length >= 0) {
$slides[currentSlide].classList.remove('prev');
$slides[currentSlide].classList.add('next');
randVars();
currentSlide--;
}
});
$prev.addEventListener('click', function () {
if (document.querySelectorAll('.prev').length !== $slides.length && document.querySelectorAll('.next').length !== 0) {
$slides[currentSlide + 1].classList.remove('next');
$slides[currentSlide + 1].classList.add('prev');
randVars();
currentSlide++;
}
});
function randVars () {
var minAngle = -90;
var maxAngle = 90;
document.documentElement.style.setProperty('--angle', Math.floor(Math.random() * (maxAngle - minAngle + 1)) + minAngle + 'deg');
}