Buliding HTML Structure
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Image Gallery 3</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<div class="container">
<div class="card">
<img class="background" src="./assets/01.webp" alt="">
<div class="card-content">
<div class="profile-image">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-gamepad-2">
<line x1="6" x2="10" y1="11" y2="11" />
<line x1="8" x2="8" y1="9" y2="13" />
<line x1="15" x2="15.01" y1="12" y2="12" />
<line x1="18" x2="18.01" y1="10" y2="10" />
<path d="M17.32 5H6.68a4 4 0 0 0-3.978 3.59c-.006.052-.01.101-.017.152C2.604 9.416 2 14.456 2 16a3 3 0 0 0 3 3c1 0 1.5-.5 2-1l1.414-1.414A2 2 0 0 1 9.828 16h4.344a2 2 0 0 1 1.414.586L17 18c.5.5 1 1 2 1a3 3 0 0 0 3-3c0-1.545-.604-6.584-.685-7.258-.007-.05-.011-.1-.017-.151A4 4 0 0 0 17.32 5z" />
</svg>
</div>
<h3 class="title">GTA 6</h3>
</div>
<div class="backdrop"></div>
</div>
<div class="card">
<img class="background" src="./assets/02.jpg" alt="">
<div class="card-content">
<div class="profile-image">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-gamepad-2">
<line x1="6" x2="10" y1="11" y2="11" />
<line x1="8" x2="8" y1="9" y2="13" />
<line x1="15" x2="15.01" y1="12" y2="12" />
<line x1="18" x2="18.01" y1="10" y2="10" />
<path d="M17.32 5H6.68a4 4 0 0 0-3.978 3.59c-.006.052-.01.101-.017.152C2.604 9.416 2 14.456 2 16a3 3 0 0 0 3 3c1 0 1.5-.5 2-1l1.414-1.414A2 2 0 0 1 9.828 16h4.344a2 2 0 0 1 1.414.586L17 18c.5.5 1 1 2 1a3 3 0 0 0 3-3c0-1.545-.604-6.584-.685-7.258-.007-.05-.011-.1-.017-.151A4 4 0 0 0 17.32 5z" />
</svg>
</div>
<h3 class="title">Spider-Man PS5</h3>
</div>
<div class="backdrop"></div>
</div>
<div class="card">
<img class="background" src="./assets/03.jpg" alt="">
<div class="card-content">
<div class="profile-image">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-gamepad-2">
<line x1="6" x2="10" y1="11" y2="11" />
<line x1="8" x2="8" y1="9" y2="13" />
<line x1="15" x2="15.01" y1="12" y2="12" />
<line x1="18" x2="18.01" y1="10" y2="10" />
<path d="M17.32 5H6.68a4 4 0 0 0-3.978 3.59c-.006.052-.01.101-.017.152C2.604 9.416 2 14.456 2 16a3 3 0 0 0 3 3c1 0 1.5-.5 2-1l1.414-1.414A2 2 0 0 1 9.828 16h4.344a2 2 0 0 1 1.414.586L17 18c.5.5 1 1 2 1a3 3 0 0 0 3-3c0-1.545-.604-6.584-.685-7.258-.007-.05-.011-.1-.017-.151A4 4 0 0 0 17.32 5z" />
</svg>
</div>
<h3 class="title">God Of War</h3>
</div>
<div class="backdrop"></div>
</div>
<div class="card">
<img class="background" src="./assets/04.jpg" alt="">
<div class="card-content">
<div class="profile-image">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-gamepad-2">
<line x1="6" x2="10" y1="11" y2="11" />
<line x1="8" x2="8" y1="9" y2="13" />
<line x1="15" x2="15.01" y1="12" y2="12" />
<line x1="18" x2="18.01" y1="10" y2="10" />
<path d="M17.32 5H6.68a4 4 0 0 0-3.978 3.59c-.006.052-.01.101-.017.152C2.604 9.416 2 14.456 2 16a3 3 0 0 0 3 3c1 0 1.5-.5 2-1l1.414-1.414A2 2 0 0 1 9.828 16h4.344a2 2 0 0 1 1.414.586L17 18c.5.5 1 1 2 1a3 3 0 0 0 3-3c0-1.545-.604-6.584-.685-7.258-.007-.05-.011-.1-.017-.151A4 4 0 0 0 17.32 5z" />
</svg>
</div>
<h3 class="title">The Last of Us</h3>
</div>
<div class="backdrop"></div>
</div>
<div class="card">
<img class="background" src="./assets/05.jpg" alt="">
<div class="card-content">
<div class="profile-image">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-gamepad-2">
<line x1="6" x2="10" y1="11" y2="11" />
<line x1="8" x2="8" y1="9" y2="13" />
<line x1="15" x2="15.01" y1="12" y2="12" />
<line x1="18" x2="18.01" y1="10" y2="10" />
<path d="M17.32 5H6.68a4 4 0 0 0-3.978 3.59c-.006.052-.01.101-.017.152C2.604 9.416 2 14.456 2 16a3 3 0 0 0 3 3c1 0 1.5-.5 2-1l1.414-1.414A2 2 0 0 1 9.828 16h4.344a2 2 0 0 1 1.414.586L17 18c.5.5 1 1 2 1a3 3 0 0 0 3-3c0-1.545-.604-6.584-.685-7.258-.007-.05-.011-.1-.017-.151A4 4 0 0 0 17.32 5z" />
</svg>
</div>
<h3 class="title">Elden Ring</h3>
</div>
<div class="backdrop"></div>
</div>
</div>
<script src="script.js" defer></script>
</body>
</html>
Styling CSS
@import url("https://fonts.googleapis.com/css2?family=Inter:wght@400;500&display=swap");
*,
*::before,
*::after {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: Inter, sans-serif;
height: 100vh;
color: white;
background-color: #e9e9f0;
display: flex;
justify-content: center;
align-items: center;
}
img {
width: 100%;
height: 100%;
display: block;
}
.container {
width: 100%;
width: 820px;
height: 340px;
display: flex;
gap: 10px;
margin-inline: 50px;
}
.card {
min-width: 70px;
height: 100%;
border-radius: 30px;
overflow: hidden;
display: flex;
align-items: flex-end;
flex-grow: 1;
cursor: pointer;
position: relative;
transition: flex-grow 0.5s cubic-bezier(0.16, 1, 0.3, 1);
--transition-timing: 0.35s;
}
/* .card.active {
flex-grow: 100;
} */
.card:hover {
flex-grow: 7;
}
.card > .background {
position: absolute;
inset: 0;
object-fit: cover;
object-position: center;
filter: brightness(0.4);
z-index: -1;
transition: var(--transition-timing) ease;
}
.card:hover > .background {
filter: brightness(1);
}
.card > .card-content {
display: flex;
align-items: center;
position: absolute;
left: 10px;
right: 10px;
bottom: 20px;
overflow: hidden;
transition: var(--transition-timing);
z-index: 10;
}
.card:hover > .card-content {
inset: 20px;
top: auto;
}
.card-content > * {
transition: var(--transition-timing);
}
.card-content > .profile-image {
min-width: 50px;
max-width: 50px;
height: 50px;
border: 1px solid white;
display: flex;
justify-content: center;
align-items: center;
border-radius: 50%;
overflow: hidden;
}
.card:hover .profile-image {
border: 1px solid rgb(110, 252, 205);
}
.profile-image > svg {
stroke: #fefefe;
}
.card:hover .profile-image > svg {
stroke: rgb(110, 252, 205);
}
.card-content > .title {
white-space: pre;
margin-left: 10px;
translate: 0 100%;
opacity: 0;
}
.card:hover .title {
opacity: 1;
translate: 0 0;
}
.card > .backdrop {
position: absolute;
left: 0;
right: 0;
bottom: 0;
height: 100px;
z-index: 0;
background: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.7));
}
JavaScript
const cardsContainer = document.querySelector(".container");
cardsContainer.addEventListener("click", (e) => {
const target = e.target.closest(".card");
if (!target) return;
cardsContainer.querySelectorAll(".card").forEach((card) => {
card.classList.remove("active");
});
target.classList.add("active");
});

0 Comments