๐ Carousel: Previous and next buttons
Hereโs the code to show and hide arrow buttons in all three event listeners:
nextButton.addEventListener('click', event => {
// ...
// Shows previous button
previousButton.removeAttribute('hidden')
// Hides next button
if (!nextSlide.nextElementSibling) {
nextButton.setAttribute('hidden', true)
}
})
previousButton.addEventListener('click', event => {
// ...
// Shows next button
nextButton.removeAttribute('hidden')
// Hides previous button
if (!previousSlide.previousElementSibling) {
previousButton.setAttribute('hidden', true)
}
})
dotsContainer.addEventListener('click', event => {
// ...
showHideArrowButtons(clickedDotIndex)
})
The one in dotsContainer
is the shortest and easiest to understand. But can previousButton
and nextButton
's event listener use the same function?
To answer the question, we need to look at showHideArrowButtons
once more.
const showHideArrowButtons = clickedDotIndex => {
if (clickedDotIndex === 0) {
previousButton.setAttribute('hidden', true)
nextButton.removeAttribute('hidden')
} else if (clickedDotIndex === dots.length - 1) {
previousButton.removeAttribute('hidden')
nextButton.setAttribute('hidden', true)
} else {
previousButton.removeAttribute('hidden')
nextButton.removeAttribute('hidden')
}
}
Here, we see showHideArrowButtons
take in a clickedDotIndex
. This clickedDotIndex
does not exist in previousButton
's or nextButton
's event listener.
But we know clickedDotIndex
is the same value as the index of the slide want to move to. We can use showHideArrowButtons
in nextButton
's event listener if we know the index value for nextSlide
.
nextButton.addEventListener('click', event => {
// ...
const nextSlideIndex = slides.findIndex(slide => slide === nextSlide)
showHideArrowButtons(nextSlideIndex)
})
We can also use showHideArrowButtons
in previousButton
's event listener if we know the index value of previousSlide
.
previousButton.addEventListener('click', event => {
// ...
const previousSlideIndex = slides.findIndex(slide => slide === previousSlide)
showHideArrowButtons(previousSlideIndex)
})
Renaming clickedDotIndex
clickedDotIndex
used to be an excellent variable name. Unfortunately, this name doesnโt make sense when we use showHideArrowButtons
in previousButton
and nextButton
's event listener. (They passed in the index of a slide instead).
To make showHideArrowButtons
easier to understand, we can change clickedDotIndex
to targetSlideIndex
. This tiny vocabulary change lets you link up all three event listeners mentally.
const showHideArrowButtons = targetSlideIndex => {
if (targetSlideIndex === 0) {
previousButton.setAttribute('hidden', true)
nextButton.removeAttribute('hidden')
} else if (targetSlideIndex === dots.length - 1) {
previousButton.removeAttribute('hidden')
nextButton.setAttribute('hidden', true)
} else {
previousButton.removeAttribute('hidden')
nextButton.removeAttribute('hidden')
}
}
Using showHideArrowButtons
:
// In next button's event listener
nextButton.addEventListener('click', event => {
// ...
const nextSlideIndex = slides.findIndex(slide => slide === nextSlide)
showHideArrowButtons(nextSlideIndex)
})
// In previous button's event listener
previousButton.addEventListener('click', event => {
// ...
const previousSlideIndex = slides.findIndex(slide => slide === previousSlide)
showHideArrowButtons(previousSlideIndex)
})
// In dotsContainer event listener
dotsContainer.addEventListener('click', event => {
// ...
const targetSlideIndex = dots.findIndex(d => d === dot)
const slideToShow = slides[targetSlideIndex]
showHideArrowButtons(targetSlideIndex)
})