<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="portfolio-container">
<h2>Dự Án Của Tôi</h2>
<!-- Thanh tìm kiếm -->
<div class="search-wrapper">
<input type="text" id="search-input" placeholder="Tìm tên dự án...">
</div>
<!-- Bộ lọc -->
<div id="filter-buttons">
<button class="btn active" data-filter="all">Tất cả</button>
<button class="btn" data-filter="web">Web Design</button>
<button class="btn" data-filter="app">Mobile App</button>
<button class="btn" data-filter="graphic">Graphic Design</button>
</div>
<!-- Lưới hiển thị dự án -->
<div id="project-grid">
<div class="project-card" data-category="web">
<img src="https://picsum.photos/200/150?random=1" alt="Web 1">
<h3 class="project-title">Website Bán Hàng</h3>
</div>
<div class="project-card" data-category="app">
<img src="https://picsum.photos/200/150?random=2" alt="App 1">
<h3 class="project-title">Ứng dụng Giao hàng</h3>
</div>
<div class="project-card" data-category="web">
<img src="https://picsum.photos/200/150?random=3" alt="Web 2">
<h3 class="project-title">Landing Page Sự kiện</h3>
</div>
<div class="project-card" data-category="graphic">
<img src="https://picsum.photos/200/150?random=4" alt="Graphic 1">
<h3 class="project-title">Bộ nhận diện thương hiệu</h3>
</div>
<div class="project-card" data-category="app">
<img src="https://picsum.photos/200/150?random=5" alt="App 2">
<h3 class="project-title">App Quản lý chi tiêu</h3>
</div>
</div>
</div>
<script src="script.js"></script>
</body>
</html>
/* Layout cơ bản */
.portfolio-container {
font-family: Arial, sans-serif;
text-align: center;
padding: 20px;
}
#filter-buttons {
margin-bottom: 30px;
}
.btn {
padding: 10px 20px;
margin: 5px;
cursor: pointer;
border: 1px solid #ddd;
background: white;
transition: 0.3s;
}
.btn.active {
background: #3498db;
color: white;
border-color: #3498db;
}
/* Grid dự án */
#project-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
gap: 20px;
max-width: 1000px;
margin: 0 auto;
}
.project-card {
background: #f9f9f9;
padding: 15px;
border-radius: 8px;
transition: transform 0.3s, opacity 0.3s;
}
.search-wrapper {
margin-bottom: 20px;
}
#search-input {
padding: 12px 20px;
width: 300px;
border: 2px solid #ddd;
border-radius: 25px;
outline: none;
transition: 0.3s;
}
#search-input:focus {
border-color: #3498db;
box-shadow: 0 0 8px rgba(52, 152, 219, 0.3);
}
/* Hiệu ứng mượt khi ẩn hiện */
.project-card {
transition: all 0.4s ease;
}
/* Class để ẩn phần tử */
.hide {
display: none;
opacity: 0;
transform: scale(0.8);
}
const filterButtons = document.querySelectorAll("#filter-buttons .btn");
const projectCards = document.querySelectorAll(".project-card");
const searchInput = document.getElementById("search-input");
// Hàm lọc tổng hợp
function filterProjects() {
const searchText = searchInput.value.toLowerCase(); // Chuyển về chữ thường để so sánh
const activeFilter = document.querySelector(".btn.active").getAttribute("data-filter");
projectCards.forEach(card => {
const cardCategory = card.getAttribute("data-category");
const cardTitle = card.querySelector(".project-title").innerText.toLowerCase();
// Kiểm tra 2 điều kiện
const isMatchCategory = activeFilter === "all" || cardCategory === activeFilter;
const isMatchSearch = cardTitle.includes(searchText);
// Chỉ hiện nếu thỏa mãn CẢ HAI
if (isMatchCategory && isMatchSearch) {
card.classList.remove("hide");
} else {
card.classList.add("hide");
}
});
}
// Sự kiện khi click vào nút bộ lọc
filterButtons.forEach(button => {
button.addEventListener("click", () => {
document.querySelector(".btn.active").classList.remove("active");
button.classList.add("active");
filterProjects(); // Chạy bộ lọc tổng hợp
});
});
// Sự kiện khi gõ vào thanh tìm kiếm
searchInput.addEventListener("input", filterProjects);