I am currently working on a photo gallery project and want to set a different color background for each image. I have a total of six images and as of now the background for all images is pink. I have tried adding another .popup class(the class containing my images) in the CSS with a new background color but that did not work. I have also tried using getElementsByClassName in the JavaScript to change the color when the user clicks on the left or right arrow, which did change the color form pink to another color. However, it did not allow me to set a color for each background. 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; // will track our current image;
images.forEach((item, i) => {
item.addEventListener('click', () => {
updateImage(i);
popup.classList.toggle('active');
})
})
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: pink;
display: flex;
justify-content: center;
align-items: center;
z-index: 5;
overflow: hidden;
transition: 1s;
opacity: 0;
}
.bk{
width: 100vw;
height: 100vh;
background: brown;
}
.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 class="bk"
></div>
</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
You have to use the selector
:nth-child(n)
in the CSS file. Here’s a link for better explanation.If this is not what you’re looking for, let me know. I’ll be happy to help.
When you click on a photo and it opens in a popup modal, the background of the modal will be different each time. When you click the left or right arrow the background color will change again.
In your JS code I add this line
The function
randomBackgroundColor()
sets a different color to the background of the popup element.I hope I have been helpful
Example: