| Cỡ chữ:   
<!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);