I am currently working on a photo gallery project and want the background color to change when the user clicks on the forward or back arrow to the next/previous image. I have tried adding another .popup class in the CSS with a new background color but that did not work. Can anyone help? Thanks in advance.
const images = [...document.querySelectorAll('.image')];
const popup = document.querySelector('.popup');
const closeBtn = document.querySelector('.close-btn');
const imageName = document.querySelector('.image-name');
const largeImage = document.querySelector('.large-image');
const imageIndex = document.querySelector('.index');
const leftArrow = document.querySelector('.left-arrow');
const rightArrow = document.querySelector('.right-arrow');
let index = 0;
images.forEach((item, i) => {
item.addEventListener('click', () => setPopupImage(i));
})
const updateImage = (i) => {
let path = `img/img${i+1}.png`;
largeImage.src = path;
imageName.innerHTML = path;
imageIndex.innerHTML = `0${i+1}`;
index = i;
}
closeBtn.addEventListener('click', () => {
popup.classList.toggle('active');
})
leftArrow.addEventListener('click', () => {
if (index > 0) {
updateImage(index - 1);
}
})
rightArrow.addEventListener('click', () => {
if (index < images.length - 1) {
updateImage(index + 1);
}
})
const setPopupImage = index => {
popup.classList.toggle('active');
}
setPopupImage(0);
*{
margin: 0;
padding: 0;
box-sizing: border-box;
}
*:focus{
outline: none;
}
body{
width: 100vw;
height: 100vh;
display: flex;
justify-content: center;
align-items: center;
background: #ff7a2d;
font-family: 'roboto', sans-serif;
}
.gallery{
width: 80%;
height: 90vh;
max-width: 1600px;
max-height: 800px;
display: flex;
flex-wrap: wrap;
justify-content: center;
align-items: center;
}
.gallery-image{
width: 30%;
height: calc(50% - 20px);
min-width: 300px;
min-height: 200px;
margin: 10px;
overflow: hidden;
}
.image{
width: 100%;
height: 100%;
object-fit: cover;
transition: 1s;
}
.popup{
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%) scale(0);
width: 100vw;
height: 100vh;
background: lightgreen;
display: flex;
justify-content: center;
align-items: center;
z-index: 5;
overflow: hidden;
transition: 1s;
opacity: 0;
}
.popup.active{
transform: translate(-50%, -50%) scale(1);
opacity: 1;
}
.popup.active .close-btn,
.popup.active .image-name,
.popup.active .index,
.popup.active .large-image,
.popup.active .arrow-btn{
opacity: 1;
transition: opacity .5s;
transition-delay: 1s;
}
.top-bar{
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 10px;
background: turquoise;
color: #fff;
text-align: center;
line-height: 50px;
font-weight: 300;
}
.image-name{
opacity: 0;
}
.close{
position: absolute;
top: 35px;
right: 70px;
cursor: pointer;
}
.arrow-btn{
opacity: 0;
position: absolute;
top: 50%;
transform: translateY(-50%);
padding: 10px;
border-radius: 50%;
border: none;
background: none;
cursor: pointer;
}
.left-arrow{
left: 10px;
}
.right-arrow{
right: 10px;
transform: translateY(-50%) rotate(180deg);
}
.arrow-btn:hover{
background: rgba(0, 0, 0, 0.5);
}
.index{
position: absolute;
bottom: 10px;
right: 10px;
font-size: 80px;
font-weight: 100;
color: rgba(255, 255, 255, 0.4);
opacity: 0;
}
.large-image{
width: 90%;
height: 90%;
object-fit: contain;
opacity: 0;
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Image Popup</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="popup">
<div class="top-bar">
<p class="image-name">img1.png</p>
<span class="close-btn">
<img src="Graphics/gallery_icon.svg" width="50px" class="close">
</span>
</div>
<button class="arrow-btn left-arrow"><img src="img/arrow.png" alt=""></button>
<button class="arrow-btn right-arrow"><img src="img/arrow.png" alt=""></button>
<img src="img/img1.png" class="large-image" alt="">
<h1 class="index">01</h1>
</div>
<div class="gallery">
<div class="gallery-image">
<img src="img/img1.png" alt="" class="image">
</div>
<div class="gallery-image">
<img src="img/img2.png" alt="" class="image">
</div>
<div class="gallery-image">
<img src="img/img3.png" alt="" class="image">
</div>
<div class="gallery-image">
<img src="img/img4.png" alt="" class="image">
</div>
<div class="gallery-image">
<img src="img/img5.png" alt="" class="image">
</div>
<div class="gallery-image">
<img src="img/img6.png" alt="" class="image">
</div>
</div>
<script src="index.js"></script>
</body>
</html>
2
Answers
Use
getElementsByClassName
on left/right arrow button click event to change background color.Try this
The getElementsByClassName function returns a collection of elements with the specified class name, and it doesn’t have a style property. To change the background color of the popup element using getElementsByClassName, you need to access the specific element from the collection and set its style.background property.
In this code, document.getElementsByClassName(‘popup’) returns a collection of elements with the class name ‘popup’. Since you’re expecting only one element with this class, you can access it using the index [0]. Then, you can set the style.background property of the popup element to "green".
You can use a similar approach for the rightArrow click event as well.