Reputation: 3903
I have made an simple javascript
image slider which works fine so far, but I need to add some kind of counter, which indicates the number of the current slide and the amount of total slides but I don't know how to solve that.
here is my script:
function imageSlider(){
let sliderElm = document.querySelector(".image-slider");
let sliderImg = sliderElm.querySelectorAll('img');
for(var i = 0; i < sliderImg.length; i++) {
// I GUESS I HAVE TO DO SOME KIND OF LOOP
}
let totalImages = sliderImg.length;
let totalCounter = document.getElementById('totalImages');
totalCounter.innerHTML = totalImages;
document.querySelector('.next').addEventListener('click', onNextClick);
document.querySelector('.prev').addEventListener('click', onPreviousClick);
function onNextClick(e) {
let imgWidth = sliderElm.offsetWidth;
sliderElm.scrollLeft += imgWidth;
}
function onPreviousClick() {
let imgWidth = sliderElm.offsetWidth;
sliderElm.scrollLeft -= imgWidth;
}
}
imageSlider();
the basic html structure is:
<div class="image-slider">
<img src="some/image.png" />
<img src="some/image.png" />
<img src="some/image.png" />
</div>
<div>
<span id="currentImage"> </span> / <span id="totalImages"></span>
</div>
Can someone help me out
Upvotes: 0
Views: 1162
Reputation: 11584
Create a currentImage
variable to track which index you're at. Start it at 0
, and increment or decrement it on each button click. Update the scrollLeft
and the #currentImage
element accordingly.
Other notes,
element.textContent
instead of element.innerHTML
.sliderImgs
)querySelector
instead of getElementById
initializeImageSlider
is clearer than imageSlider
which could mean a number of things.function initializeImageSlider() {
let sliderElm = document.querySelector('.image-slider');
let sliderImgs = sliderElm.querySelectorAll('img');
let currentImage = 0;
let currentCounter = document.getElementById('currentImage');
currentCounter.textContent = currentImage + 1;
let totalImages = sliderImgs.length;
let totalCounter = document.getElementById('totalImages');
totalCounter.textContent = totalImages;
document.querySelector('.next').addEventListener('click', onNextClick);
document.querySelector('.prev').addEventListener('click', onPreviousClick);
function onNextClick() {
scroll(1);
}
function onPreviousClick() {
scroll(-1);
}
function scroll(change) {
currentImage = (currentImage + change + totalImages) % totalImages;
let imgWidth = sliderElm.offsetWidth;
sliderElm.scrollLeft = currentImage * imgWidth;
currentCounter.textContent = currentImage + 1;
}
}
initializeImageSlider();
.image-slider,
img {
width: 300px;
height: 300px;
}
.image-slider {
overflow: hidden;
display: block;
outline: 1px solid;
white-space: nowrap;
}
<div class="image-slider">
<img src="https://image.shutterstock.com/image-photo/mountains-under-mist-morning-amazing-260nw-1725825019.jpg" />
<img src="https://st.depositphotos.com/1428083/2946/i/600/depositphotos_29460297-stock-photo-bird-cage.jpg" />
<img src="https://thumbs.dreamstime.com/b/environment-earth-day-hands-trees-growing-seedlings-bokeh-green-background-female-hand-holding-tree-nature-field-gra-130247647.jpg" />
</div>
<div>
<span id="currentImage"> </span> / <span id="totalImages"></span>
</div>
<button class="prev">prev</button>
<button class="next">next</button>
Upvotes: 1
Reputation: 475
Store your current image index in a variable and edit it on prev/next click handlers
let imageIndex = 1
function setCurrentImageIndex(index) {
imageIndex = index;
document.getElementById('currentImage').innerText = currentIndex;
}
function onNextClick(e) {
let imgWidth = sliderElm.offsetWidth;
sliderElm.scrollLeft += imgWidth;
setCurrentImageIndex(Math.min(totalImages, imageIndex + 1));
}
function onPreviousClick() {
let imgWidth = sliderElm.offsetWidth;
sliderElm.scrollLeft -= imgWidth;
setCurrentImageIndex(Math.max(imageIndex - 1, 1));
}
Upvotes: 1
Reputation: 66
can't u use i as the counter? Because
for(var i = 0; i < sliderImg.length; i++) {
console.log(i) }
then u know the amount of images right? Because i got the value of the length
Upvotes: 0