Skip to content

Instantly share code, notes, and snippets.

@alegut
Last active October 17, 2018 12:39
Show Gist options
  • Save alegut/f165c2b4e862f8bcc5d0d8990ecd1648 to your computer and use it in GitHub Desktop.
Save alegut/f165c2b4e862f8bcc5d0d8990ecd1648 to your computer and use it in GitHub Desktop.
Pure JS slider
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Pure JS sider</title>
<link rel="stylesheet" href="pjs.css">
<script src="pjs.js"></script>
</head>
<body>
<div class="ac-slider--wrapper">
<div class="ac-slider--container">
<div class="ac-slider--view">
<ul>
<li class="ac-slider--view__slides is-active">
<p class="testimonial-quote">Quote 1</p>
<p class="testimonial-author">~ Author 1 ~</p>
</li>
<li class="ac-slider--view__slides">
<p class="testimonial-quote">Quote 2</p>
<p class="testimonial-author">~ Author 2 ~</p>
</li>
<li class="ac-slider--view__slides">
<p class="testimonial-quote">Quote 3</p>
<p class="testimonial-author">~ Author 3 ~</p>
</li>
<li class="ac-slider--view__slides">
<p class="testimonial-quote">Quote 4</p>
<p class="testimonial-author">~ Author 4 ~</p>
</li>
<li class="ac-slider--view__slides">
<p class="testimonial-quote">Quote 5</p>
<p class="testimonial-author">~ Author 5 ~</p>
</li>
</ul>
</div>
<div class="ac-slider--arrows">
<span class="arrow ac-slider--arrows__left">&#x3c;</span>
<span class="arrow ac-slider--arrows__right">&#x3e;</span>
</div>
</div>
</div>
</body>
</html>
.ac-slider--wrapper {
margin: 0 auto;
max-width: calc(90% - 150px);
font-size: 20px;
}
.ac-slider--container {
position: relative;
width: 40%;
margin: auto;
}
.ac-slider--view {
display: block;
width: 100%;
margin: 0 auto;
overflow: hidden;
}
ul {
white-space: nowrap;
text-align: center;
list-style: none;
margin: 0;
padding: 0;
transition: transform 0.25s ease-out;
}
.ac-slider--view__slides {
white-space: normal;
display: inline-block;
width: 100%;
position: relative;
}
.ac-slider--arrows {
width: 100%;
margin: 0 auto;
}
span {
position: absolute;
top: 50%;
transform: translateX(0) translateY(-50%);
width: 20px;
height: 20px;
display: block;
cursor: pointer;
border-radius: 50%;
background: #f5f5f5;
line-height: 1.3em;
text-align: center;
opacity: 0.5;
}
span.ac-slider--arrows__left {
left: 0;
transform: translateX(-100%) translateY(-50%);
}
span.ac-slider--arrows__right {
right: 0;
transform: translateX(100%) translateY(-50%);
}
span:hover {
opacity: 1;
}
.testimonial-quote {
font-style: italic;
font-weight: 200;
font-size: 0.9em;
letter-spacing: 0.05em;
position: relative;
margin-bottom: 0.5em;
padding: 0 10px;
}
.testimonial-author {
font-size: 0.6em;
font-weight: 800;
margin-bottom: 0.5em;
}
window.addEventListener("load", function () {
// global variables
const sliderView = document.querySelector('.ac-slider--view > ul'),
sliderViewSlides = document.querySelectorAll('.ac-slider--view__slides'),
arrowLeft = document.querySelector('.ac-slider--arrows__left'),
arrowRight = document.querySelector('.ac-slider--arrows__right'),
sliderLength = sliderViewSlides.length;
// sliding function
const slideMe = (sliderViewItems, isActiveItem) => {
// update the classes
isActiveItem.classList.remove('is-active');
sliderViewItems.classList.add('is-active');
// css transform the active slide position
sliderView.setAttribute('style', 'transform:translateX(-' + sliderViewItems.offsetLeft + 'px)');
}
// before sliding function
const beforeSliding = i => {
let isActiveItem = document.querySelector('.ac-slider--view__slides.is-active'),
currentItem = Array.from(sliderViewSlides).indexOf(isActiveItem) + i,
nextItem = currentItem + i,
sliderViewItems = document.querySelector(`.ac-slider--view__slides:nth-child(${nextItem})`);
// if nextItem is bigger than the # of slides
if (nextItem > sliderLength) {
sliderViewItems = document.querySelector('.ac-slider--view__slides:nth-child(1)');
}
// if nextItem is 0
if (nextItem == 0) {
sliderViewItems = document.querySelector(`.ac-slider--view__slides:nth-child(${sliderLength})`);
}
// trigger the sliding method
slideMe(sliderViewItems, isActiveItem);
}
arrowRight.addEventListener('click', () => beforeSliding(1));
arrowLeft.addEventListener('click', () => beforeSliding(0));
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment